annotate src/share/vm/prims/jni.cpp @ 3249:e1162778c1c8

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author johnc
date Thu, 07 Apr 2011 09:53:20 -0700
parents c7f3d0b4570f
children be4ca325525a 04760e41b01e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
26 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
27 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
28 #include "classfile/symbolTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
29 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
30 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
31 #include "interpreter/linkResolver.hpp"
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
32 #ifndef SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
33 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
34 #endif // SERIALGC
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
35 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
36 #include "memory/gcLocker.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
37 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
38 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
39 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
40 #include "oops/instanceOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
41 #include "oops/markOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
42 #include "oops/methodOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
43 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
44 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
45 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
46 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
47 #include "oops/typeArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
48 #include "oops/typeArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
49 #include "prims/jni.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
50 #include "prims/jniCheck.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
51 #include "prims/jniFastGetField.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
52 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
53 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
54 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
55 #include "prims/jvmtiThreadState.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
56 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
57 #include "runtime/fieldDescriptor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
58 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
59 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
60 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
61 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
62 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
63 #include "runtime/jfieldIDWorkaround.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
64 #include "runtime/reflection.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
65 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
66 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
67 #include "runtime/vm_operations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
68 #include "services/runtimeService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
69 #include "utilities/defaultStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
70 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
71 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
72 #include "utilities/histogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
73 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
74 # include "jniTypes_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
75 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
76 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
77 # include "jniTypes_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
78 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
79 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
80 # include "jniTypes_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
81 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
82 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
83 # include "os_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
84 # include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
85 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
86 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
87 # include "os_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
88 # include "thread_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
89 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
90 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
91 # include "os_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
92 # include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
93 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 static jint CurrentVersion = JNI_VERSION_1_6;
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // The DT_RETURN_MARK macros create a scoped object to fire the dtrace
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // '-return' probe regardless of the return path is taken out of the function.
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Methods that have multiple return paths use this to avoid having to
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // instrument each return path. Methods that use CHECK or THROW must use this
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // since those macros can cause an immedate uninstrumented return.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 //
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // In order to get the return value, a reference to the variable containing
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // the return value must be passed to the contructor of the object, and
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // the return value must be set before return (since the mark object has
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // a reference to it).
a61af66fc99e Initial load
duke
parents:
diff changeset
108 //
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Example:
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // DT_RETURN_MARK_DECL(SomeFunc, int);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // JNI_ENTRY(int, SomeFunc, ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // int return_value = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // DT_RETURN_MARK(SomeFunc, int, (const int&)return_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // foo(CHECK_0)
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // return_value = 5;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // return return_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
118 #define DT_RETURN_MARK_DECL(name, type) \
a61af66fc99e Initial load
duke
parents:
diff changeset
119 HS_DTRACE_PROBE_DECL1(hotspot_jni, name##__return, type); \
a61af66fc99e Initial load
duke
parents:
diff changeset
120 DTRACE_ONLY( \
a61af66fc99e Initial load
duke
parents:
diff changeset
121 class DTraceReturnProbeMark_##name { \
a61af66fc99e Initial load
duke
parents:
diff changeset
122 public: \
a61af66fc99e Initial load
duke
parents:
diff changeset
123 const type& _ret_ref; \
a61af66fc99e Initial load
duke
parents:
diff changeset
124 DTraceReturnProbeMark_##name(const type& v) : _ret_ref(v) {} \
a61af66fc99e Initial load
duke
parents:
diff changeset
125 ~DTraceReturnProbeMark_##name() { \
a61af66fc99e Initial load
duke
parents:
diff changeset
126 HS_DTRACE_PROBE1(hotspot_jni, name##__return, _ret_ref); \
a61af66fc99e Initial load
duke
parents:
diff changeset
127 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
128 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
129 )
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Void functions are simpler since there's no return value
a61af66fc99e Initial load
duke
parents:
diff changeset
131 #define DT_VOID_RETURN_MARK_DECL(name) \
a61af66fc99e Initial load
duke
parents:
diff changeset
132 HS_DTRACE_PROBE_DECL0(hotspot_jni, name##__return); \
a61af66fc99e Initial load
duke
parents:
diff changeset
133 DTRACE_ONLY( \
a61af66fc99e Initial load
duke
parents:
diff changeset
134 class DTraceReturnProbeMark_##name { \
a61af66fc99e Initial load
duke
parents:
diff changeset
135 public: \
a61af66fc99e Initial load
duke
parents:
diff changeset
136 ~DTraceReturnProbeMark_##name() { \
a61af66fc99e Initial load
duke
parents:
diff changeset
137 HS_DTRACE_PROBE0(hotspot_jni, name##__return); \
a61af66fc99e Initial load
duke
parents:
diff changeset
138 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
139 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
140 )
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Place these macros in the function to mark the return. Non-void
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // functions need the type and address of the return value.
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #define DT_RETURN_MARK(name, type, ref) \
a61af66fc99e Initial load
duke
parents:
diff changeset
146 DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark(ref) )
a61af66fc99e Initial load
duke
parents:
diff changeset
147 #define DT_VOID_RETURN_MARK(name) \
a61af66fc99e Initial load
duke
parents:
diff changeset
148 DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark )
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Use these to select distinct code for floating-point vs. non-floating point
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // situations. Used from within common macros where we need slightly
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // different behavior for Float/Double
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #define FP_SELECT_Boolean(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
155 #define FP_SELECT_Byte(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
156 #define FP_SELECT_Char(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
157 #define FP_SELECT_Short(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
158 #define FP_SELECT_Object(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
159 #define FP_SELECT_Int(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
160 #define FP_SELECT_Long(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
161 #define FP_SELECT_Float(intcode, fpcode) fpcode
a61af66fc99e Initial load
duke
parents:
diff changeset
162 #define FP_SELECT_Double(intcode, fpcode) fpcode
a61af66fc99e Initial load
duke
parents:
diff changeset
163 #define FP_SELECT(TypeName, intcode, fpcode) \
a61af66fc99e Initial load
duke
parents:
diff changeset
164 FP_SELECT_##TypeName(intcode, fpcode)
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 #define COMMA ,
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Choose DT_RETURN_MARK macros based on the type: float/double -> void
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // (dtrace doesn't do FP yet)
a61af66fc99e Initial load
duke
parents:
diff changeset
170 #define DT_RETURN_MARK_DECL_FOR(TypeName, name, type) \
a61af66fc99e Initial load
duke
parents:
diff changeset
171 FP_SELECT(TypeName, \
a61af66fc99e Initial load
duke
parents:
diff changeset
172 DT_RETURN_MARK_DECL(name, type), DT_VOID_RETURN_MARK_DECL(name) )
a61af66fc99e Initial load
duke
parents:
diff changeset
173 #define DT_RETURN_MARK_FOR(TypeName, name, type, ref) \
a61af66fc99e Initial load
duke
parents:
diff changeset
174 FP_SELECT(TypeName, \
a61af66fc99e Initial load
duke
parents:
diff changeset
175 DT_RETURN_MARK(name, type, ref), DT_VOID_RETURN_MARK(name) )
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // out-of-line helpers for class jfieldIDWorkaround:
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 bool jfieldIDWorkaround::is_valid_jfieldID(klassOop k, jfieldID id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 if (jfieldIDWorkaround::is_instance_jfieldID(k, id)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 uintptr_t as_uint = (uintptr_t) id;
a61af66fc99e Initial load
duke
parents:
diff changeset
183 intptr_t offset = raw_instance_offset(id);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 if (is_checked_jfieldID(id)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 if (!klass_hash_ok(k, id)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 return instanceKlass::cast(k)->contains_field_offset(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 JNIid* result = (JNIid*) id;
a61af66fc99e Initial load
duke
parents:
diff changeset
192 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
193 return result != NULL && result->is_static_field_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
194 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
195 return result != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 intptr_t jfieldIDWorkaround::encode_klass_hash(klassOop k, intptr_t offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 if (offset <= small_offset_mask) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 klassOop field_klass = k;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 klassOop super_klass = Klass::cast(field_klass)->super();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
205 // With compressed oops the most super class with nonstatic fields would
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
206 // be the owner of fields embedded in the header.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
207 while (instanceKlass::cast(super_klass)->has_nonstatic_fields() &&
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
208 instanceKlass::cast(super_klass)->contains_field_offset(offset)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
209 field_klass = super_klass; // super contains the field also
a61af66fc99e Initial load
duke
parents:
diff changeset
210 super_klass = Klass::cast(field_klass)->super();
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 debug_only(No_Safepoint_Verifier nosafepoint;)
a61af66fc99e Initial load
duke
parents:
diff changeset
213 uintptr_t klass_hash = field_klass->identity_hash();
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return ((klass_hash & klass_mask) << klass_shift) | checked_mask_in_place;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 #if 0
a61af66fc99e Initial load
duke
parents:
diff changeset
217 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
218 {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 warning("VerifyJNIFields: long offset %d in %s", offset, Klass::cast(k)->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
223 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
224 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 bool jfieldIDWorkaround::klass_hash_ok(klassOop k, jfieldID id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 uintptr_t as_uint = (uintptr_t) id;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 intptr_t klass_hash = (as_uint >> klass_shift) & klass_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 debug_only(No_Safepoint_Verifier nosafepoint;)
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Could use a non-blocking query for identity_hash here...
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if ((k->identity_hash() & klass_mask) == klass_hash)
a61af66fc99e Initial load
duke
parents:
diff changeset
235 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
236 k = Klass::cast(k)->super();
a61af66fc99e Initial load
duke
parents:
diff changeset
237 } while (k != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 void jfieldIDWorkaround::verify_instance_jfieldID(klassOop k, jfieldID id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 guarantee(jfieldIDWorkaround::is_instance_jfieldID(k, id), "must be an instance field" );
a61af66fc99e Initial load
duke
parents:
diff changeset
243 uintptr_t as_uint = (uintptr_t) id;
a61af66fc99e Initial load
duke
parents:
diff changeset
244 intptr_t offset = raw_instance_offset(id);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 if (VerifyJNIFields) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (is_checked_jfieldID(id)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 guarantee(klass_hash_ok(k, id),
a61af66fc99e Initial load
duke
parents:
diff changeset
248 "Bug in native code: jfieldID class must match object");
a61af66fc99e Initial load
duke
parents:
diff changeset
249 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 #if 0
a61af66fc99e Initial load
duke
parents:
diff changeset
251 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
252 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 warning("VerifyJNIFields: unverified offset %d for %s", offset, Klass::cast(k)->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
257 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 guarantee(instanceKlass::cast(k)->contains_field_offset(offset),
a61af66fc99e Initial load
duke
parents:
diff changeset
261 "Bug in native code: jfieldID offset must address interior of object");
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // Pick a reasonable higher bound for local capacity requested
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // for EnsureLocalCapacity and PushLocalFrame. We don't want it too
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // high because a test (or very unusual application) may try to allocate
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // that many handles and run out of swap space. An implementation is
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // permitted to allocate more handles than the ensured capacity, so this
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // value is set high enough to prevent compatibility problems.
a61af66fc99e Initial load
duke
parents:
diff changeset
270 const int MAX_REASONABLE_LOCAL_CAPACITY = 4*K;
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Wrapper to trace JNI functions
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
276 Histogram* JNIHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 static volatile jint JNIHistogram_lock = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 class JNITraceWrapper : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
281 JNITraceWrapper(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (TraceJNICalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 tty->print("JNI ");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 tty->vprint_cr(format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
287 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 };
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 class JNIHistogramElement : public HistogramElement {
a61af66fc99e Initial load
duke
parents:
diff changeset
293 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
294 JNIHistogramElement(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 };
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 JNIHistogramElement::JNIHistogramElement(const char* elementName) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 _name = elementName;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 uintx count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 while (Atomic::cmpxchg(1, &JNIHistogram_lock, 0) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 while (OrderAccess::load_acquire(&JNIHistogram_lock) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 count +=1;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 if ( (WarnOnStalledSpinLock > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
305 && (count % WarnOnStalledSpinLock == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 warning("JNIHistogram_lock seems to be stalled");
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 if(JNIHistogram == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
313 JNIHistogram = new Histogram("JNI Call Counts",100);
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 JNIHistogram->add_element(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
316 Atomic::dec(&JNIHistogram_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 #define JNICountWrapper(arg) \
a61af66fc99e Initial load
duke
parents:
diff changeset
320 static JNIHistogramElement* e = new JNIHistogramElement(arg); \
a61af66fc99e Initial load
duke
parents:
diff changeset
321 /* There is a MT-race condition in VC++. So we need to make sure that that e has been initialized */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
322 if (e != NULL) e->increment_count()
a61af66fc99e Initial load
duke
parents:
diff changeset
323 #define JNIWrapper(arg) JNICountWrapper(arg); JNITraceWrapper(arg)
a61af66fc99e Initial load
duke
parents:
diff changeset
324 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
325 #define JNIWrapper(arg)
a61af66fc99e Initial load
duke
parents:
diff changeset
326 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // Implementation of JNI entries
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 DT_RETURN_MARK_DECL(DefineClass, jclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
334 const jbyte *buf, jsize bufLen))
a61af66fc99e Initial load
duke
parents:
diff changeset
335 JNIWrapper("DefineClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 DTRACE_PROBE5(hotspot_jni, DefineClass__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
338 env, name, loaderRef, buf, bufLen);
a61af66fc99e Initial load
duke
parents:
diff changeset
339 jclass cls = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
340 DT_RETURN_MARK(DefineClass, jclass, (const jclass&)cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // Since exceptions can be thrown, class initialization can take place
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // if name is NULL no check for class name in .class stream has to be made.
a61af66fc99e Initial load
duke
parents:
diff changeset
344 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 const int str_len = (int)strlen(name);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
346 if (str_len > Symbol::max_length()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
349 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
352 TempNewSymbol class_name = SymbolTable::new_symbol(name, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
355 ClassFileStream st((u1*) buf, bufLen, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
356 Handle class_loader (THREAD, JNIHandles::resolve(loaderRef));
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if (UsePerfData && !class_loader.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // check whether the current caller thread holds the lock or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // If not, increment the corresponding counter
a61af66fc99e Initial load
duke
parents:
diff changeset
361 if (ObjectSynchronizer::
a61af66fc99e Initial load
duke
parents:
diff changeset
362 query_lock_ownership((JavaThread*)THREAD, class_loader) !=
a61af66fc99e Initial load
duke
parents:
diff changeset
363 ObjectSynchronizer::owner_self) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 ClassLoader::sync_JNIDefineClassLockFreeCounter()->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367 klassOop k = SystemDictionary::resolve_from_stream(class_name, class_loader,
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 657
diff changeset
368 Handle(), &st, true,
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 657
diff changeset
369 CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
370
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
371 if (TraceClassResolution && k != NULL) {
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
372 trace_class_resolution(k);
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
373 }
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
374
0
a61af66fc99e Initial load
duke
parents:
diff changeset
375 cls = (jclass)JNIHandles::make_local(
a61af66fc99e Initial load
duke
parents:
diff changeset
376 env, Klass::cast(k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
377 return cls;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 static bool first_time_FindClass = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 DT_RETURN_MARK_DECL(FindClass, jclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name))
a61af66fc99e Initial load
duke
parents:
diff changeset
387 JNIWrapper("FindClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
388 DTRACE_PROBE2(hotspot_jni, FindClass__entry, env, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 jclass result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
391 DT_RETURN_MARK(FindClass, jclass, (const jclass&)result);
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // Remember if we are the first invocation of jni_FindClass
a61af66fc99e Initial load
duke
parents:
diff changeset
394 bool first_time = first_time_FindClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 first_time_FindClass = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Sanity check the name: it cannot be null or larger than the maximum size
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // name we can fit in the constant pool.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
399 if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
400 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 //%note jni_3
a61af66fc99e Initial load
duke
parents:
diff changeset
404 Handle loader;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 Handle protection_domain;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // Find calling class
a61af66fc99e Initial load
duke
parents:
diff changeset
407 instanceKlassHandle k (THREAD, thread->security_get_caller_class(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
408 if (k.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
409 loader = Handle(THREAD, k->class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Special handling to make sure JNI_OnLoad and JNI_OnUnload are executed
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // in the correct class context.
a61af66fc99e Initial load
duke
parents:
diff changeset
412 if (loader.is_null() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
413 k->name() == vmSymbols::java_lang_ClassLoader_NativeLibrary()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
414 JavaValue result(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 JavaCalls::call_static(&result, k,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
416 vmSymbols::getFromClass_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
417 vmSymbols::void_class_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
418 thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 Handle ex(thread, thread->pending_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
421 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 THROW_HANDLE_0(ex);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 oop mirror = (oop) result.get_jobject();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 loader = Handle(THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
426 instanceKlass::cast(java_lang_Class::as_klassOop(mirror))->class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
427 protection_domain = Handle(THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
428 instanceKlass::cast(java_lang_Class::as_klassOop(mirror))->protection_domain());
a61af66fc99e Initial load
duke
parents:
diff changeset
429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
430 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // We call ClassLoader.getSystemClassLoader to obtain the system class loader.
a61af66fc99e Initial load
duke
parents:
diff changeset
432 loader = Handle(THREAD, SystemDictionary::java_system_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
435 TempNewSymbol sym = SymbolTable::new_symbol(name, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
436 result = find_class_from_class_loader(env, sym, true, loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
437 protection_domain, true, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
438
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
439 if (TraceClassResolution && result != NULL) {
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
440 trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
441 }
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
442
0
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // If we were the first invocation of jni_FindClass, we enable compilation again
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // rather than just allowing invocation counter to overflow and decay.
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // Controlled by flag DelayCompilationDuringStartup.
a61af66fc99e Initial load
duke
parents:
diff changeset
446 if (first_time && !CompileTheWorld)
a61af66fc99e Initial load
duke
parents:
diff changeset
447 CompilationPolicy::completed_vm_startup();
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
450 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
451
a61af66fc99e Initial load
duke
parents:
diff changeset
452 DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 JNI_ENTRY(jmethodID, jni_FromReflectedMethod(JNIEnv *env, jobject method))
a61af66fc99e Initial load
duke
parents:
diff changeset
455 JNIWrapper("FromReflectedMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
456 DTRACE_PROBE2(hotspot_jni, FromReflectedMethod__entry, env, method);
a61af66fc99e Initial load
duke
parents:
diff changeset
457 jmethodID ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
458 DT_RETURN_MARK(FromReflectedMethod, jmethodID, (const jmethodID&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // method is a handle to a java.lang.reflect.Method object
a61af66fc99e Initial load
duke
parents:
diff changeset
461 oop reflected = JNIHandles::resolve_non_null(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 oop mirror = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 int slot = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
464
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
465 if (reflected->klass() == SystemDictionary::reflect_Constructor_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
466 mirror = java_lang_reflect_Constructor::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
467 slot = java_lang_reflect_Constructor::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
468 } else {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
469 assert(reflected->klass() == SystemDictionary::reflect_Method_klass(), "wrong type");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
470 mirror = java_lang_reflect_Method::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 slot = java_lang_reflect_Method::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473 klassOop k = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 KlassHandle k1(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // Make sure class is initialized before handing id's out to methods
a61af66fc99e Initial load
duke
parents:
diff changeset
477 Klass::cast(k1())->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
478 methodOop m = instanceKlass::cast(k1())->method_with_idnum(slot);
a61af66fc99e Initial load
duke
parents:
diff changeset
479 ret = m==NULL? NULL : m->jmethod_id(); // return NULL if reflected method deleted
a61af66fc99e Initial load
duke
parents:
diff changeset
480 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 DT_RETURN_MARK_DECL(FromReflectedField, jfieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 JNI_ENTRY(jfieldID, jni_FromReflectedField(JNIEnv *env, jobject field))
a61af66fc99e Initial load
duke
parents:
diff changeset
486 JNIWrapper("FromReflectedField");
a61af66fc99e Initial load
duke
parents:
diff changeset
487 DTRACE_PROBE2(hotspot_jni, FromReflectedField__entry, env, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
488 jfieldID ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 DT_RETURN_MARK(FromReflectedField, jfieldID, (const jfieldID&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // field is a handle to a java.lang.reflect.Field object
a61af66fc99e Initial load
duke
parents:
diff changeset
492 oop reflected = JNIHandles::resolve_non_null(field);
a61af66fc99e Initial load
duke
parents:
diff changeset
493 oop mirror = java_lang_reflect_Field::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 klassOop k = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 int slot = java_lang_reflect_Field::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
496 int modifiers = java_lang_reflect_Field::modifiers(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 KlassHandle k1(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // Make sure class is initialized before handing id's out to fields
a61af66fc99e Initial load
duke
parents:
diff changeset
500 Klass::cast(k1())->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // First check if this is a static field
a61af66fc99e Initial load
duke
parents:
diff changeset
503 if (modifiers & JVM_ACC_STATIC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 intptr_t offset = instanceKlass::cast(k1())->offset_from_fields( slot );
a61af66fc99e Initial load
duke
parents:
diff changeset
505 JNIid* id = instanceKlass::cast(k1())->jni_id_for(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 assert(id != NULL, "corrupt Field object");
a61af66fc99e Initial load
duke
parents:
diff changeset
507 debug_only(id->set_is_static_field_id();)
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the klassOop
a61af66fc99e Initial load
duke
parents:
diff changeset
509 ret = jfieldIDWorkaround::to_static_jfieldID(id);
a61af66fc99e Initial load
duke
parents:
diff changeset
510 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
511 }
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // The slot is the index of the field description in the field-array
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // The jfieldID is the offset of the field within the object
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // It may also have hash bits for k, if VerifyJNIFields is turned on.
a61af66fc99e Initial load
duke
parents:
diff changeset
516 intptr_t offset = instanceKlass::cast(k1())->offset_from_fields( slot );
a61af66fc99e Initial load
duke
parents:
diff changeset
517 assert(instanceKlass::cast(k1())->contains_field_offset(offset), "stay within object");
a61af66fc99e Initial load
duke
parents:
diff changeset
518 ret = jfieldIDWorkaround::to_instance_jfieldID(k1(), offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 DT_RETURN_MARK_DECL(ToReflectedMethod, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 JNI_ENTRY(jobject, jni_ToReflectedMethod(JNIEnv *env, jclass cls, jmethodID method_id, jboolean isStatic))
a61af66fc99e Initial load
duke
parents:
diff changeset
525 JNIWrapper("ToReflectedMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
526 DTRACE_PROBE4(hotspot_jni, ToReflectedMethod__entry, env, cls, method_id, isStatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
527 jobject ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
528 DT_RETURN_MARK(ToReflectedMethod, jobject, (const jobject&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 methodHandle m (THREAD, JNIHandles::resolve_jmethod_id(method_id));
a61af66fc99e Initial load
duke
parents:
diff changeset
531 assert(m->is_static() == (isStatic != 0), "jni_ToReflectedMethod access flags doesn't match");
a61af66fc99e Initial load
duke
parents:
diff changeset
532 oop reflection_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
533 if (m->is_initializer()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
534 reflection_method = Reflection::new_constructor(m, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 reflection_method = Reflection::new_method(m, UseNewReflection, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 ret = JNIHandles::make_local(env, reflection_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
540 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 DT_RETURN_MARK_DECL(GetSuperclass, jclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 JNI_ENTRY(jclass, jni_GetSuperclass(JNIEnv *env, jclass sub))
a61af66fc99e Initial load
duke
parents:
diff changeset
545 JNIWrapper("GetSuperclass");
a61af66fc99e Initial load
duke
parents:
diff changeset
546 DTRACE_PROBE2(hotspot_jni, GetSuperclass__entry, env, sub);
a61af66fc99e Initial load
duke
parents:
diff changeset
547 jclass obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 DT_RETURN_MARK(GetSuperclass, jclass, (const jclass&)obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550 oop mirror = JNIHandles::resolve_non_null(sub);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // primitive classes return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
552 if (java_lang_Class::is_primitive(mirror)) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // Rules of Class.getSuperClass as implemented by KLass::java_super:
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // arrays return Object
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // interfaces return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // proper classes return Klass::super()
a61af66fc99e Initial load
duke
parents:
diff changeset
558 klassOop k = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
559 if (Klass::cast(k)->is_interface()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // return mirror for superclass
a61af66fc99e Initial load
duke
parents:
diff changeset
562 klassOop super = Klass::cast(k)->java_super();
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // super2 is the value computed by the compiler's getSuperClass intrinsic:
a61af66fc99e Initial load
duke
parents:
diff changeset
564 debug_only(klassOop super2 = ( Klass::cast(k)->oop_is_javaArray()
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
565 ? SystemDictionary::Object_klass()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
566 : Klass::cast(k)->super() ) );
a61af66fc99e Initial load
duke
parents:
diff changeset
567 assert(super == super2,
a61af66fc99e Initial load
duke
parents:
diff changeset
568 "java_super computation depends on interface, array, other super");
a61af66fc99e Initial load
duke
parents:
diff changeset
569 obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(Klass::cast(super)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
570 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
571 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super))
a61af66fc99e Initial load
duke
parents:
diff changeset
574 JNIWrapper("IsSubclassOf");
a61af66fc99e Initial load
duke
parents:
diff changeset
575 DTRACE_PROBE3(hotspot_jni, IsAssignableFrom__entry, env, sub, super);
a61af66fc99e Initial load
duke
parents:
diff changeset
576 oop sub_mirror = JNIHandles::resolve_non_null(sub);
a61af66fc99e Initial load
duke
parents:
diff changeset
577 oop super_mirror = JNIHandles::resolve_non_null(super);
a61af66fc99e Initial load
duke
parents:
diff changeset
578 if (java_lang_Class::is_primitive(sub_mirror) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
579 java_lang_Class::is_primitive(super_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 jboolean ret = (sub_mirror == super_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
581 DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
582 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
584 klassOop sub_klass = java_lang_Class::as_klassOop(sub_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 klassOop super_klass = java_lang_Class::as_klassOop(super_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
586 assert(sub_klass != NULL && super_klass != NULL, "invalid arguments to jni_IsAssignableFrom");
a61af66fc99e Initial load
duke
parents:
diff changeset
587 jboolean ret = Klass::cast(sub_klass)->is_subtype_of(super_klass) ?
a61af66fc99e Initial load
duke
parents:
diff changeset
588 JNI_TRUE : JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
589 DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
590 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
591 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
592
a61af66fc99e Initial load
duke
parents:
diff changeset
593 DT_RETURN_MARK_DECL(Throw, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 JNI_ENTRY(jint, jni_Throw(JNIEnv *env, jthrowable obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
596 JNIWrapper("Throw");
a61af66fc99e Initial load
duke
parents:
diff changeset
597 DTRACE_PROBE2(hotspot_jni, Throw__entry, env, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 jint ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
599 DT_RETURN_MARK(Throw, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 THROW_OOP_(JNIHandles::resolve(obj), JNI_OK);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
603 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 DT_RETURN_MARK_DECL(ThrowNew, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607 JNI_ENTRY(jint, jni_ThrowNew(JNIEnv *env, jclass clazz, const char *message))
a61af66fc99e Initial load
duke
parents:
diff changeset
608 JNIWrapper("ThrowNew");
a61af66fc99e Initial load
duke
parents:
diff changeset
609 DTRACE_PROBE3(hotspot_jni, ThrowNew__entry, env, clazz, message);
a61af66fc99e Initial load
duke
parents:
diff changeset
610 jint ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
611 DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 instanceKlass* k = instanceKlass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
614 Symbol* name = k->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
615 Handle class_loader (THREAD, k->class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
616 Handle protection_domain (THREAD, k->protection_domain());
a61af66fc99e Initial load
duke
parents:
diff changeset
617 THROW_MSG_LOADER_(name, (char *)message, class_loader, protection_domain, JNI_OK);
a61af66fc99e Initial load
duke
parents:
diff changeset
618 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
619 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // JNI functions only transform a pending async exception to a synchronous
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // exception in ExceptionOccurred and ExceptionCheck calls, since
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // delivering an async exception in other places won't change the native
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // code's control flow and would be harmful when native code further calls
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // JNI functions with a pending exception. Async exception is also checked
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // during the call, so ExceptionOccurred/ExceptionCheck won't return
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // false but deliver the async exception at the very end during
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // state transition.
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 static void jni_check_async_exceptions(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
632 assert(thread == Thread::current(), "must be itself");
a61af66fc99e Initial load
duke
parents:
diff changeset
633 thread->check_and_handle_async_exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 JNI_ENTRY_NO_PRESERVE(jthrowable, jni_ExceptionOccurred(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
637 JNIWrapper("ExceptionOccurred");
a61af66fc99e Initial load
duke
parents:
diff changeset
638 DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__entry, env);
a61af66fc99e Initial load
duke
parents:
diff changeset
639 jni_check_async_exceptions(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
640 oop exception = thread->pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
641 jthrowable ret = (jthrowable) JNIHandles::make_local(env, exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
642 DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
643 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
644 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646
a61af66fc99e Initial load
duke
parents:
diff changeset
647 JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionDescribe(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
648 JNIWrapper("ExceptionDescribe");
a61af66fc99e Initial load
duke
parents:
diff changeset
649 DTRACE_PROBE1(hotspot_jni, ExceptionDescribe__entry, env);
a61af66fc99e Initial load
duke
parents:
diff changeset
650 if (thread->has_pending_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
651 Handle ex(thread, thread->pending_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
652 thread->clear_pending_exception();
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
653 if (ex->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // Don't print anything if we are being killed.
a61af66fc99e Initial load
duke
parents:
diff changeset
655 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 jio_fprintf(defaultStream::error_stream(), "Exception ");
a61af66fc99e Initial load
duke
parents:
diff changeset
657 if (thread != NULL && thread->threadObj() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
659 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
660 "in thread \"%s\" ", thread->get_thread_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
662 if (ex->is_a(SystemDictionary::Throwable_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
664 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
665 ex,
a61af66fc99e Initial load
duke
parents:
diff changeset
666 KlassHandle(THREAD,
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
667 SystemDictionary::Throwable_klass()),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
668 vmSymbols::printStackTrace_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
669 vmSymbols::void_method_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // If an exception is thrown in the call it gets thrown away. Not much
a61af66fc99e Initial load
duke
parents:
diff changeset
672 // we can do with it. The native code that calls this, does not check
a61af66fc99e Initial load
duke
parents:
diff changeset
673 // for the exception - hence, it might still be in the thread when DestroyVM gets
a61af66fc99e Initial load
duke
parents:
diff changeset
674 // called, potentially causing a few asserts to trigger - since no pending exception
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // is expected.
a61af66fc99e Initial load
duke
parents:
diff changeset
676 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
677 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
678 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
680 ". Uncaught exception of type %s.",
a61af66fc99e Initial load
duke
parents:
diff changeset
681 Klass::cast(ex->klass())->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685 DTRACE_PROBE(hotspot_jni, ExceptionDescribe__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
686 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688
a61af66fc99e Initial load
duke
parents:
diff changeset
689 JNI_QUICK_ENTRY(void, jni_ExceptionClear(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
690 JNIWrapper("ExceptionClear");
a61af66fc99e Initial load
duke
parents:
diff changeset
691 DTRACE_PROBE1(hotspot_jni, ExceptionClear__entry, env);
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // The jni code might be using this API to clear java thrown exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // So just mark jvmti thread exception state as exception caught.
a61af66fc99e Initial load
duke
parents:
diff changeset
695 JvmtiThreadState *state = JavaThread::current()->jvmti_thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
696 if (state != NULL && state->is_exception_detected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
697 state->set_exception_caught();
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699 thread->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
700 DTRACE_PROBE(hotspot_jni, ExceptionClear__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
701 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 JNI_ENTRY(void, jni_FatalError(JNIEnv *env, const char *msg))
a61af66fc99e Initial load
duke
parents:
diff changeset
705 JNIWrapper("FatalError");
a61af66fc99e Initial load
duke
parents:
diff changeset
706 DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
707 tty->print_cr("FATAL ERROR in native method: %s", msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
708 thread->print_stack();
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 113
diff changeset
709 os::abort(); // Dump core and abort
0
a61af66fc99e Initial load
duke
parents:
diff changeset
710 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 JNI_ENTRY(jint, jni_PushLocalFrame(JNIEnv *env, jint capacity))
a61af66fc99e Initial load
duke
parents:
diff changeset
714 JNIWrapper("PushLocalFrame");
a61af66fc99e Initial load
duke
parents:
diff changeset
715 DTRACE_PROBE2(hotspot_jni, PushLocalFrame__entry, env, capacity);
a61af66fc99e Initial load
duke
parents:
diff changeset
716 //%note jni_11
a61af66fc99e Initial load
duke
parents:
diff changeset
717 if (capacity < 0 && capacity > MAX_REASONABLE_LOCAL_CAPACITY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, JNI_ERR);
a61af66fc99e Initial load
duke
parents:
diff changeset
719 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
721 JNIHandleBlock* old_handles = thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
722 JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
723 assert(new_handles != NULL, "should not be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
724 new_handles->set_pop_frame_link(old_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
725 thread->set_active_handles(new_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
726 jint ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
727 DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
729 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 JNI_ENTRY(jobject, jni_PopLocalFrame(JNIEnv *env, jobject result))
a61af66fc99e Initial load
duke
parents:
diff changeset
733 JNIWrapper("PopLocalFrame");
a61af66fc99e Initial load
duke
parents:
diff changeset
734 DTRACE_PROBE2(hotspot_jni, PopLocalFrame__entry, env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
735 //%note jni_11
a61af66fc99e Initial load
duke
parents:
diff changeset
736 Handle result_handle(thread, JNIHandles::resolve(result));
a61af66fc99e Initial load
duke
parents:
diff changeset
737 JNIHandleBlock* old_handles = thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
738 JNIHandleBlock* new_handles = old_handles->pop_frame_link();
a61af66fc99e Initial load
duke
parents:
diff changeset
739 if (new_handles != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // As a sanity check we only release the handle blocks if the pop_frame_link is not NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
741 // This way code will still work if PopLocalFrame is called without a corresponding
a61af66fc99e Initial load
duke
parents:
diff changeset
742 // PushLocalFrame call. Note that we set the pop_frame_link to NULL explicitly, otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
743 // the release_block call will release the blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
744 thread->set_active_handles(new_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
745 old_handles->set_pop_frame_link(NULL); // clear link we won't release new_handles below
a61af66fc99e Initial load
duke
parents:
diff changeset
746 JNIHandleBlock::release_block(old_handles, thread); // may block
a61af66fc99e Initial load
duke
parents:
diff changeset
747 result = JNIHandles::make_local(thread, result_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
748 }
a61af66fc99e Initial load
duke
parents:
diff changeset
749 DTRACE_PROBE1(hotspot_jni, PopLocalFrame__return, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
750 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
751 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 JNI_ENTRY(jobject, jni_NewGlobalRef(JNIEnv *env, jobject ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
755 JNIWrapper("NewGlobalRef");
a61af66fc99e Initial load
duke
parents:
diff changeset
756 DTRACE_PROBE2(hotspot_jni, NewGlobalRef__entry, env, ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 Handle ref_handle(thread, JNIHandles::resolve(ref));
a61af66fc99e Initial load
duke
parents:
diff changeset
758 jobject ret = JNIHandles::make_global(ref_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
759 DTRACE_PROBE1(hotspot_jni, NewGlobalRef__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
760 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // Must be JNI_ENTRY (with HandleMark)
a61af66fc99e Initial load
duke
parents:
diff changeset
764 JNI_ENTRY_NO_PRESERVE(void, jni_DeleteGlobalRef(JNIEnv *env, jobject ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
765 JNIWrapper("DeleteGlobalRef");
a61af66fc99e Initial load
duke
parents:
diff changeset
766 DTRACE_PROBE2(hotspot_jni, DeleteGlobalRef__entry, env, ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
767 JNIHandles::destroy_global(ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 DTRACE_PROBE(hotspot_jni, DeleteGlobalRef__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
769 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 JNI_QUICK_ENTRY(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
772 JNIWrapper("DeleteLocalRef");
a61af66fc99e Initial load
duke
parents:
diff changeset
773 DTRACE_PROBE2(hotspot_jni, DeleteLocalRef__entry, env, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
774 JNIHandles::destroy_local(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 DTRACE_PROBE(hotspot_jni, DeleteLocalRef__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
776 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
777
a61af66fc99e Initial load
duke
parents:
diff changeset
778 JNI_QUICK_ENTRY(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2))
a61af66fc99e Initial load
duke
parents:
diff changeset
779 JNIWrapper("IsSameObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
780 DTRACE_PROBE3(hotspot_jni, IsSameObject__entry, env, r1, r2);
a61af66fc99e Initial load
duke
parents:
diff changeset
781 oop a = JNIHandles::resolve(r1);
a61af66fc99e Initial load
duke
parents:
diff changeset
782 oop b = JNIHandles::resolve(r2);
a61af66fc99e Initial load
duke
parents:
diff changeset
783 jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 DTRACE_PROBE1(hotspot_jni, IsSameObject__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
785 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 JNI_ENTRY(jobject, jni_NewLocalRef(JNIEnv *env, jobject ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
790 JNIWrapper("NewLocalRef");
a61af66fc99e Initial load
duke
parents:
diff changeset
791 DTRACE_PROBE2(hotspot_jni, NewLocalRef__entry, env, ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 jobject ret = JNIHandles::make_local(env, JNIHandles::resolve(ref));
a61af66fc99e Initial load
duke
parents:
diff changeset
793 DTRACE_PROBE1(hotspot_jni, NewLocalRef__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
794 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
795 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 JNI_LEAF(jint, jni_EnsureLocalCapacity(JNIEnv *env, jint capacity))
a61af66fc99e Initial load
duke
parents:
diff changeset
798 JNIWrapper("EnsureLocalCapacity");
a61af66fc99e Initial load
duke
parents:
diff changeset
799 DTRACE_PROBE2(hotspot_jni, EnsureLocalCapacity__entry, env, capacity);
a61af66fc99e Initial load
duke
parents:
diff changeset
800 jint ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
801 if (capacity >= 0 && capacity <= MAX_REASONABLE_LOCAL_CAPACITY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
802 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
803 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
804 ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
806 DTRACE_PROBE1(hotspot_jni, EnsureLocalCapacity__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
807 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // Return the Handle Type
a61af66fc99e Initial load
duke
parents:
diff changeset
811 JNI_LEAF(jobjectRefType, jni_GetObjectRefType(JNIEnv *env, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
812 JNIWrapper("GetObjectRefType");
a61af66fc99e Initial load
duke
parents:
diff changeset
813 DTRACE_PROBE2(hotspot_jni, GetObjectRefType__entry, env, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
814 jobjectRefType ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 if (JNIHandles::is_local_handle(thread, obj) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
816 JNIHandles::is_frame_handle(thread, obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
817 ret = JNILocalRefType;
a61af66fc99e Initial load
duke
parents:
diff changeset
818 else if (JNIHandles::is_global_handle(obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
819 ret = JNIGlobalRefType;
a61af66fc99e Initial load
duke
parents:
diff changeset
820 else if (JNIHandles::is_weak_global_handle(obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
821 ret = JNIWeakGlobalRefType;
a61af66fc99e Initial load
duke
parents:
diff changeset
822 else
a61af66fc99e Initial load
duke
parents:
diff changeset
823 ret = JNIInvalidRefType;
a61af66fc99e Initial load
duke
parents:
diff changeset
824 DTRACE_PROBE1(hotspot_jni, GetObjectRefType__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
825 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 class JNI_ArgumentPusher : public SignatureIterator {
a61af66fc99e Initial load
duke
parents:
diff changeset
830 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
831 JavaCallArguments* _arguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 virtual void get_bool () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 virtual void get_char () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
835 virtual void get_short () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
836 virtual void get_byte () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
837 virtual void get_int () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
838 virtual void get_long () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
839 virtual void get_float () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
840 virtual void get_double () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
841 virtual void get_object () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
842
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
843 JNI_ArgumentPusher(Symbol* signature) : SignatureIterator(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
844 this->_return_type = T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 _arguments = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
849 virtual void iterate( uint64_t fingerprint ) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 void set_java_argument_object(JavaCallArguments *arguments) { _arguments = arguments; }
a61af66fc99e Initial load
duke
parents:
diff changeset
852
a61af66fc99e Initial load
duke
parents:
diff changeset
853 inline void do_bool() { if (!is_return_type()) get_bool(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
854 inline void do_char() { if (!is_return_type()) get_char(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
855 inline void do_short() { if (!is_return_type()) get_short(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
856 inline void do_byte() { if (!is_return_type()) get_byte(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
857 inline void do_int() { if (!is_return_type()) get_int(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
858 inline void do_long() { if (!is_return_type()) get_long(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
859 inline void do_float() { if (!is_return_type()) get_float(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
860 inline void do_double() { if (!is_return_type()) get_double(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
861 inline void do_object(int begin, int end) { if (!is_return_type()) get_object(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
862 inline void do_array(int begin, int end) { if (!is_return_type()) get_object(); } // do_array uses get_object -- there is no get_array
a61af66fc99e Initial load
duke
parents:
diff changeset
863 inline void do_void() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 JavaCallArguments* arguments() { return _arguments; }
a61af66fc99e Initial load
duke
parents:
diff changeset
866 void push_receiver(Handle h) { _arguments->push_oop(h); }
a61af66fc99e Initial load
duke
parents:
diff changeset
867 };
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 class JNI_ArgumentPusherVaArg : public JNI_ArgumentPusher {
a61af66fc99e Initial load
duke
parents:
diff changeset
871 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
872 va_list _ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 inline void get_bool() { _arguments->push_int(va_arg(_ap, jint)); } // bool is coerced to int when using va_arg
a61af66fc99e Initial load
duke
parents:
diff changeset
875 inline void get_char() { _arguments->push_int(va_arg(_ap, jint)); } // char is coerced to int when using va_arg
a61af66fc99e Initial load
duke
parents:
diff changeset
876 inline void get_short() { _arguments->push_int(va_arg(_ap, jint)); } // short is coerced to int when using va_arg
a61af66fc99e Initial load
duke
parents:
diff changeset
877 inline void get_byte() { _arguments->push_int(va_arg(_ap, jint)); } // byte is coerced to int when using va_arg
a61af66fc99e Initial load
duke
parents:
diff changeset
878 inline void get_int() { _arguments->push_int(va_arg(_ap, jint)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // each of these paths is exercized by the various jck Call[Static,Nonvirtual,][Void,Int,..]Method[A,V,] tests
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 inline void get_long() { _arguments->push_long(va_arg(_ap, jlong)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
883 inline void get_float() { _arguments->push_float((jfloat)va_arg(_ap, jdouble)); } // float is coerced to double w/ va_arg
a61af66fc99e Initial load
duke
parents:
diff changeset
884 inline void get_double() { _arguments->push_double(va_arg(_ap, jdouble)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
885 inline void get_object() { jobject l = va_arg(_ap, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
886 _arguments->push_oop(Handle((oop *)l, false)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 inline void set_ap(va_list rap) {
a61af66fc99e Initial load
duke
parents:
diff changeset
889 #ifdef va_copy
a61af66fc99e Initial load
duke
parents:
diff changeset
890 va_copy(_ap, rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
891 #elif defined (__va_copy)
a61af66fc99e Initial load
duke
parents:
diff changeset
892 __va_copy(_ap, rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
894 _ap = rap;
a61af66fc99e Initial load
duke
parents:
diff changeset
895 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
899 JNI_ArgumentPusherVaArg(Symbol* signature, va_list rap)
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
900 : JNI_ArgumentPusher(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
901 set_ap(rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
903 JNI_ArgumentPusherVaArg(jmethodID method_id, va_list rap)
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
904 : JNI_ArgumentPusher(JNIHandles::resolve_jmethod_id(method_id)->signature()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
905 set_ap(rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 }
a61af66fc99e Initial load
duke
parents:
diff changeset
907
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // Optimized path if we have the bitvector form of signature
a61af66fc99e Initial load
duke
parents:
diff changeset
909 void iterate( uint64_t fingerprint ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
910 if ( fingerprint == UCONST64(-1) ) SignatureIterator::iterate();// Must be too many arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
911 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
912 _return_type = (BasicType)((fingerprint >> static_feature_size) &
a61af66fc99e Initial load
duke
parents:
diff changeset
913 result_feature_mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
914
a61af66fc99e Initial load
duke
parents:
diff changeset
915 assert(fingerprint, "Fingerprint should not be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
916 fingerprint = fingerprint >> (static_feature_size + result_feature_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
917 while ( 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
918 switch ( fingerprint & parameter_feature_mask ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
919 case bool_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
920 case char_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
921 case short_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
922 case byte_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
923 case int_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
924 get_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
925 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
926 case obj_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
927 get_object();
a61af66fc99e Initial load
duke
parents:
diff changeset
928 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
929 case long_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
930 get_long();
a61af66fc99e Initial load
duke
parents:
diff changeset
931 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
932 case float_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
933 get_float();
a61af66fc99e Initial load
duke
parents:
diff changeset
934 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
935 case double_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
936 get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
937 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
938 case done_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
939 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
940 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
941 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
942 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
943 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
944 }
a61af66fc99e Initial load
duke
parents:
diff changeset
945 fingerprint >>= parameter_feature_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
947 }
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949 };
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951
a61af66fc99e Initial load
duke
parents:
diff changeset
952 class JNI_ArgumentPusherArray : public JNI_ArgumentPusher {
a61af66fc99e Initial load
duke
parents:
diff changeset
953 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
954 const jvalue *_ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
955
a61af66fc99e Initial load
duke
parents:
diff changeset
956 inline void get_bool() { _arguments->push_int((jint)(_ap++)->z); }
a61af66fc99e Initial load
duke
parents:
diff changeset
957 inline void get_char() { _arguments->push_int((jint)(_ap++)->c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
958 inline void get_short() { _arguments->push_int((jint)(_ap++)->s); }
a61af66fc99e Initial load
duke
parents:
diff changeset
959 inline void get_byte() { _arguments->push_int((jint)(_ap++)->b); }
a61af66fc99e Initial load
duke
parents:
diff changeset
960 inline void get_int() { _arguments->push_int((jint)(_ap++)->i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
961
a61af66fc99e Initial load
duke
parents:
diff changeset
962 inline void get_long() { _arguments->push_long((_ap++)->j); }
a61af66fc99e Initial load
duke
parents:
diff changeset
963 inline void get_float() { _arguments->push_float((_ap++)->f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
964 inline void get_double() { _arguments->push_double((_ap++)->d);}
a61af66fc99e Initial load
duke
parents:
diff changeset
965 inline void get_object() { _arguments->push_oop(Handle((oop *)(_ap++)->l, false)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 inline void set_ap(const jvalue *rap) { _ap = rap; }
a61af66fc99e Initial load
duke
parents:
diff changeset
968
a61af66fc99e Initial load
duke
parents:
diff changeset
969 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
970 JNI_ArgumentPusherArray(Symbol* signature, const jvalue *rap)
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
971 : JNI_ArgumentPusher(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
972 set_ap(rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
973 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
974 JNI_ArgumentPusherArray(jmethodID method_id, const jvalue *rap)
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
975 : JNI_ArgumentPusher(JNIHandles::resolve_jmethod_id(method_id)->signature()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
976 set_ap(rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
977 }
a61af66fc99e Initial load
duke
parents:
diff changeset
978
a61af66fc99e Initial load
duke
parents:
diff changeset
979 // Optimized path if we have the bitvector form of signature
a61af66fc99e Initial load
duke
parents:
diff changeset
980 void iterate( uint64_t fingerprint ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 if ( fingerprint == UCONST64(-1) ) SignatureIterator::iterate(); // Must be too many arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
982 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
983 _return_type = (BasicType)((fingerprint >> static_feature_size) &
a61af66fc99e Initial load
duke
parents:
diff changeset
984 result_feature_mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
985 assert(fingerprint, "Fingerprint should not be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
986 fingerprint = fingerprint >> (static_feature_size + result_feature_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
987 while ( 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
988 switch ( fingerprint & parameter_feature_mask ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
989 case bool_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
990 get_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
991 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
992 case char_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
993 get_char();
a61af66fc99e Initial load
duke
parents:
diff changeset
994 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
995 case short_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
996 get_short();
a61af66fc99e Initial load
duke
parents:
diff changeset
997 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
998 case byte_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
999 get_byte();
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 case int_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 get_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 case obj_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 get_object();
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 case long_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 get_long();
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 case float_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 get_float();
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 case double_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 case done_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 fingerprint >>= parameter_feature_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1028
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 enum JNICallType {
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 JNI_STATIC,
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 JNI_VIRTUAL,
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 JNI_NONVIRTUAL
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1035
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 static methodHandle jni_resolve_interface_call(Handle recv, methodHandle method, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 assert(!method.is_null() , "method should not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc)
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 KlassHandle spec_klass (THREAD, method->method_holder());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1042 Symbol* name = method->name();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1043 Symbol* signature = method->signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 LinkResolver::resolve_interface_call(info, recv, recv_klass, spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 static methodHandle jni_resolve_virtual_call(Handle recv, methodHandle method, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 assert(!method.is_null() , "method should not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
1051
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc)
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 KlassHandle spec_klass (THREAD, method->method_holder());
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1055 Symbol* name = method->name();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1056 Symbol* signature = method->signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 CallInfo info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 LinkResolver::resolve_virtual_call(info, recv, recv_klass, spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 return info.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 methodHandle method(THREAD, JNIHandles::resolve_jmethod_id(method_id));
a61af66fc99e Initial load
duke
parents:
diff changeset
1066
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 // Create object to hold arguments for the JavaCall, and associate it with
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // the jni parser
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 int number_of_parameters = method->size_of_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 JavaCallArguments java_args(number_of_parameters);
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 args->set_java_argument_object(&java_args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 assert(method->is_static(), "method should be static");
a61af66fc99e Initial load
duke
parents:
diff changeset
1075
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // Fill out JavaCallArguments object
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1077 args->iterate( Fingerprinter(method).fingerprint() );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Initialize result type
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 result->set_type(args->get_ret_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1080
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 // Invoke the method. Result is returned as oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 JavaCalls::call(result, method, &java_args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 // Convert result
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 static void jni_invoke_nonstatic(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 oop recv = JNIHandles::resolve(receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 if (recv == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 Handle h_recv(THREAD, recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 int number_of_parameters;
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 methodOop selected_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 methodOop m = JNIHandles::resolve_jmethod_id(method_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 number_of_parameters = m->size_of_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 klassOop holder = m->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 if (!(Klass::cast(holder))->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // non-interface call -- for that little speed boost, don't handlize
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 debug_only(No_Safepoint_Verifier nosafepoint;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 if (call_type == JNI_VIRTUAL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // jni_GetMethodID makes sure class is linked and initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 // so m should have a valid vtable index.
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 int vtbl_index = m->vtable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 if (vtbl_index != methodOopDesc::nonvirtual_vtable_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 klassOop k = h_recv->klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 // k might be an arrayKlassOop but all vtables start at
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 // the same place. The cast is to avoid virtual call and assertion.
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 instanceKlass *ik = (instanceKlass*)k->klass_part();
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 selected_method = ik->method_at_vtable(vtbl_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // final method
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 selected_method = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 // JNI_NONVIRTUAL call
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 selected_method = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // interface call
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 KlassHandle h_holder(THREAD, holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
1128
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 int itbl_index = m->cached_itable_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 if (itbl_index == -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 itbl_index = klassItable::compute_itable_index(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 m->set_cached_itable_index(itbl_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // the above may have grabbed a lock, 'm' and anything non-handlized can't be used again
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 klassOop k = h_recv->klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 selected_method = instanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1139
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 methodHandle method(THREAD, selected_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // Create object to hold arguments for the JavaCall, and associate it with
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // the jni parser
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 JavaCallArguments java_args(number_of_parameters);
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 args->set_java_argument_object(&java_args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 // handle arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 assert(!method->is_static(), "method should not be static");
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 args->push_receiver(h_recv); // Push jobject handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1151
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // Fill out JavaCallArguments object
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1153 args->iterate( Fingerprinter(method).fingerprint() );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 // Initialize result type
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 result->set_type(args->get_ret_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1156
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 // Invoke the method. Result is returned as oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 JavaCalls::call(result, method, &java_args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1159
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // Convert result
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1165
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 static instanceOop alloc_object(jclass clazz, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 KlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 Klass::cast(k())->check_valid_for_instantiation(false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 instanceKlass::cast(k())->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 instanceOop ih = instanceKlass::cast(k())->allocate_instance(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 return ih;
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 DT_RETURN_MARK_DECL(AllocObject, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
1176
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 JNI_ENTRY(jobject, jni_AllocObject(JNIEnv *env, jclass clazz))
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 JNIWrapper("AllocObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
1179
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 DTRACE_PROBE2(hotspot_jni, AllocObject__entry, env, clazz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 jobject ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 DT_RETURN_MARK(AllocObject, jobject, (const jobject&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1183
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 instanceOop i = alloc_object(clazz, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 ret = JNIHandles::make_local(env, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1188
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 DT_RETURN_MARK_DECL(NewObjectA, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
1190
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 JNI_ENTRY(jobject, jni_NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 JNIWrapper("NewObjectA");
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 DTRACE_PROBE3(hotspot_jni, NewObjectA__entry, env, clazz, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 jobject obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 instanceOop i = alloc_object(clazz, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 obj = JNIHandles::make_local(env, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1200 JNI_ArgumentPusherArray ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1204
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 DT_RETURN_MARK_DECL(NewObjectV, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
1206
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 JNI_ENTRY(jobject, jni_NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 JNIWrapper("NewObjectV");
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 DTRACE_PROBE3(hotspot_jni, NewObjectV__entry, env, clazz, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 jobject obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1212
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 instanceOop i = alloc_object(clazz, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 obj = JNIHandles::make_local(env, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1216 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 DT_RETURN_MARK_DECL(NewObject, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
1222
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 JNI_ENTRY(jobject, jni_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...))
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 JNIWrapper("NewObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 DTRACE_PROBE3(hotspot_jni, NewObject__entry, env, clazz, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 jobject obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1228
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 instanceOop i = alloc_object(clazz, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 obj = JNIHandles::make_local(env, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 va_start(args, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1234 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 JNIWrapper("GetObjectClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 DTRACE_PROBE2(hotspot_jni, GetObjectClass__entry, env, obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 klassOop k = JNIHandles::resolve_non_null(obj)->klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 jclass ret =
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 DTRACE_PROBE1(hotspot_jni, GetObjectClass__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1250
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 JNI_QUICK_ENTRY(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz))
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 JNIWrapper("IsInstanceOf");
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 DTRACE_PROBE3(hotspot_jni, IsInstanceOf__entry, env, obj, clazz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 jboolean ret = JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 if (obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 ret = JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 klassOop k = java_lang_Class::as_klassOop(
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 JNIHandles::resolve_non_null(clazz));
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 if (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 ret = JNIHandles::resolve_non_null(obj)->is_a(k) ? JNI_TRUE : JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 DTRACE_PROBE1(hotspot_jni, IsInstanceOf__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1266
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 static jmethodID get_method_id(JNIEnv *env, jclass clazz, const char *name_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 const char *sig, bool is_static, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 // %%%% This code should probably just call into a method in the LinkResolver
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 // The class should have been loaded (we have an instance of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 // passed in) so the method and signature should already be in the symbol
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 // table. If they're not there, the method doesn't exist.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1275 const char *name_to_probe = (name_str == NULL)
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1276 ? vmSymbols::object_initializer_name()->as_C_string()
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1277 : name_str;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1278 TempNewSymbol name = SymbolTable::probe(name_to_probe, (int)strlen(name_to_probe));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1279 TempNewSymbol signature = SymbolTable::probe(sig, (int)strlen(sig));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1280
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1281 if (name == NULL || signature == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1284
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 // Throw a NoSuchMethodError exception if we have an instance of a
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 // primitive java.lang.Class
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(clazz))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 KlassHandle klass(THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1293
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 // Make sure class is linked and initialized before handing id's out to
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 // methodOops.
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 Klass::cast(klass())->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1297
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 methodOop m;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1299 if (name == vmSymbols::object_initializer_name() ||
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1300 name == vmSymbols::class_initializer_name()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 // Never search superclasses for constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 if (klass->oop_is_instance()) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1303 m = instanceKlass::cast(klass())->find_method(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 m = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 } else {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1308 m = klass->lookup_method(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 // Look up interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 if (m == NULL && klass->oop_is_instance()) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1311 m = instanceKlass::cast(klass())->lookup_method_in_all_interfaces(name,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1312 signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 if (m == NULL || (m->is_static() != is_static)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 return m->jmethod_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 JNI_ENTRY(jmethodID, jni_GetMethodID(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 const char *name, const char *sig))
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 JNIWrapper("GetMethodID");
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 DTRACE_PROBE4(hotspot_jni, GetMethodID__entry, env, clazz, name, sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 jmethodID ret = get_method_id(env, clazz, name, sig, false, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 DTRACE_PROBE1(hotspot_jni, GetMethodID__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1330
a61af66fc99e Initial load
duke
parents:
diff changeset
1331
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 JNI_ENTRY(jmethodID, jni_GetStaticMethodID(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 const char *name, const char *sig))
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 JNIWrapper("GetStaticMethodID");
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 DTRACE_PROBE4(hotspot_jni, GetStaticMethodID__entry, env, clazz, name, sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 jmethodID ret = get_method_id(env, clazz, name, sig, true, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 DTRACE_PROBE1(hotspot_jni, GetStaticMethodID__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1340
a61af66fc99e Initial load
duke
parents:
diff changeset
1341
a61af66fc99e Initial load
duke
parents:
diff changeset
1342
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 // Calling Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 #define DEFINE_CALLMETHOD(ResultType, Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodV, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodA, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 jni_Call##Result##Method(JNIEnv *env, jobject obj, jmethodID methodID, ...)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 JNIWrapper("Call" XSTR(Result) "Method"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 DTRACE_PROBE3(hotspot_jni, Call##Result##Method__entry, env, obj, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 DT_RETURN_MARK_FOR(Result, Call##Result##Method, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 va_list args; \
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 va_start(args, methodID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1366 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 va_end(args); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 jni_Call##Result##MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 JNIWrapper("Call" XSTR(Result) "MethodV"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 DTRACE_PROBE3(hotspot_jni, Call##Result##MethodV__entry, env, obj, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 DT_RETURN_MARK_FOR(Result, Call##Result##MethodV, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1384 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 jni_Call##Result##MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 JNIWrapper("Call" XSTR(Result) "MethodA"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 DTRACE_PROBE3(hotspot_jni, Call##Result##MethodA__entry, env, obj, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 DT_RETURN_MARK_FOR(Result, Call##Result##MethodA, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1400 JNI_ArgumentPusherArray ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1405
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 // the runtime type of subword integral basic types is integer
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 DEFINE_CALLMETHOD(jboolean, Boolean, T_BOOLEAN)
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 DEFINE_CALLMETHOD(jbyte, Byte, T_BYTE)
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 DEFINE_CALLMETHOD(jchar, Char, T_CHAR)
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 DEFINE_CALLMETHOD(jshort, Short, T_SHORT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1411
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 DEFINE_CALLMETHOD(jobject, Object, T_OBJECT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 DEFINE_CALLMETHOD(jint, Int, T_INT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 DEFINE_CALLMETHOD(jlong, Long, T_LONG)
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 DEFINE_CALLMETHOD(jfloat, Float, T_FLOAT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 DEFINE_CALLMETHOD(jdouble, Double, T_DOUBLE)
a61af66fc99e Initial load
duke
parents:
diff changeset
1417
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 DT_VOID_RETURN_MARK_DECL(CallVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 DT_VOID_RETURN_MARK_DECL(CallVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 DT_VOID_RETURN_MARK_DECL(CallVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
1421
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 JNI_ENTRY(void, jni_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...))
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 JNIWrapper("CallVoidMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 DTRACE_PROBE3(hotspot_jni, CallVoidMethod__entry, env, obj, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 DT_VOID_RETURN_MARK(CallVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1426
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 va_start(args, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1430 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1434
a61af66fc99e Initial load
duke
parents:
diff changeset
1435
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 JNI_ENTRY(void, jni_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 JNIWrapper("CallVoidMethodV");
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 DTRACE_PROBE3(hotspot_jni, CallVoidMethodV__entry, env, obj, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 DT_VOID_RETURN_MARK(CallVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
1440
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1442 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1445
a61af66fc99e Initial load
duke
parents:
diff changeset
1446
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 JNI_ENTRY(void, jni_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 JNIWrapper("CallVoidMethodA");
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 DTRACE_PROBE3(hotspot_jni, CallVoidMethodA__entry, env, obj, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 DT_VOID_RETURN_MARK(CallVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
1451
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1453 JNI_ArgumentPusherArray ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1456
a61af66fc99e Initial load
duke
parents:
diff changeset
1457
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 #define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodV, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodA, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 jni_CallNonvirtual##Result##Method(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 JNIWrapper("CallNonvitual" XSTR(Result) "Method"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##Method__entry, env, obj, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 ResultType ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##Method, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 va_list args; \
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 va_start(args, methodID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1476 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 va_end(args); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 jni_CallNonvirtual##Result##MethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 JNIWrapper("CallNonvitual" XSTR(Result) "#MethodV"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodV__entry, env, obj, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 ResultType ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodV, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1492 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 jni_CallNonvirtual##Result##MethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 JNIWrapper("CallNonvitual" XSTR(Result) "MethodA"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodA__entry, env, obj, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 ResultType ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodA, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1507 JNI_ArgumentPusherArray ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1512
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 // the runtime type of subword integral basic types is integer
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 DEFINE_CALLNONVIRTUALMETHOD(jboolean, Boolean, T_BOOLEAN)
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 DEFINE_CALLNONVIRTUALMETHOD(jbyte, Byte, T_BYTE)
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 DEFINE_CALLNONVIRTUALMETHOD(jchar, Char, T_CHAR)
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 DEFINE_CALLNONVIRTUALMETHOD(jshort, Short, T_SHORT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1518
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 DEFINE_CALLNONVIRTUALMETHOD(jobject, Object, T_OBJECT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 DEFINE_CALLNONVIRTUALMETHOD(jint, Int, T_INT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 DEFINE_CALLNONVIRTUALMETHOD(jlong, Long, T_LONG)
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 DEFINE_CALLNONVIRTUALMETHOD(jfloat, Float, T_FLOAT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 DEFINE_CALLNONVIRTUALMETHOD(jdouble, Double, T_DOUBLE)
a61af66fc99e Initial load
duke
parents:
diff changeset
1524
a61af66fc99e Initial load
duke
parents:
diff changeset
1525
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
1529
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 JNI_ENTRY(void, jni_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...))
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 JNIWrapper("CallNonvirtualVoidMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
1532
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethod__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 env, obj, cls, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1536
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 va_start(args, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1540 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1544
a61af66fc99e Initial load
duke
parents:
diff changeset
1545
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 JNI_ENTRY(void, jni_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 JNIWrapper("CallNonvirtualVoidMethodV");
a61af66fc99e Initial load
duke
parents:
diff changeset
1548
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodV__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 env, obj, cls, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
1552
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1554 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1557
a61af66fc99e Initial load
duke
parents:
diff changeset
1558
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 JNI_ENTRY(void, jni_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 JNIWrapper("CallNonvirtualVoidMethodA");
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodA__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 env, obj, cls, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1565 JNI_ArgumentPusherArray ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1568
a61af66fc99e Initial load
duke
parents:
diff changeset
1569
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 #define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodV, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodA, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 jni_CallStatic##Result##Method(JNIEnv *env, jclass cls, jmethodID methodID, ...)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 JNIWrapper("CallStatic" XSTR(Result) "Method"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##Method__entry, env, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 DT_RETURN_MARK_FOR(Result, CallStatic##Result##Method, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 va_list args; \
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 va_start(args, methodID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1588 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 va_end(args); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 jni_CallStatic##Result##MethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 JNIWrapper("CallStatic" XSTR(Result) "MethodV"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodV__entry, env, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodV, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1604 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 jni_CallStatic##Result##MethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 JNIWrapper("CallStatic" XSTR(Result) "MethodA"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodA__entry, env, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodA, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1619 JNI_ArgumentPusherArray ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1624
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 // the runtime type of subword integral basic types is integer
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 DEFINE_CALLSTATICMETHOD(jboolean, Boolean, T_BOOLEAN)
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 DEFINE_CALLSTATICMETHOD(jbyte, Byte, T_BYTE)
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 DEFINE_CALLSTATICMETHOD(jchar, Char, T_CHAR)
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 DEFINE_CALLSTATICMETHOD(jshort, Short, T_SHORT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1630
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 DEFINE_CALLSTATICMETHOD(jobject, Object, T_OBJECT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 DEFINE_CALLSTATICMETHOD(jint, Int, T_INT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 DEFINE_CALLSTATICMETHOD(jlong, Long, T_LONG)
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 DEFINE_CALLSTATICMETHOD(jfloat, Float, T_FLOAT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 DEFINE_CALLSTATICMETHOD(jdouble, Double, T_DOUBLE)
a61af66fc99e Initial load
duke
parents:
diff changeset
1636
a61af66fc99e Initial load
duke
parents:
diff changeset
1637
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
1641
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 JNI_ENTRY(void, jni_CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...))
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 JNIWrapper("CallStaticVoidMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethod__entry, env, cls, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 DT_VOID_RETURN_MARK(CallStaticVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1646
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 va_start(args, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1650 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1654
a61af66fc99e Initial load
duke
parents:
diff changeset
1655
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 JNI_ENTRY(void, jni_CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 JNIWrapper("CallStaticVoidMethodV");
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodV__entry, env, cls, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 DT_VOID_RETURN_MARK(CallStaticVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
1660
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1662 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1665
a61af66fc99e Initial load
duke
parents:
diff changeset
1666
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 JNI_ENTRY(void, jni_CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 JNIWrapper("CallStaticVoidMethodA");
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodA__entry, env, cls, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 DT_VOID_RETURN_MARK(CallStaticVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
1671
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1673 JNI_ArgumentPusherArray ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1676
a61af66fc99e Initial load
duke
parents:
diff changeset
1677
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 // Accessing Fields
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1681
a61af66fc99e Initial load
duke
parents:
diff changeset
1682
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 DT_RETURN_MARK_DECL(GetFieldID, jfieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1684
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 JNI_ENTRY(jfieldID, jni_GetFieldID(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 const char *name, const char *sig))
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 JNIWrapper("GetFieldID");
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 DTRACE_PROBE4(hotspot_jni, GetFieldID__entry, env, clazz, name, sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 jfieldID ret = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 DT_RETURN_MARK(GetFieldID, jfieldID, (const jfieldID&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1691
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 // The class should have been loaded (we have an instance of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 // passed in) so the field and signature should already be in the symbol
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 // table. If they're not there, the field doesn't exist.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1695 TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1696 TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1697 if (fieldname == NULL || signame == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 KlassHandle k(THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 // Make sure class is initialized before handing id's out to fields
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 Klass::cast(k())->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1704
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 if (!Klass::cast(k())->oop_is_instance() ||
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1707 !instanceKlass::cast(k())->find_field(fieldname, signame, false, &fd)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1710
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 // A jfieldID for a non-static field is simply the offset of the field within the instanceOop
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 // It may also have hash bits for k, if VerifyJNIFields is turned on.
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 ret = jfieldIDWorkaround::to_instance_jfieldID(k(), fd.offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1716
a61af66fc99e Initial load
duke
parents:
diff changeset
1717
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 JNI_ENTRY(jobject, jni_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID))
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 JNIWrapper("GetObjectField");
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 oop o = JNIHandles::resolve_non_null(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 klassOop k = o->klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 // Keep JVMTI addition small and only check enabled flag here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 // jni_GetField_probe() assumes that is okay to create handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 if (JvmtiExport::should_post_field_access()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1730 #ifndef SERIALGC
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1731 // If G1 is enabled and we are accessing the value of the referent
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1732 // field in a reference object then we need to register a non-null
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1733 // referent with the SATB barrier.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1734 if (UseG1GC) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1735 bool needs_barrier = false;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1736
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1737 if (ret != NULL &&
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1738 offset == java_lang_ref_Reference::referent_offset &&
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1739 instanceKlass::cast(k)->reference_type() != REF_NONE) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1740 assert(instanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1741 needs_barrier = true;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1742 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1743
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1744 if (needs_barrier) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1745 oop referent = JNIHandles::resolve(ret);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1746 G1SATBCardTableModRefBS::enqueue(referent);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1747 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1748 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
1749 #endif // SERIALGC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1753
a61af66fc99e Initial load
duke
parents:
diff changeset
1754
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 #define DEFINE_GETFIELD(Return,Fieldname,Result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 JNIWrapper("Get" XSTR(Result) "Field"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 DTRACE_PROBE3(hotspot_jni, Get##Result##Field__entry, env, obj, fieldID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 Return ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 oop o = JNIHandles::resolve_non_null(obj); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 klassOop k = o->klass(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 /* Keep JVMTI addition small and only check enabled flag here. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 /* jni_GetField_probe_nh() assumes that is not okay to create handles */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 /* and creates a ResetNoHandleMark. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 if (JvmtiExport::should_post_field_access()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 o = JvmtiExport::jni_GetField_probe_nh(thread, obj, o, k, fieldID, false); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 ret = o->Fieldname##_field(offset); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 return ret; \
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1778
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 DEFINE_GETFIELD(jboolean, bool, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 DEFINE_GETFIELD(jbyte, byte, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 DEFINE_GETFIELD(jchar, char, Char)
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 DEFINE_GETFIELD(jshort, short, Short)
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 DEFINE_GETFIELD(jint, int, Int)
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 DEFINE_GETFIELD(jlong, long, Long)
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 DEFINE_GETFIELD(jfloat, float, Float)
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 DEFINE_GETFIELD(jdouble, double, Double)
a61af66fc99e Initial load
duke
parents:
diff changeset
1787
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 address jni_GetBooleanField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 return (address)jni_GetBooleanField;
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 address jni_GetByteField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 return (address)jni_GetByteField;
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 address jni_GetCharField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 return (address)jni_GetCharField;
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 address jni_GetShortField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 return (address)jni_GetShortField;
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 address jni_GetIntField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 return (address)jni_GetIntField;
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 address jni_GetLongField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 return (address)jni_GetLongField;
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 address jni_GetFloatField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 return (address)jni_GetFloatField;
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 address jni_GetDoubleField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 return (address)jni_GetDoubleField;
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1812
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 JNI_QUICK_ENTRY(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value))
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 JNIWrapper("SetObjectField");
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 DTRACE_PROBE4(hotspot_jni, SetObjectField__entry, env, obj, fieldID, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 oop o = JNIHandles::resolve_non_null(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 klassOop k = o->klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 // Keep JVMTI addition small and only check enabled flag here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 // jni_SetField_probe_nh() assumes that is not okay to create handles
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 // and creates a ResetNoHandleMark.
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 if (JvmtiExport::should_post_field_modification()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 jvalue field_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 field_value.l = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, 'L', (jvalue *)&field_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 o->obj_field_put(offset, JNIHandles::resolve(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 DTRACE_PROBE(hotspot_jni, SetObjectField__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1830
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 JNIWrapper("Set" XSTR(Result) "Field"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 HS_DTRACE_PROBE_CDECL_N(hotspot_jni, Set##Result##Field__entry, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 ( JNIEnv*, jobject, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 HS_DTRACE_PROBE_N(hotspot_jni, Set##Result##Field__entry, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 ( env, obj, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 oop o = JNIHandles::resolve_non_null(obj); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 klassOop k = o->klass(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 /* Keep JVMTI addition small and only check enabled flag here. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 /* jni_SetField_probe_nh() assumes that is not okay to create handles */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 /* and creates a ResetNoHandleMark. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 if (JvmtiExport::should_post_field_modification()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 jvalue field_value; \
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 field_value.unionType = value; \
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, SigType, (jvalue *)&field_value); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 o->Fieldname##_field_put(offset, value); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 DTRACE_PROBE(hotspot_jni, Set##Result##Field__return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1855
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 DEFINE_SETFIELD(jboolean, bool, Boolean, 'Z', z)
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 DEFINE_SETFIELD(jbyte, byte, Byte, 'B', b)
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 DEFINE_SETFIELD(jchar, char, Char, 'C', c)
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 DEFINE_SETFIELD(jshort, short, Short, 'S', s)
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 DEFINE_SETFIELD(jint, int, Int, 'I', i)
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 DEFINE_SETFIELD(jlong, long, Long, 'J', j)
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 DEFINE_SETFIELD(jfloat, float, Float, 'F', f)
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 DEFINE_SETFIELD(jdouble, double, Double, 'D', d)
a61af66fc99e Initial load
duke
parents:
diff changeset
1864
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 DT_RETURN_MARK_DECL(ToReflectedField, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
1866
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic))
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 JNIWrapper("ToReflectedField");
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 DTRACE_PROBE4(hotspot_jni, ToReflectedField__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 env, cls, fieldID, isStatic);
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 jobject ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 DT_RETURN_MARK(ToReflectedField, jobject, (const jobject&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1873
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 bool found = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1877
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 assert(jfieldIDWorkaround::is_static_jfieldID(fieldID) == (isStatic != 0), "invalid fieldID");
a61af66fc99e Initial load
duke
parents:
diff changeset
1879
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 if (isStatic) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 // Static field. The fieldID a JNIid specifying the field holder and the offset within the klassOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 assert(id->is_static_field_id(), "invalid static field id");
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
1884 found = id->find_local_field(&fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 // Non-static field. The fieldID is really the offset of the field within the instanceOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 found = instanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 assert(found, "bad fieldID passed into jni_ToReflectedField");
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 oop reflected = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 ret = JNIHandles::make_local(env, reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1895
a61af66fc99e Initial load
duke
parents:
diff changeset
1896
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 // Accessing Static Fields
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1901
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 const char *name, const char *sig))
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 JNIWrapper("GetStaticFieldID");
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 DTRACE_PROBE4(hotspot_jni, GetStaticFieldID__entry, env, clazz, name, sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 jfieldID ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 DT_RETURN_MARK(GetStaticFieldID, jfieldID, (const jfieldID&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1908
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 // The class should have been loaded (we have an instance of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 // passed in) so the field and signature should already be in the symbol
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 // table. If they're not there, the field doesn't exist.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1912 TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1913 TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1914 if (fieldname == NULL || signame == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 KlassHandle k(THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 // Make sure class is initialized before handing id's out to static fields
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 Klass::cast(k())->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1921
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 if (!Klass::cast(k())->oop_is_instance() ||
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1924 !instanceKlass::cast(k())->find_field(fieldname, signame, true, &fd)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1927
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the klassOop
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 JNIid* id = instanceKlass::cast(fd.field_holder())->jni_id_for(fd.offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 debug_only(id->set_is_static_field_id();)
a61af66fc99e Initial load
duke
parents:
diff changeset
1931
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
1932 debug_only(id->verify(fd.field_holder()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1933
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 ret = jfieldIDWorkaround::to_static_jfieldID(id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1937
a61af66fc99e Initial load
duke
parents:
diff changeset
1938
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID))
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 JNIWrapper("GetStaticObjectField");
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 DTRACE_PROBE3(hotspot_jni, GetStaticObjectField__entry, env, clazz, fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 #ifndef JNICHECK_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 DEBUG_ONLY(klassOop param_k = jniCheck::validate_class(thread, clazz);)
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 #endif // JNICHECK_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 assert(id->is_static_field_id(), "invalid static field id");
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 // Keep JVMTI addition small and only check enabled flag here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 // jni_GetField_probe() assumes that is okay to create handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 if (JvmtiExport::should_post_field_access()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 }
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
1952 jobject ret = JNIHandles::make_local(id->holder()->java_mirror()->obj_field(id->offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1956
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 JNIWrapper("GetStatic" XSTR(Result) "Field"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 DTRACE_PROBE3(hotspot_jni, GetStatic##Result##Field__entry, env, clazz, fieldID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 Return ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 (const Return&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 assert(id->is_static_field_id(), "invalid static field id"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 /* Keep JVMTI addition small and only check enabled flag here. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 /* jni_GetField_probe() assumes that is okay to create handles. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 if (JvmtiExport::should_post_field_access()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 } \
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
1974 ret = id->holder()->java_mirror()-> Fieldname##_field (id->offset()); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1977
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 DEFINE_GETSTATICFIELD(jboolean, bool, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 DEFINE_GETSTATICFIELD(jbyte, byte, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 DEFINE_GETSTATICFIELD(jchar, char, Char)
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 DEFINE_GETSTATICFIELD(jshort, short, Short)
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 DEFINE_GETSTATICFIELD(jint, int, Int)
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 DEFINE_GETSTATICFIELD(jlong, long, Long)
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 DEFINE_GETSTATICFIELD(jfloat, float, Float)
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 DEFINE_GETSTATICFIELD(jdouble, double, Double)
a61af66fc99e Initial load
duke
parents:
diff changeset
1986
a61af66fc99e Initial load
duke
parents:
diff changeset
1987
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value))
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 JNIWrapper("SetStaticObjectField");
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 DTRACE_PROBE4(hotspot_jni, SetStaticObjectField__entry, env, clazz, fieldID, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 assert(id->is_static_field_id(), "invalid static field id");
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 // Keep JVMTI addition small and only check enabled flag here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 // jni_SetField_probe() assumes that is okay to create handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 if (JvmtiExport::should_post_field_modification()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 jvalue field_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 field_value.l = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 }
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
2000 id->holder()->java_mirror()->obj_field_put(id->offset(), JNIHandles::resolve(value));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2003
a61af66fc99e Initial load
duke
parents:
diff changeset
2004
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 JNIWrapper("SetStatic" XSTR(Result) "Field"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 HS_DTRACE_PROBE_CDECL_N(hotspot_jni, SetStatic##Result##Field__entry,\
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 ( JNIEnv*, jclass, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 HS_DTRACE_PROBE_N(hotspot_jni, SetStatic##Result##Field__entry, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 ( env, clazz, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 assert(id->is_static_field_id(), "invalid static field id"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 /* Keep JVMTI addition small and only check enabled flag here. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 /* jni_SetField_probe() assumes that is okay to create handles. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 if (JvmtiExport::should_post_field_modification()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 jvalue field_value; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 field_value.unionType = value; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 } \
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
2023 id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2026
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 DEFINE_SETSTATICFIELD(jboolean, bool, Boolean, 'Z', z)
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 DEFINE_SETSTATICFIELD(jbyte, byte, Byte, 'B', b)
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 DEFINE_SETSTATICFIELD(jchar, char, Char, 'C', c)
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 DEFINE_SETSTATICFIELD(jshort, short, Short, 'S', s)
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 DEFINE_SETSTATICFIELD(jint, int, Int, 'I', i)
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 DEFINE_SETSTATICFIELD(jlong, long, Long, 'J', j)
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 DEFINE_SETSTATICFIELD(jfloat, float, Float, 'F', f)
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 DEFINE_SETSTATICFIELD(jdouble, double, Double, 'D', d)
a61af66fc99e Initial load
duke
parents:
diff changeset
2035
a61af66fc99e Initial load
duke
parents:
diff changeset
2036
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 // String Operations
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 // Unicode Interface
a61af66fc99e Initial load
duke
parents:
diff changeset
2042
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 DT_RETURN_MARK_DECL(NewString, jstring);
a61af66fc99e Initial load
duke
parents:
diff changeset
2044
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 JNI_ENTRY(jstring, jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize len))
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 JNIWrapper("NewString");
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 DTRACE_PROBE3(hotspot_jni, NewString__entry, env, unicodeChars, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 jstring ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 DT_RETURN_MARK(NewString, jstring, (const jstring&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 oop string=java_lang_String::create_oop_from_unicode((jchar*) unicodeChars, len, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 ret = (jstring) JNIHandles::make_local(env, string);
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2054
a61af66fc99e Initial load
duke
parents:
diff changeset
2055
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string))
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 JNIWrapper("GetStringLength");
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 DTRACE_PROBE2(hotspot_jni, GetStringLength__entry, env, string);
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 jsize ret = java_lang_String::length(JNIHandles::resolve_non_null(string));
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 DTRACE_PROBE1(hotspot_jni, GetStringLength__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2063
a61af66fc99e Initial load
duke
parents:
diff changeset
2064
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 JNIEnv *env, jstring string, jboolean *isCopy))
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 JNIWrapper("GetStringChars");
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 DTRACE_PROBE3(hotspot_jni, GetStringChars__entry, env, string, isCopy);
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 //%note jni_5
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 if (isCopy != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 *isCopy = JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 oop s = JNIHandles::resolve_non_null(string);
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 int s_len = java_lang_String::length(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 typeArrayOop s_value = java_lang_String::value(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 int s_offset = java_lang_String::offset(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len + 1); // add one for zero termination
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 if (s_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 buf[s_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 DTRACE_PROBE1(hotspot_jni, GetStringChars__return, buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2085
a61af66fc99e Initial load
duke
parents:
diff changeset
2086
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 JNIWrapper("ReleaseStringChars");
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 DTRACE_PROBE3(hotspot_jni, ReleaseStringChars__entry, env, str, chars);
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 //%note jni_6
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 if (chars != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 // Since String objects are supposed to be immutable, don't copy any
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 // new data back. A bad user will have to go after the char array.
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 FreeHeap((void*) chars);
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 DTRACE_PROBE(hotspot_jni, ReleaseStringChars__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2098
a61af66fc99e Initial load
duke
parents:
diff changeset
2099
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 // UTF Interface
a61af66fc99e Initial load
duke
parents:
diff changeset
2101
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 DT_RETURN_MARK_DECL(NewStringUTF, jstring);
a61af66fc99e Initial load
duke
parents:
diff changeset
2103
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 JNI_ENTRY(jstring, jni_NewStringUTF(JNIEnv *env, const char *bytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 JNIWrapper("NewStringUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 DTRACE_PROBE2(hotspot_jni, NewStringUTF__entry, env, bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 jstring ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 DT_RETURN_MARK(NewStringUTF, jstring, (const jstring&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2109
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 oop result = java_lang_String::create_oop_from_str((char*) bytes, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 ret = (jstring) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2114
a61af66fc99e Initial load
duke
parents:
diff changeset
2115
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 JNI_ENTRY(jsize, jni_GetStringUTFLength(JNIEnv *env, jstring string))
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 JNIWrapper("GetStringUTFLength");
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 DTRACE_PROBE2(hotspot_jni, GetStringUTFLength__entry, env, string);
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 jsize ret = java_lang_String::utf8_length(JNIHandles::resolve_non_null(string));
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 DTRACE_PROBE1(hotspot_jni, GetStringUTFLength__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2123
a61af66fc99e Initial load
duke
parents:
diff changeset
2124
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 JNI_ENTRY(const char*, jni_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy))
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 JNIWrapper("GetStringUTFChars");
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 DTRACE_PROBE3(hotspot_jni, GetStringUTFChars__entry, env, string, isCopy);
1989
017cd8bce8a8 6539281: -Xcheck:jni should validate char* argument to ReleaseStringUTFChars
sla
parents: 1980
diff changeset
2128 oop java_string = JNIHandles::resolve_non_null(string);
017cd8bce8a8 6539281: -Xcheck:jni should validate char* argument to ReleaseStringUTFChars
sla
parents: 1980
diff changeset
2129 size_t length = java_lang_String::utf8_length(java_string);
017cd8bce8a8 6539281: -Xcheck:jni should validate char* argument to ReleaseStringUTFChars
sla
parents: 1980
diff changeset
2130 char* result = AllocateHeap(length + 1, "GetStringUTFChars");
017cd8bce8a8 6539281: -Xcheck:jni should validate char* argument to ReleaseStringUTFChars
sla
parents: 1980
diff changeset
2131 java_lang_String::as_utf8_string(java_string, result, (int) length + 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 if (isCopy != NULL) *isCopy = JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 DTRACE_PROBE1(hotspot_jni, GetStringUTFChars__return, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2136
a61af66fc99e Initial load
duke
parents:
diff changeset
2137
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 JNI_LEAF(void, jni_ReleaseStringUTFChars(JNIEnv *env, jstring str, const char *chars))
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 JNIWrapper("ReleaseStringUTFChars");
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 DTRACE_PROBE3(hotspot_jni, ReleaseStringUTFChars__entry, env, str, chars);
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 if (chars != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 FreeHeap((char*) chars);
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 DTRACE_PROBE(hotspot_jni, ReleaseStringUTFChars__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2146
a61af66fc99e Initial load
duke
parents:
diff changeset
2147
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array))
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 JNIWrapper("GetArrayLength");
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 DTRACE_PROBE2(hotspot_jni, GetArrayLength__entry, env, array);
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 assert(a->is_array(), "must be array");
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 jsize ret = a->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 DTRACE_PROBE1(hotspot_jni, GetArrayLength__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2157
a61af66fc99e Initial load
duke
parents:
diff changeset
2158
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 // Object Array Operations
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2162
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray);
a61af66fc99e Initial load
duke
parents:
diff changeset
2164
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement))
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 JNIWrapper("NewObjectArray");
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 DTRACE_PROBE4(hotspot_jni, NewObjectArray__entry, env, length, elementClass, initialElement);
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 jobjectArray ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 KlassHandle ek(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(elementClass)));
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 klassOop ako = Klass::cast(ek())->array_klass(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 KlassHandle ak = KlassHandle(THREAD, ako);
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 objArrayKlass::cast(ak())->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 objArrayOop result = objArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 oop initial_value = JNIHandles::resolve(initialElement);
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 if (initial_value != NULL) { // array already initialized with NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 result->obj_at_put(index, initial_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 ret = (jobjectArray) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2184
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
2186
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 JNIWrapper("GetObjectArrayElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 DTRACE_PROBE3(hotspot_jni, GetObjectArrayElement__entry, env, array, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 jobject ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 if (a->is_within_bounds(index)) {
1034
08780c8a9f04 6893483: DTrace probe return values for a couple JNI methods are wrong
kamg
parents: 973
diff changeset
2194 ret = JNIHandles::make_local(env, a->obj_at(index));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 char buf[jintAsStringSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 sprintf(buf, "%d", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 THROW_MSG_0(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2202
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement);
a61af66fc99e Initial load
duke
parents:
diff changeset
2204
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value))
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 JNIWrapper("SetObjectArrayElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 DTRACE_PROBE4(hotspot_jni, SetObjectArrayElement__entry, env, array, index, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 DT_VOID_RETURN_MARK(SetObjectArrayElement);
a61af66fc99e Initial load
duke
parents:
diff changeset
2209
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 oop v = JNIHandles::resolve(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 if (a->is_within_bounds(index)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 if (v == NULL || v->is_a(objArrayKlass::cast(a->klass())->element_klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 a->obj_at_put(index, v);
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 THROW(vmSymbols::java_lang_ArrayStoreException());
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 char buf[jintAsStringSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 sprintf(buf, "%d", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 THROW_MSG(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2224
a61af66fc99e Initial load
duke
parents:
diff changeset
2225
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 #define DEFINE_NEWSCALARARRAY(Return,Allocator,Result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 \
1034
08780c8a9f04 6893483: DTrace probe return values for a couple JNI methods are wrong
kamg
parents: 973
diff changeset
2228 DT_RETURN_MARK_DECL(New##Result##Array, Return);\
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 JNI_ENTRY(Return, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 jni_New##Result##Array(JNIEnv *env, jsize len)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 JNIWrapper("New" XSTR(Result) "Array"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 DTRACE_PROBE2(hotspot_jni, New##Result##Array__entry, env, len);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 Return ret = NULL;\
1034
08780c8a9f04 6893483: DTrace probe return values for a couple JNI methods are wrong
kamg
parents: 973
diff changeset
2235 DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 oop obj= oopFactory::Allocator(len, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 ret = (Return) JNIHandles::make_local(env, obj); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2241
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 DEFINE_NEWSCALARARRAY(jbooleanArray, new_boolArray, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 DEFINE_NEWSCALARARRAY(jbyteArray, new_byteArray, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 DEFINE_NEWSCALARARRAY(jshortArray, new_shortArray, Short)
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 DEFINE_NEWSCALARARRAY(jcharArray, new_charArray, Char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 DEFINE_NEWSCALARARRAY(jintArray, new_intArray, Int)
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 DEFINE_NEWSCALARARRAY(jlongArray, new_longArray, Long)
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 DEFINE_NEWSCALARARRAY(jfloatArray, new_singleArray, Float)
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 DEFINE_NEWSCALARARRAY(jdoubleArray, new_doubleArray, Double)
a61af66fc99e Initial load
duke
parents:
diff changeset
2250
a61af66fc99e Initial load
duke
parents:
diff changeset
2251
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 // Return an address which will fault if the caller writes to it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2253
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 static char* get_bad_address() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 static char* bad_address = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 if (bad_address == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 size_t size = os::vm_allocation_granularity();
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 bad_address = os::reserve_memory(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 if (bad_address != NULL) {
477
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 237
diff changeset
2260 os::protect_memory(bad_address, size, os::MEM_PROT_READ,
24fda36852ce 6727377: VM stack guard pages on Windows should PAGE_READWRITE not PAGE_EXECUTE_READWRITE
coleenp
parents: 237
diff changeset
2261 /*is_committed*/false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 return bad_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2266
a61af66fc99e Initial load
duke
parents:
diff changeset
2267
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 JNI_QUICK_ENTRY(ElementType*, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 DTRACE_PROBE3(hotspot_jni, Get##Result##ArrayElements__entry, env, array, isCopy);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 /* allocate an chunk of memory in c land */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 ElementType* result; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 int len = a->length(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 if (len == 0) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 /* Empty array: legal but useless, can't return NULL. \
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 * Return a pointer to something useless. \
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 * Avoid asserts in typeArrayOop. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 result = (ElementType*)get_bad_address(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 result = NEW_C_HEAP_ARRAY(ElementType, len); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 /* copy the array to the c chunk */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 if (isCopy) *isCopy = JNI_TRUE; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 DTRACE_PROBE1(hotspot_jni, Get##Result##ArrayElements__return, result);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 return result; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2292
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 DEFINE_GETSCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 DEFINE_GETSCALARARRAYELEMENTS(T_SHORT, jshort, Short, short)
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 DEFINE_GETSCALARARRAYELEMENTS(T_CHAR, jchar, Char, char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 DEFINE_GETSCALARARRAYELEMENTS(T_INT, jint, Int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 DEFINE_GETSCALARARRAYELEMENTS(T_LONG, jlong, Long, long)
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float)
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double)
a61af66fc99e Initial load
duke
parents:
diff changeset
2301
a61af66fc99e Initial load
duke
parents:
diff changeset
2302
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 JNI_QUICK_ENTRY(void, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 ElementType *buf, jint mode)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 DTRACE_PROBE4(hotspot_jni, Release##Result##ArrayElements__entry, env, array, buf, mode);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 int len = a->length(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 if (len != 0) { /* Empty array: nothing to free or copy. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 if ((mode == 0) || (mode == JNI_COMMIT)) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 if ((mode == 0) || (mode == JNI_ABORT)) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 FreeHeap(buf); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 DTRACE_PROBE(hotspot_jni, Release##Result##ArrayElements__return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2322
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT, jshort, Short, short)
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR, jchar, Char, char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 DEFINE_RELEASESCALARARRAYELEMENTS(T_INT, jint, Int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 DEFINE_RELEASESCALARARRAYELEMENTS(T_LONG, jlong, Long, long)
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 DEFINE_RELEASESCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float)
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double)
a61af66fc99e Initial load
duke
parents:
diff changeset
2331
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 #define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 JNI_ENTRY(void, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 jsize len, ElementType *buf)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 DTRACE_PROBE5(hotspot_jni, Get##Result##ArrayRegion__entry, env, array, start, len, buf);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 if (len > 0) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 int sc = typeArrayKlass::cast(src->klass())->log2_element_size(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 memcpy((u_char*) buf, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 (u_char*) src->Tag##_at_addr(start), \
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 len << sc); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2353
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 DEFINE_GETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 DEFINE_GETSCALARARRAYREGION(T_SHORT, jshort, Short, short)
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 DEFINE_GETSCALARARRAYREGION(T_CHAR, jchar, Char, char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 DEFINE_GETSCALARARRAYREGION(T_INT, jint, Int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 DEFINE_GETSCALARARRAYREGION(T_LONG, jlong, Long, long)
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 DEFINE_GETSCALARARRAYREGION(T_FLOAT, jfloat, Float, float)
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 DEFINE_GETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double)
a61af66fc99e Initial load
duke
parents:
diff changeset
2362
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 #define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 JNI_ENTRY(void, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 jsize len, const ElementType *buf)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 DTRACE_PROBE5(hotspot_jni, Set##Result##ArrayRegion__entry, env, array, start, len, buf);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 if (len > 0) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 int sc = typeArrayKlass::cast(dst->klass())->log2_element_size(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 memcpy((u_char*) dst->Tag##_at_addr(start), \
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 (u_char*) buf, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 len << sc); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2384
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 DEFINE_SETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 DEFINE_SETSCALARARRAYREGION(T_SHORT, jshort, Short, short)
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 DEFINE_SETSCALARARRAYREGION(T_CHAR, jchar, Char, char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 DEFINE_SETSCALARARRAYREGION(T_INT, jint, Int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 DEFINE_SETSCALARARRAYREGION(T_LONG, jlong, Long, long)
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 DEFINE_SETSCALARARRAYREGION(T_FLOAT, jfloat, Float, float)
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 DEFINE_SETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double)
a61af66fc99e Initial load
duke
parents:
diff changeset
2393
a61af66fc99e Initial load
duke
parents:
diff changeset
2394
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 // Interception of natives
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2398
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 // The RegisterNatives call being attempted tried to register with a method that
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 // is not native. Ask JVM TI what prefixes have been specified. Then check
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 // to see if the native method is now wrapped with the prefixes. See the
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 // SetNativeMethodPrefix(es) functions in the JVM TI Spec for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 static methodOop find_prefixed_native(KlassHandle k,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2404 Symbol* name, Symbol* signature, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 methodOop method;
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 int name_len = name->utf8_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 char* name_str = name->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 int prefix_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 char** prefixes = JvmtiExport::get_all_native_method_prefixes(&prefix_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 for (int i = 0; i < prefix_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 char* prefix = prefixes[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 int prefix_len = (int)strlen(prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
2414
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 // try adding this prefix to the method name and see if it matches another method name
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 int trial_len = name_len + prefix_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 char* trial_name_str = NEW_RESOURCE_ARRAY(char, trial_len + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 strcpy(trial_name_str, prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 strcat(trial_name_str, name_str);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2420 TempNewSymbol trial_name = SymbolTable::probe(trial_name_str, trial_len);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2421 if (trial_name == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 continue; // no such symbol, so this prefix wasn't used, try the next prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2424 method = Klass::cast(k())->lookup_method(trial_name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 if (method == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 continue; // signature doesn't match, try the next prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 if (method->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 method->set_is_prefixed_native();
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 return method; // wahoo, we found a prefixed version of the method, return it
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 // found as non-native, so prefix is good, add it, probably just need more prefixes
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 name_len = trial_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 name_str = trial_name_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 return NULL; // not found
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2438
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2439 static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2440 methodOop method = Klass::cast(k())->lookup_method(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 if (method == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 st.print("Method %s name or signature does not match",
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2445 methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name, signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 if (!method->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 // trying to register to a non-native method, see if a JVM TI agent has added prefix(es)
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 method = find_prefixed_native(k, name, signature, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 if (method == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 st.print("Method %s is not declared as native",
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2455 methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name, signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2459
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 if (entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 method->set_native_function(entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 methodOopDesc::native_bind_event_is_interesting);
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 method->clear_native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 if (PrintJNIResolving) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 tty->print_cr("[Registering JNI native method %s.%s]",
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 Klass::cast(method->method_holder())->external_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 method->name()->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2474
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 DT_RETURN_MARK_DECL(RegisterNatives, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
2476
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 const JNINativeMethod *methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 jint nMethods))
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 JNIWrapper("RegisterNatives");
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 DTRACE_PROBE4(hotspot_jni, RegisterNatives__entry, env, clazz, methods, nMethods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 jint ret = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 DT_RETURN_MARK(RegisterNatives, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2484
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 KlassHandle h_k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
a61af66fc99e Initial load
duke
parents:
diff changeset
2486
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 for (int index = 0; index < nMethods; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 const char* meth_name = methods[index].name;
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 const char* meth_sig = methods[index].signature;
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 int meth_name_len = (int)strlen(meth_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2491
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 // The class should have been loaded (we have an instance of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 // passed in) so the method and signature should already be in the symbol
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 // table. If they're not there, the method doesn't exist.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2495 TempNewSymbol name = SymbolTable::probe(meth_name, meth_name_len);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2496 TempNewSymbol signature = SymbolTable::probe(meth_sig, (int)strlen(meth_sig));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2497
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2498 if (name == NULL || signature == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 st.print("Method %s.%s%s not found", Klass::cast(h_k())->external_name(), meth_name, meth_sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 // Must return negative value on failure
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2505
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 bool res = register_native(h_k, name, signature,
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 (address) methods[index].fnPtr, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 if (!res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 ret = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2515
a61af66fc99e Initial load
duke
parents:
diff changeset
2516
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 JNI_ENTRY(jint, jni_UnregisterNatives(JNIEnv *env, jclass clazz))
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 JNIWrapper("UnregisterNatives");
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 DTRACE_PROBE2(hotspot_jni, UnregisterNatives__entry, env, clazz);
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz));
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 //%note jni_2
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 if (Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 for (int index = 0; index < instanceKlass::cast(k)->methods()->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 methodOop m = methodOop(instanceKlass::cast(k)->methods()->obj_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 if (m->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 m->clear_native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 m->set_signature_handler(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 DTRACE_PROBE1(hotspot_jni, UnregisterNatives__return, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2534
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 // Monitor functions
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2538
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 DT_RETURN_MARK_DECL(MonitorEnter, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
2540
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 JNI_ENTRY(jint, jni_MonitorEnter(JNIEnv *env, jobject jobj))
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 DTRACE_PROBE2(hotspot_jni, MonitorEnter__entry, env, jobj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 jint ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 DT_RETURN_MARK(MonitorEnter, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2545
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 // If the object is null, we can't do anything with it
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 if (jobj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2550
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 Handle obj(thread, JNIHandles::resolve_non_null(jobj));
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR));
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2556
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 DT_RETURN_MARK_DECL(MonitorExit, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
2558
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 JNI_ENTRY(jint, jni_MonitorExit(JNIEnv *env, jobject jobj))
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 DTRACE_PROBE2(hotspot_jni, MonitorExit__entry, env, jobj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 jint ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 DT_RETURN_MARK(MonitorExit, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2563
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 // Don't do anything with a null object
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 if (jobj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2568
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 Handle obj(THREAD, JNIHandles::resolve_non_null(jobj));
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR));
a61af66fc99e Initial load
duke
parents:
diff changeset
2571
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2575
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 // Extensions
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2579
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 DT_VOID_RETURN_MARK_DECL(GetStringRegion);
a61af66fc99e Initial load
duke
parents:
diff changeset
2581
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 JNIWrapper("GetStringRegion");
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 DTRACE_PROBE5(hotspot_jni, GetStringRegion__entry, env, string, start, len, buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 DT_VOID_RETURN_MARK(GetStringRegion);
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 oop s = JNIHandles::resolve_non_null(string);
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 int s_len = java_lang_String::length(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 if (start < 0 || len < 0 || start + len > s_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 if (len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 int s_offset = java_lang_String::offset(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 typeArrayOop s_value = java_lang_String::value(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2598
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion);
a61af66fc99e Initial load
duke
parents:
diff changeset
2600
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 JNIWrapper("GetStringUTFRegion");
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 DTRACE_PROBE5(hotspot_jni, GetStringUTFRegion__entry, env, string, start, len, buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 DT_VOID_RETURN_MARK(GetStringUTFRegion);
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 oop s = JNIHandles::resolve_non_null(string);
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 int s_len = java_lang_String::length(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 if (start < 0 || len < 0 || start + len > s_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 //%note jni_7
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 if (len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 char *utf_region = java_lang_String::as_utf8_string(s, start, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 int utf_len = (int)strlen(utf_region);
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 memcpy(buf, utf_region, utf_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 buf[utf_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 // JDK null-terminates the buffer even in len is zero
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 if (buf != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 buf[0] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2625
a61af66fc99e Initial load
duke
parents:
diff changeset
2626
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 JNIWrapper("GetPrimitiveArrayCritical");
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 DTRACE_PROBE3(hotspot_jni, GetPrimitiveArrayCritical__entry, env, array, isCopy);
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 GC_locker::lock_critical(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 if (isCopy != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 *isCopy = JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 oop a = JNIHandles::resolve_non_null(array);
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 assert(a->is_array(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 BasicType type;
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 if (a->is_objArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 type = T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 type = typeArrayKlass::cast(a->klass())->element_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 void* ret = arrayOop(a)->base(type);
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 DTRACE_PROBE1(hotspot_jni, GetPrimitiveArrayCritical__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2646
a61af66fc99e Initial load
duke
parents:
diff changeset
2647
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 JNIWrapper("ReleasePrimitiveArrayCritical");
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 DTRACE_PROBE4(hotspot_jni, ReleasePrimitiveArrayCritical__entry, env, array, carray, mode);
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 // The array, carray and mode arguments are ignored
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 GC_locker::unlock_critical(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 DTRACE_PROBE(hotspot_jni, ReleasePrimitiveArrayCritical__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2655
a61af66fc99e Initial load
duke
parents:
diff changeset
2656
a61af66fc99e Initial load
duke
parents:
diff changeset
2657 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 JNIWrapper("GetStringCritical");
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 DTRACE_PROBE3(hotspot_jni, GetStringCritical__entry, env, string, isCopy);
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 GC_locker::lock_critical(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 if (isCopy != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 *isCopy = JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 oop s = JNIHandles::resolve_non_null(string);
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 int s_len = java_lang_String::length(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 typeArrayOop s_value = java_lang_String::value(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 int s_offset = java_lang_String::offset(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 const jchar* ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 if (s_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 ret = s_value->char_at_addr(s_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 ret = (jchar*) s_value->base(T_CHAR);
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 DTRACE_PROBE1(hotspot_jni, GetStringCritical__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2677
a61af66fc99e Initial load
duke
parents:
diff changeset
2678
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 JNIWrapper("ReleaseStringCritical");
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 DTRACE_PROBE3(hotspot_jni, ReleaseStringCritical__entry, env, str, chars);
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 // The str and chars arguments are ignored
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 GC_locker::unlock_critical(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 DTRACE_PROBE(hotspot_jni, ReleaseStringCritical__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2686
a61af66fc99e Initial load
duke
parents:
diff changeset
2687
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 JNIWrapper("jni_NewWeakGlobalRef");
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 DTRACE_PROBE2(hotspot_jni, NewWeakGlobalRef__entry, env, ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 Handle ref_handle(thread, JNIHandles::resolve(ref));
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 jweak ret = JNIHandles::make_weak_global(ref_handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 DTRACE_PROBE1(hotspot_jni, NewWeakGlobalRef__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2696
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 // Must be JNI_ENTRY (with HandleMark)
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
2699 JNIWrapper("jni_DeleteWeakGlobalRef");
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 DTRACE_PROBE2(hotspot_jni, DeleteWeakGlobalRef__entry, env, ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 JNIHandles::destroy_weak_global(ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 DTRACE_PROBE(hotspot_jni, DeleteWeakGlobalRef__return);
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2704
a61af66fc99e Initial load
duke
parents:
diff changeset
2705
a61af66fc99e Initial load
duke
parents:
diff changeset
2706 JNI_QUICK_ENTRY(jboolean, jni_ExceptionCheck(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 JNIWrapper("jni_ExceptionCheck");
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 DTRACE_PROBE1(hotspot_jni, ExceptionCheck__entry, env);
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 jni_check_async_exceptions(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 jboolean ret = (thread->has_pending_exception()) ? JNI_TRUE : JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 DTRACE_PROBE1(hotspot_jni, ExceptionCheck__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2714
a61af66fc99e Initial load
duke
parents:
diff changeset
2715
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 // Initialization state for three routines below relating to
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 // java.nio.DirectBuffers
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 static jint directBufferSupportInitializeStarted = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 static volatile jint directBufferSupportInitializeEnded = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 static volatile jint directBufferSupportInitializeFailed = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 static jclass bufferClass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 static jclass directBufferClass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 static jclass directByteBufferClass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 static jmethodID directByteBufferConstructor = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 static jfieldID directBufferAddressField = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 static jfieldID bufferCapacityField = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2727
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 static jclass lookupOne(JNIEnv* env, const char* name, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 Handle loader; // null (bootstrap) loader
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 Handle protection_domain; // null protection domain
a61af66fc99e Initial load
duke
parents:
diff changeset
2731
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2732 TempNewSymbol sym = SymbolTable::new_symbol(name, CHECK_NULL);
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
2733 jclass result = find_class_from_class_loader(env, sym, true, loader, protection_domain, true, CHECK_NULL);
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
2734
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
2735 if (TraceClassResolution && result != NULL) {
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
2736 trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
2737 }
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
2738 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2740
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 // These lookups are done with the NULL (bootstrap) ClassLoader to
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 // circumvent any security checks that would be done by jni_FindClass.
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 JNI_ENTRY(bool, lookupDirectBufferClasses(JNIEnv* env))
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 if ((bufferClass = lookupOne(env, "java/nio/Buffer", thread)) == NULL) { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 if ((directBufferClass = lookupOne(env, "sun/nio/ch/DirectBuffer", thread)) == NULL) { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 if ((directByteBufferClass = lookupOne(env, "java/nio/DirectByteBuffer", thread)) == NULL) { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2751
a61af66fc99e Initial load
duke
parents:
diff changeset
2752
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 static bool initializeDirectBufferSupport(JNIEnv* env, JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2754 if (directBufferSupportInitializeFailed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2757
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 if (Atomic::cmpxchg(1, &directBufferSupportInitializeStarted, 0) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2759 if (!lookupDirectBufferClasses(env)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2760 directBufferSupportInitializeFailed = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2763
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 // Make global references for these
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 bufferClass = (jclass) env->NewGlobalRef(bufferClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 directBufferClass = (jclass) env->NewGlobalRef(directBufferClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 directByteBufferClass = (jclass) env->NewGlobalRef(directByteBufferClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2768
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 // Get needed field and method IDs
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 directByteBufferConstructor = env->GetMethodID(directByteBufferClass, "<init>", "(JI)V");
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 directBufferAddressField = env->GetFieldID(bufferClass, "address", "J");
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 bufferCapacityField = env->GetFieldID(bufferClass, "capacity", "I");
a61af66fc99e Initial load
duke
parents:
diff changeset
2773
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 if ((directByteBufferConstructor == NULL) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 (directBufferAddressField == NULL) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 (bufferCapacityField == NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2777 directBufferSupportInitializeFailed = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2778 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2780
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 directBufferSupportInitializeEnded = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 while (!directBufferSupportInitializeEnded && !directBufferSupportInitializeFailed) {
521
4db4e58c16bd 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 477
diff changeset
2784 // Set state as yield_all can call os:sleep. On Solaris, yield_all calls
4db4e58c16bd 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 477
diff changeset
2785 // os::sleep which requires the VM state transition. On other platforms, it
4db4e58c16bd 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 477
diff changeset
2786 // is not necessary. The following call to change the VM state is purposely
4db4e58c16bd 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 477
diff changeset
2787 // put inside the loop to avoid potential deadlock when multiple threads
4db4e58c16bd 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 477
diff changeset
2788 // try to call this method. See 6791815 for more details.
4db4e58c16bd 6791815: Fix for 6471657 can cause deadlock on non-Solaris platforms when initializing direct buffer support
xlu
parents: 477
diff changeset
2789 ThreadInVMfromNative tivn(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 os::yield_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2793
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 return !directBufferSupportInitializeFailed;
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2796
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 extern "C" jobject JNICALL jni_NewDirectByteBuffer(JNIEnv *env, void* address, jlong capacity)
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 // thread_from_jni_environment() will block if VM is gone.
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
a61af66fc99e Initial load
duke
parents:
diff changeset
2801
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 JNIWrapper("jni_NewDirectByteBuffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 DTRACE_PROBE3(hotspot_jni, NewDirectByteBuffer__entry, env, address, capacity);
a61af66fc99e Initial load
duke
parents:
diff changeset
2804
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 if (!directBufferSupportInitializeEnded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 if (!initializeDirectBufferSupport(env, thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2811
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 // Being paranoid about accidental sign extension on address
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 jlong addr = (jlong) ((uintptr_t) address);
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 // NOTE that package-private DirectByteBuffer constructor currently
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 // takes int capacity
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 jint cap = (jint) capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 jobject ret = env->NewObject(directByteBufferClass, directByteBufferConstructor, addr, cap);
a61af66fc99e Initial load
duke
parents:
diff changeset
2818 DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2821
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 DT_RETURN_MARK_DECL(GetDirectBufferAddress, void*);
a61af66fc99e Initial load
duke
parents:
diff changeset
2823
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 extern "C" void* JNICALL jni_GetDirectBufferAddress(JNIEnv *env, jobject buf)
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 // thread_from_jni_environment() will block if VM is gone.
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
a61af66fc99e Initial load
duke
parents:
diff changeset
2828
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 JNIWrapper("jni_GetDirectBufferAddress");
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 DTRACE_PROBE2(hotspot_jni, GetDirectBufferAddress__entry, env, buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 void* ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 DT_RETURN_MARK(GetDirectBufferAddress, void*, (const void*&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2833
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 if (!directBufferSupportInitializeEnded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 if (!initializeDirectBufferSupport(env, thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2839
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 if ((buf != NULL) && (!env->IsInstanceOf(buf, directBufferClass))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2843
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 ret = (void*)(intptr_t)env->GetLongField(buf, directBufferAddressField);
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2847
a61af66fc99e Initial load
duke
parents:
diff changeset
2848 DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2849
a61af66fc99e Initial load
duke
parents:
diff changeset
2850 extern "C" jlong JNICALL jni_GetDirectBufferCapacity(JNIEnv *env, jobject buf)
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 // thread_from_jni_environment() will block if VM is gone.
a61af66fc99e Initial load
duke
parents:
diff changeset
2853 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
a61af66fc99e Initial load
duke
parents:
diff changeset
2854
a61af66fc99e Initial load
duke
parents:
diff changeset
2855 JNIWrapper("jni_GetDirectBufferCapacity");
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 DTRACE_PROBE2(hotspot_jni, GetDirectBufferCapacity__entry, env, buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 jlong ret = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 DT_RETURN_MARK(GetDirectBufferCapacity, jlong, (const jlong&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2859
a61af66fc99e Initial load
duke
parents:
diff changeset
2860 if (!directBufferSupportInitializeEnded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 if (!initializeDirectBufferSupport(env, thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 ret = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2866
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 if (buf == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2868 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2869 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2870
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 if (!env->IsInstanceOf(buf, directBufferClass)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2872 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2874
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 // NOTE that capacity is currently an int in the implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 ret = env->GetIntField(buf, bufferCapacityField);
a61af66fc99e Initial load
duke
parents:
diff changeset
2877 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2879
a61af66fc99e Initial load
duke
parents:
diff changeset
2880
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 JNI_LEAF(jint, jni_GetVersion(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 JNIWrapper("GetVersion");
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 DTRACE_PROBE1(hotspot_jni, GetVersion__entry, env);
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 DTRACE_PROBE1(hotspot_jni, GetVersion__return, CurrentVersion);
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 return CurrentVersion;
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2887
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 extern struct JavaVM_ main_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2889
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 JNIWrapper("jni_GetJavaVM");
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 DTRACE_PROBE2(hotspot_jni, GetJavaVM__entry, env, vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 *vm = (JavaVM *)(&main_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 DTRACE_PROBE1(hotspot_jni, GetJavaVM__return, JNI_OK);
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2897
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 // Structure containing all jni functions
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 struct JNINativeInterface_ jni_NativeInterface = {
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
2903
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
2905
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 jni_GetVersion,
a61af66fc99e Initial load
duke
parents:
diff changeset
2907
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 jni_DefineClass,
a61af66fc99e Initial load
duke
parents:
diff changeset
2909 jni_FindClass,
a61af66fc99e Initial load
duke
parents:
diff changeset
2910
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 jni_FromReflectedMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 jni_FromReflectedField,
a61af66fc99e Initial load
duke
parents:
diff changeset
2913
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 jni_ToReflectedMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2915
a61af66fc99e Initial load
duke
parents:
diff changeset
2916 jni_GetSuperclass,
a61af66fc99e Initial load
duke
parents:
diff changeset
2917 jni_IsAssignableFrom,
a61af66fc99e Initial load
duke
parents:
diff changeset
2918
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 jni_ToReflectedField,
a61af66fc99e Initial load
duke
parents:
diff changeset
2920
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 jni_Throw,
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 jni_ThrowNew,
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 jni_ExceptionOccurred,
a61af66fc99e Initial load
duke
parents:
diff changeset
2924 jni_ExceptionDescribe,
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 jni_ExceptionClear,
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 jni_FatalError,
a61af66fc99e Initial load
duke
parents:
diff changeset
2927
a61af66fc99e Initial load
duke
parents:
diff changeset
2928 jni_PushLocalFrame,
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 jni_PopLocalFrame,
a61af66fc99e Initial load
duke
parents:
diff changeset
2930
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 jni_NewGlobalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
2932 jni_DeleteGlobalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 jni_DeleteLocalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 jni_IsSameObject,
a61af66fc99e Initial load
duke
parents:
diff changeset
2935
a61af66fc99e Initial load
duke
parents:
diff changeset
2936 jni_NewLocalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
2937 jni_EnsureLocalCapacity,
a61af66fc99e Initial load
duke
parents:
diff changeset
2938
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 jni_AllocObject,
a61af66fc99e Initial load
duke
parents:
diff changeset
2940 jni_NewObject,
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 jni_NewObjectV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2942 jni_NewObjectA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2943
a61af66fc99e Initial load
duke
parents:
diff changeset
2944 jni_GetObjectClass,
a61af66fc99e Initial load
duke
parents:
diff changeset
2945 jni_IsInstanceOf,
a61af66fc99e Initial load
duke
parents:
diff changeset
2946
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 jni_GetMethodID,
a61af66fc99e Initial load
duke
parents:
diff changeset
2948
a61af66fc99e Initial load
duke
parents:
diff changeset
2949 jni_CallObjectMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 jni_CallObjectMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 jni_CallObjectMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 jni_CallBooleanMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2953 jni_CallBooleanMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 jni_CallBooleanMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 jni_CallByteMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2956 jni_CallByteMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2957 jni_CallByteMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 jni_CallCharMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 jni_CallCharMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2960 jni_CallCharMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2961 jni_CallShortMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 jni_CallShortMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 jni_CallShortMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 jni_CallIntMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2965 jni_CallIntMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 jni_CallIntMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2967 jni_CallLongMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2968 jni_CallLongMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 jni_CallLongMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 jni_CallFloatMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 jni_CallFloatMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 jni_CallFloatMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2973 jni_CallDoubleMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2974 jni_CallDoubleMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2975 jni_CallDoubleMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 jni_CallVoidMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 jni_CallVoidMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2978 jni_CallVoidMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2979
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 jni_CallNonvirtualObjectMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2981 jni_CallNonvirtualObjectMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 jni_CallNonvirtualObjectMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2983 jni_CallNonvirtualBooleanMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2984 jni_CallNonvirtualBooleanMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 jni_CallNonvirtualBooleanMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 jni_CallNonvirtualByteMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 jni_CallNonvirtualByteMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 jni_CallNonvirtualByteMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 jni_CallNonvirtualCharMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 jni_CallNonvirtualCharMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 jni_CallNonvirtualCharMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 jni_CallNonvirtualShortMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 jni_CallNonvirtualShortMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 jni_CallNonvirtualShortMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 jni_CallNonvirtualIntMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 jni_CallNonvirtualIntMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 jni_CallNonvirtualIntMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 jni_CallNonvirtualLongMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 jni_CallNonvirtualLongMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 jni_CallNonvirtualLongMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 jni_CallNonvirtualFloatMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 jni_CallNonvirtualFloatMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 jni_CallNonvirtualFloatMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 jni_CallNonvirtualDoubleMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 jni_CallNonvirtualDoubleMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 jni_CallNonvirtualDoubleMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 jni_CallNonvirtualVoidMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 jni_CallNonvirtualVoidMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 jni_CallNonvirtualVoidMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3010
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 jni_GetFieldID,
a61af66fc99e Initial load
duke
parents:
diff changeset
3012
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 jni_GetObjectField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 jni_GetBooleanField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 jni_GetByteField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 jni_GetCharField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 jni_GetShortField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 jni_GetIntField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 jni_GetLongField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 jni_GetFloatField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 jni_GetDoubleField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3022
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 jni_SetObjectField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 jni_SetBooleanField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 jni_SetByteField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 jni_SetCharField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 jni_SetShortField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 jni_SetIntField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3029 jni_SetLongField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 jni_SetFloatField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 jni_SetDoubleField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3032
a61af66fc99e Initial load
duke
parents:
diff changeset
3033 jni_GetStaticMethodID,
a61af66fc99e Initial load
duke
parents:
diff changeset
3034
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 jni_CallStaticObjectMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 jni_CallStaticObjectMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 jni_CallStaticObjectMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 jni_CallStaticBooleanMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 jni_CallStaticBooleanMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3040 jni_CallStaticBooleanMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 jni_CallStaticByteMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3042 jni_CallStaticByteMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3043 jni_CallStaticByteMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3044 jni_CallStaticCharMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 jni_CallStaticCharMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3046 jni_CallStaticCharMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3047 jni_CallStaticShortMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3048 jni_CallStaticShortMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3049 jni_CallStaticShortMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3050 jni_CallStaticIntMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3051 jni_CallStaticIntMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3052 jni_CallStaticIntMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 jni_CallStaticLongMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3054 jni_CallStaticLongMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 jni_CallStaticLongMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3056 jni_CallStaticFloatMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3057 jni_CallStaticFloatMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3058 jni_CallStaticFloatMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3059 jni_CallStaticDoubleMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3060 jni_CallStaticDoubleMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3061 jni_CallStaticDoubleMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3062 jni_CallStaticVoidMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
3063 jni_CallStaticVoidMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 jni_CallStaticVoidMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
3065
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 jni_GetStaticFieldID,
a61af66fc99e Initial load
duke
parents:
diff changeset
3067
a61af66fc99e Initial load
duke
parents:
diff changeset
3068 jni_GetStaticObjectField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 jni_GetStaticBooleanField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 jni_GetStaticByteField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3071 jni_GetStaticCharField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 jni_GetStaticShortField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 jni_GetStaticIntField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 jni_GetStaticLongField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 jni_GetStaticFloatField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 jni_GetStaticDoubleField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3077
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 jni_SetStaticObjectField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 jni_SetStaticBooleanField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 jni_SetStaticByteField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3081 jni_SetStaticCharField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 jni_SetStaticShortField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3083 jni_SetStaticIntField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3084 jni_SetStaticLongField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 jni_SetStaticFloatField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3086 jni_SetStaticDoubleField,
a61af66fc99e Initial load
duke
parents:
diff changeset
3087
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 jni_NewString,
a61af66fc99e Initial load
duke
parents:
diff changeset
3089 jni_GetStringLength,
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 jni_GetStringChars,
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 jni_ReleaseStringChars,
a61af66fc99e Initial load
duke
parents:
diff changeset
3092
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 jni_NewStringUTF,
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 jni_GetStringUTFLength,
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 jni_GetStringUTFChars,
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 jni_ReleaseStringUTFChars,
a61af66fc99e Initial load
duke
parents:
diff changeset
3097
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 jni_GetArrayLength,
a61af66fc99e Initial load
duke
parents:
diff changeset
3099
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 jni_NewObjectArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3101 jni_GetObjectArrayElement,
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 jni_SetObjectArrayElement,
a61af66fc99e Initial load
duke
parents:
diff changeset
3103
a61af66fc99e Initial load
duke
parents:
diff changeset
3104 jni_NewBooleanArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3105 jni_NewByteArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3106 jni_NewCharArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3107 jni_NewShortArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3108 jni_NewIntArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3109 jni_NewLongArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3110 jni_NewFloatArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3111 jni_NewDoubleArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3112
a61af66fc99e Initial load
duke
parents:
diff changeset
3113 jni_GetBooleanArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3114 jni_GetByteArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 jni_GetCharArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 jni_GetShortArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 jni_GetIntArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 jni_GetLongArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 jni_GetFloatArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 jni_GetDoubleArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3121
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 jni_ReleaseBooleanArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 jni_ReleaseByteArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 jni_ReleaseCharArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3125 jni_ReleaseShortArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3126 jni_ReleaseIntArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 jni_ReleaseLongArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3128 jni_ReleaseFloatArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3129 jni_ReleaseDoubleArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
3130
a61af66fc99e Initial load
duke
parents:
diff changeset
3131 jni_GetBooleanArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 jni_GetByteArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 jni_GetCharArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 jni_GetShortArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3135 jni_GetIntArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3136 jni_GetLongArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 jni_GetFloatArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 jni_GetDoubleArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3139
a61af66fc99e Initial load
duke
parents:
diff changeset
3140 jni_SetBooleanArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3141 jni_SetByteArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3142 jni_SetCharArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3143 jni_SetShortArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3144 jni_SetIntArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 jni_SetLongArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3146 jni_SetFloatArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3147 jni_SetDoubleArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3148
a61af66fc99e Initial load
duke
parents:
diff changeset
3149 jni_RegisterNatives,
a61af66fc99e Initial load
duke
parents:
diff changeset
3150 jni_UnregisterNatives,
a61af66fc99e Initial load
duke
parents:
diff changeset
3151
a61af66fc99e Initial load
duke
parents:
diff changeset
3152 jni_MonitorEnter,
a61af66fc99e Initial load
duke
parents:
diff changeset
3153 jni_MonitorExit,
a61af66fc99e Initial load
duke
parents:
diff changeset
3154
a61af66fc99e Initial load
duke
parents:
diff changeset
3155 jni_GetJavaVM,
a61af66fc99e Initial load
duke
parents:
diff changeset
3156
a61af66fc99e Initial load
duke
parents:
diff changeset
3157 jni_GetStringRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3158 jni_GetStringUTFRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
3159
a61af66fc99e Initial load
duke
parents:
diff changeset
3160 jni_GetPrimitiveArrayCritical,
a61af66fc99e Initial load
duke
parents:
diff changeset
3161 jni_ReleasePrimitiveArrayCritical,
a61af66fc99e Initial load
duke
parents:
diff changeset
3162
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 jni_GetStringCritical,
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 jni_ReleaseStringCritical,
a61af66fc99e Initial load
duke
parents:
diff changeset
3165
a61af66fc99e Initial load
duke
parents:
diff changeset
3166 jni_NewWeakGlobalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 jni_DeleteWeakGlobalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
3168
a61af66fc99e Initial load
duke
parents:
diff changeset
3169 jni_ExceptionCheck,
a61af66fc99e Initial load
duke
parents:
diff changeset
3170
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 jni_NewDirectByteBuffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
3172 jni_GetDirectBufferAddress,
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 jni_GetDirectBufferCapacity,
a61af66fc99e Initial load
duke
parents:
diff changeset
3174
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 // New 1_6 features
a61af66fc99e Initial load
duke
parents:
diff changeset
3176
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 jni_GetObjectRefType
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 };
a61af66fc99e Initial load
duke
parents:
diff changeset
3179
a61af66fc99e Initial load
duke
parents:
diff changeset
3180
a61af66fc99e Initial load
duke
parents:
diff changeset
3181 // For jvmti use to modify jni function table.
a61af66fc99e Initial load
duke
parents:
diff changeset
3182 // Java threads in native contiues to run until it is transitioned
a61af66fc99e Initial load
duke
parents:
diff changeset
3183 // to VM at safepoint. Before the transition or before it is blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
3184 // for safepoint it may access jni function table. VM could crash if
a61af66fc99e Initial load
duke
parents:
diff changeset
3185 // any java thread access the jni function table in the middle of memcpy.
a61af66fc99e Initial load
duke
parents:
diff changeset
3186 // To avoid this each function pointers are copied automically.
a61af66fc99e Initial load
duke
parents:
diff changeset
3187 void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3188 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 intptr_t *a = (intptr_t *) jni_functions();
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 intptr_t *b = (intptr_t *) new_jni_NativeInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 for (uint i=0; i < sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3192 Atomic::store_ptr(*b++, a++);
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3195
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 void quicken_jni_functions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3197 // Replace Get<Primitive>Field with fast versions
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 if (UseFastJNIAccessors && !JvmtiExport::can_post_field_access()
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 && !VerifyJNIFields && !TraceJNICalls && !CountJNICalls && !CheckJNICalls
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 #if defined(_WINDOWS) && defined(IA32) && defined(COMPILER2)
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 // windows x86 currently needs SEH wrapper and the gain of the fast
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 // versions currently isn't certain for server vm on uniprocessor.
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 && os::is_MP()
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 address func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 func = JNI_FastGetField::generate_fast_get_boolean_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3209 jni_NativeInterface.GetBooleanField = (GetBooleanField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 func = JNI_FastGetField::generate_fast_get_byte_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
3212 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 jni_NativeInterface.GetByteField = (GetByteField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 func = JNI_FastGetField::generate_fast_get_char_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 jni_NativeInterface.GetCharField = (GetCharField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3219 func = JNI_FastGetField::generate_fast_get_short_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 jni_NativeInterface.GetShortField = (GetShortField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 func = JNI_FastGetField::generate_fast_get_int_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
3224 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 jni_NativeInterface.GetIntField = (GetIntField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 func = JNI_FastGetField::generate_fast_get_long_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
3228 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 jni_NativeInterface.GetLongField = (GetLongField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 func = JNI_FastGetField::generate_fast_get_float_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 jni_NativeInterface.GetFloatField = (GetFloatField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 func = JNI_FastGetField::generate_fast_get_double_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3237 jni_NativeInterface.GetDoubleField = (GetDoubleField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
3238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3241
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 // Returns the function structure
a61af66fc99e Initial load
duke
parents:
diff changeset
3243 struct JNINativeInterface_* jni_functions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 #ifndef JNICHECK_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 if (CheckJNICalls) return jni_functions_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 #else // JNICHECK_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 if (CheckJNICalls) warning("-Xcheck:jni is not supported in kernel vm.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3248 #endif // JNICHECK_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
3249 return &jni_NativeInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3251
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 // Returns the function structure
a61af66fc99e Initial load
duke
parents:
diff changeset
3253 struct JNINativeInterface_* jni_functions_nocheck() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3254 return &jni_NativeInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3256
a61af66fc99e Initial load
duke
parents:
diff changeset
3257
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 // Invocation API
a61af66fc99e Initial load
duke
parents:
diff changeset
3259
a61af66fc99e Initial load
duke
parents:
diff changeset
3260
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 // Forward declaration
a61af66fc99e Initial load
duke
parents:
diff changeset
3262 extern const struct JNIInvokeInterface_ jni_InvokeInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
3263
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 // Global invocation API vars
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 volatile jint vm_created = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 // Indicate whether it is safe to recreate VM
a61af66fc99e Initial load
duke
parents:
diff changeset
3267 volatile jint safe_to_recreate_vm = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3268 struct JavaVM_ main_vm = {&jni_InvokeInterface};
a61af66fc99e Initial load
duke
parents:
diff changeset
3269
a61af66fc99e Initial load
duke
parents:
diff changeset
3270
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 #define JAVASTACKSIZE (400 * 1024) /* Default size of a thread java stack */
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 enum { VERIFY_NONE, VERIFY_REMOTE, VERIFY_ALL };
a61af66fc99e Initial load
duke
parents:
diff changeset
3273
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 HS_DTRACE_PROBE_DECL1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, void*);
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
3276
a61af66fc99e Initial load
duke
parents:
diff changeset
3277 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 HS_DTRACE_PROBE1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, args_);
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 JDK1_1InitArgs *args = (JDK1_1InitArgs *)args_;
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 jint ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3281 DT_RETURN_MARK(GetDefaultJavaVMInitArgs, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3282
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 if (Threads::is_supported_jni_version(args->version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3284 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3286 // 1.1 style no longer supported in hotspot.
a61af66fc99e Initial load
duke
parents:
diff changeset
3287 // According the JNI spec, we should update args->version on return.
a61af66fc99e Initial load
duke
parents:
diff changeset
3288 // We also use the structure to communicate with launcher about default
a61af66fc99e Initial load
duke
parents:
diff changeset
3289 // stack size.
a61af66fc99e Initial load
duke
parents:
diff changeset
3290 if (args->version == JNI_VERSION_1_1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 args->version = JNI_VERSION_1_2;
a61af66fc99e Initial load
duke
parents:
diff changeset
3292 // javaStackSize is int in arguments structure
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 assert(jlong(ThreadStackSize) * K < INT_MAX, "integer overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
3294 args->javaStackSize = (jint)(ThreadStackSize * K);
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3298
a61af66fc99e Initial load
duke
parents:
diff changeset
3299 HS_DTRACE_PROBE_DECL3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
3300 DT_RETURN_MARK_DECL(CreateJavaVM, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
3301
a61af66fc99e Initial load
duke
parents:
diff changeset
3302 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3303 HS_DTRACE_PROBE3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
3304
a61af66fc99e Initial load
duke
parents:
diff changeset
3305 jint result = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 DT_RETURN_MARK(CreateJavaVM, jint, (const jint&)result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3307
1078
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3308 // We're about to use Atomic::xchg for synchronization. Some Zero
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3309 // platforms use the GCC builtin __sync_lock_test_and_set for this,
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3310 // but __sync_lock_test_and_set is not guaranteed to do what we want
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3311 // on all architectures. So we check it works before relying on it.
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3312 #if defined(ZERO) && defined(ASSERT)
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3313 {
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3314 jint a = 0xcafebabe;
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3315 jint b = Atomic::xchg(0xdeadbeef, &a);
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3316 void *c = &a;
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3317 void *d = Atomic::xchg_ptr(&b, &c);
1132
896da934748c 6913869: Zero assert fix
twisti
parents: 1078
diff changeset
3318 assert(a == (jint) 0xdeadbeef && b == (jint) 0xcafebabe, "Atomic::xchg() works");
1078
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3319 assert(c == &b && d == &a, "Atomic::xchg_ptr() works");
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3320 }
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3321 #endif // ZERO && ASSERT
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
3322
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3323 // At the moment it's only possible to have one Java VM,
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 // since some of the runtime state is in global variables.
a61af66fc99e Initial load
duke
parents:
diff changeset
3325
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 // We cannot use our mutex locks here, since they only work on
a61af66fc99e Initial load
duke
parents:
diff changeset
3327 // Threads. We do an atomic compare and exchange to ensure only
a61af66fc99e Initial load
duke
parents:
diff changeset
3328 // one thread can call this method at a time
a61af66fc99e Initial load
duke
parents:
diff changeset
3329
a61af66fc99e Initial load
duke
parents:
diff changeset
3330 // We use Atomic::xchg rather than Atomic::add/dec since on some platforms
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 // the add/dec implementations are dependent on whether we are running
a61af66fc99e Initial load
duke
parents:
diff changeset
3332 // on a multiprocessor, and at this stage of initialization the os::is_MP
a61af66fc99e Initial load
duke
parents:
diff changeset
3333 // function used to determine this will always return false. Atomic::xchg
a61af66fc99e Initial load
duke
parents:
diff changeset
3334 // does not have this problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
3335 if (Atomic::xchg(1, &vm_created) == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 return JNI_ERR; // already created, or create attempt in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
3337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3338 if (Atomic::xchg(0, &safe_to_recreate_vm) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3339 return JNI_ERR; // someone tried and failed and retry not allowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
3340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3341
a61af66fc99e Initial load
duke
parents:
diff changeset
3342 assert(vm_created == 1, "vm_created is true during the creation");
a61af66fc99e Initial load
duke
parents:
diff changeset
3343
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 * Certain errors during initialization are recoverable and do not
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 * prevent this method from being called again at a later time
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 * (perhaps with different arguments). However, at a certain
a61af66fc99e Initial load
duke
parents:
diff changeset
3348 * point during initialization if an error occurs we cannot allow
a61af66fc99e Initial load
duke
parents:
diff changeset
3349 * this function to be called again (or it will crash). In those
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 * situations, the 'canTryAgain' flag is set to false, which atomically
a61af66fc99e Initial load
duke
parents:
diff changeset
3351 * sets safe_to_recreate_vm to 1, such that any new call to
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 * JNI_CreateJavaVM will immediately fail using the above logic.
a61af66fc99e Initial load
duke
parents:
diff changeset
3353 */
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 bool can_try_again = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3355
a61af66fc99e Initial load
duke
parents:
diff changeset
3356 result = Threads::create_vm((JavaVMInitArgs*) args, &can_try_again);
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 if (result == JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 JavaThread *thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3359 /* thread is thread_in_vm here */
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 *vm = (JavaVM *)(&main_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 *(JNIEnv**)penv = thread->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
3362
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 // Tracks the time application was running before GC
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 RuntimeService::record_application_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
3365
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 // Notify JVMTI
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3368 JvmtiExport::post_thread_start(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 // Check if we should compile all classes on bootclasspath
a61af66fc99e Initial load
duke
parents:
diff changeset
3371 NOT_PRODUCT(if (CompileTheWorld) ClassLoader::compile_the_world();)
a61af66fc99e Initial load
duke
parents:
diff changeset
3372 // Since this is not a JVM_ENTRY we have to set the thread state manually before leaving.
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 if (can_try_again) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 // reset safe_to_recreate_vm to 1 so that retrial would be possible
a61af66fc99e Initial load
duke
parents:
diff changeset
3377 safe_to_recreate_vm = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3379
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 // Creation failed. We must reset vm_created
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 *vm = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 *(JNIEnv**)penv = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 // reset vm_created last to avoid race condition. Use OrderAccess to
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 // control both compiler and architectural-based reordering.
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 OrderAccess::release_store(&vm_created, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3387
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1290
diff changeset
3388 NOT_PRODUCT(test_error_handler(ErrorHandlerTest));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3391
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 HS_DTRACE_PROBE_DECL3(hotspot_jni, GetCreatedJavaVMs__entry, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 JavaVM**, jsize, jsize*);
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 HS_DTRACE_PROBE_DECL1(hotspot_jni, GetCreatedJavaVMs__return, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
3395
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetCreatedJavaVMs(JavaVM **vm_buf, jsize bufLen, jsize *numVMs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3397 // See bug 4367188, the wrapper can sometimes cause VM crashes
a61af66fc99e Initial load
duke
parents:
diff changeset
3398 // JNIWrapper("GetCreatedJavaVMs");
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 HS_DTRACE_PROBE3(hotspot_jni, GetCreatedJavaVMs__entry, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3400 vm_buf, bufLen, numVMs);
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 if (vm_created) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3402 if (numVMs != NULL) *numVMs = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 if (bufLen > 0) *vm_buf = (JavaVM *)(&main_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3404 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3405 if (numVMs != NULL) *numVMs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 HS_DTRACE_PROBE1(hotspot_jni, GetCreatedJavaVMs__return, JNI_OK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3410
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
3412
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 DT_RETURN_MARK_DECL(DestroyJavaVM, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
3414
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 jint JNICALL jni_DestroyJavaVM(JavaVM *vm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 DTRACE_PROBE1(hotspot_jni, DestroyJavaVM__entry, vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3417 jint res = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3418 DT_RETURN_MARK(DestroyJavaVM, jint, (const jint&)res);
a61af66fc99e Initial load
duke
parents:
diff changeset
3419
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 if (!vm_created) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 res = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3424
a61af66fc99e Initial load
duke
parents:
diff changeset
3425 JNIWrapper("DestroyJavaVM");
a61af66fc99e Initial load
duke
parents:
diff changeset
3426 JNIEnv *env;
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 JavaVMAttachArgs destroyargs;
a61af66fc99e Initial load
duke
parents:
diff changeset
3428 destroyargs.version = CurrentVersion;
a61af66fc99e Initial load
duke
parents:
diff changeset
3429 destroyargs.name = (char *)"DestroyJavaVM";
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 destroyargs.group = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 res = vm->AttachCurrentThread((void **)&env, (void *)&destroyargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
3432 if (res != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3435
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 // Since this is not a JVM_ENTRY we have to set the thread state manually before entering.
a61af66fc99e Initial load
duke
parents:
diff changeset
3437 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 if (Threads::destroy_vm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 // Should not change thread state, VM is gone
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 vm_created = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 res = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3443 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 res = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
3448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3450
a61af66fc99e Initial load
duke
parents:
diff changeset
3451
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool daemon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3453 JavaVMAttachArgs *args = (JavaVMAttachArgs *) _args;
a61af66fc99e Initial load
duke
parents:
diff changeset
3454
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 // Check below commented out from JDK1.2fcs as well
a61af66fc99e Initial load
duke
parents:
diff changeset
3456 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 if (args && (args->version != JNI_VERSION_1_1 || args->version != JNI_VERSION_1_2)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 return JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3460 */
a61af66fc99e Initial load
duke
parents:
diff changeset
3461
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 Thread* t = ThreadLocalStorage::get_thread_slow();
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 if (t != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 // If the thread has been attached this operation is a no-op
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 *(JNIEnv**)penv = ((JavaThread*) t)->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3468
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 // Create a thread and mark it as attaching so it will be skipped by the
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 // ThreadsListEnumerator - see CR 6404306
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 JavaThread* thread = new JavaThread(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
3472
a61af66fc99e Initial load
duke
parents:
diff changeset
3473 // Set correct safepoint info. The thread is going to call into Java when
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 // initializing the Java level thread object. Hence, the correct state must
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 // be set in order for the Safepoint code to deal with it correctly.
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 thread->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 // Must do this before initialize_thread_local_storage
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 thread->record_stack_base_and_size();
1290
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1142
diff changeset
3479
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3480 thread->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3481
a61af66fc99e Initial load
duke
parents:
diff changeset
3482 if (!os::create_attached_thread(thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 delete thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3484 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3485 }
1290
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1142
diff changeset
3486 // Enable stack overflow checks
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1142
diff changeset
3487 thread->create_stack_guard_pages();
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1142
diff changeset
3488
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 thread->initialize_tlab();
a61af66fc99e Initial load
duke
parents:
diff changeset
3490
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
3491 thread->cache_global_variables();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
3492
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 // Crucial that we do not have a safepoint check for this thread, since it has
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 // not been added to the Thread list yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 { Threads_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 // This must be inside this lock in order to get FullGCALot to work properly, i.e., to
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 // avoid this thread trying to do a GC before it is added to the thread-list
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 thread->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 Threads::add(thread, daemon);
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 // Create thread group and name info from attach arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 oop group = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3504 char* thread_name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3505 if (args != NULL && Threads::is_supported_jni_version(args->version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 group = JNIHandles::resolve(args->group);
a61af66fc99e Initial load
duke
parents:
diff changeset
3507 thread_name = args->name; // may be NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3509 if (group == NULL) group = Universe::main_thread_group();
a61af66fc99e Initial load
duke
parents:
diff changeset
3510
a61af66fc99e Initial load
duke
parents:
diff changeset
3511 // Create Java level thread object and attach it to this thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 bool attach_failed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3514 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 HandleMark hm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3516 Handle thread_group(THREAD, group);
a61af66fc99e Initial load
duke
parents:
diff changeset
3517 thread->allocate_threadObj(thread_group, thread_name, daemon, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3518 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3519 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 // cleanup outside the handle mark.
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 attach_failed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3524
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 if (attach_failed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3526 // Added missing cleanup
a61af66fc99e Initial load
duke
parents:
diff changeset
3527 thread->cleanup_failed_attach_current_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3530
a61af66fc99e Initial load
duke
parents:
diff changeset
3531 // mark the thread as no longer attaching
a61af66fc99e Initial load
duke
parents:
diff changeset
3532 // this uses a fence to push the change through so we don't have
a61af66fc99e Initial load
duke
parents:
diff changeset
3533 // to regrab the threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3534 thread->set_attached();
a61af66fc99e Initial load
duke
parents:
diff changeset
3535
a61af66fc99e Initial load
duke
parents:
diff changeset
3536 // Set java thread status.
a61af66fc99e Initial load
duke
parents:
diff changeset
3537 java_lang_Thread::set_thread_status(thread->threadObj(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 java_lang_Thread::RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3539
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 // Notify the debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 JvmtiExport::post_thread_start(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3544
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 *(JNIEnv**)penv = thread->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
3546
a61af66fc99e Initial load
duke
parents:
diff changeset
3547 // Now leaving the VM, so change thread_state. This is normally automatically taken care
a61af66fc99e Initial load
duke
parents:
diff changeset
3548 // of in the JVM_ENTRY. But in this situation we have to do it manually. Notice, that by
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 // using ThreadStateTransition::transition, we do a callback to the safepoint code if
a61af66fc99e Initial load
duke
parents:
diff changeset
3550 // needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
3551
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
3553
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 // Perform any platform dependent FPU setup
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 os::setup_fpu();
a61af66fc99e Initial load
duke
parents:
diff changeset
3556
a61af66fc99e Initial load
duke
parents:
diff changeset
3557 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3558 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3559
a61af66fc99e Initial load
duke
parents:
diff changeset
3560
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void *_args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3562 DTRACE_PROBE3(hotspot_jni, AttachCurrentThread__entry, vm, penv, _args);
a61af66fc99e Initial load
duke
parents:
diff changeset
3563 if (!vm_created) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3564 DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, JNI_ERR);
a61af66fc99e Initial load
duke
parents:
diff changeset
3565 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3567
a61af66fc99e Initial load
duke
parents:
diff changeset
3568 JNIWrapper("AttachCurrentThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3569 jint ret = attach_current_thread(vm, penv, _args, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3570 DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3571 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3573
a61af66fc99e Initial load
duke
parents:
diff changeset
3574
a61af66fc99e Initial load
duke
parents:
diff changeset
3575 jint JNICALL jni_DetachCurrentThread(JavaVM *vm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3576 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__entry, vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3578
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 JNIWrapper("DetachCurrentThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
3580
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 // If the thread has been deattacted the operations is a no-op
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 if (ThreadLocalStorage::thread() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3584 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3586
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 if (thread->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_ERR);
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 // Can't detach a thread that's running java, that can't work.
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3593
a61af66fc99e Initial load
duke
parents:
diff changeset
3594 // Safepoint support. Have to do call-back to safepoint code, if in the
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 // middel of a safepoint operation
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3597
a61af66fc99e Initial load
duke
parents:
diff changeset
3598 // XXX: Note that JavaThread::exit() call below removes the guards on the
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 // stack pages set up via enable_stack_{red,yellow}_zone() calls
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 // above in jni_AttachCurrentThread. Unfortunately, while the setting
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 // of the guards is visible in jni_AttachCurrentThread above,
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 // the removal of the guards is buried below in JavaThread::exit()
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 // here. The abstraction should be more symmetrically either exposed
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 // or hidden (e.g. it could probably be hidden in the same
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 // (platform-dependent) methods where we do alternate stack
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 // maintenance work?)
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 thread->exit(false, JavaThread::jni_detach);
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 delete thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3609
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3613
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 DT_RETURN_MARK_DECL(GetEnv, jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
3615
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3617 DTRACE_PROBE3(hotspot_jni, GetEnv__entry, vm, penv, version);
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 jint ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 DT_RETURN_MARK(GetEnv, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3620
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 if (!vm_created) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 *penv = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 ret = JNI_EDETACHED;
a61af66fc99e Initial load
duke
parents:
diff changeset
3624 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3626
a61af66fc99e Initial load
duke
parents:
diff changeset
3627 if (JvmtiExport::is_jvmti_version(version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3628 ret = JvmtiExport::get_jvmti_interface(vm, penv, version);
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3631
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 #ifndef JVMPI_VERSION_1
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 // need these in order to be polite about older agents
a61af66fc99e Initial load
duke
parents:
diff changeset
3634 #define JVMPI_VERSION_1 ((jint)0x10000001)
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 #define JVMPI_VERSION_1_1 ((jint)0x10000002)
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 #define JVMPI_VERSION_1_2 ((jint)0x10000003)
a61af66fc99e Initial load
duke
parents:
diff changeset
3637 #endif // !JVMPI_VERSION_1
a61af66fc99e Initial load
duke
parents:
diff changeset
3638
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 Thread* thread = ThreadLocalStorage::thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3640 if (thread != NULL && thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 if (Threads::is_supported_jni_version_including_1_1(version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 *(JNIEnv**)penv = ((JavaThread*) thread)->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3645
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 } else if (version == JVMPI_VERSION_1 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 version == JVMPI_VERSION_1_1 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 version == JVMPI_VERSION_1_2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 tty->print_cr("ERROR: JVMPI, an experimental interface, is no longer supported.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 ret = JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 } else if (JvmtiExport::is_jvmdi_version(version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 tty->print_cr("FATAL ERROR: JVMDI is no longer supported.");
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 ret = JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3658 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 *penv = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 ret = JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3663 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 *penv = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 ret = JNI_EDETACHED;
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3669
a61af66fc99e Initial load
duke
parents:
diff changeset
3670
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 jint JNICALL jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *_args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 DTRACE_PROBE3(hotspot_jni, AttachCurrentThreadAsDaemon__entry, vm, penv, _args);
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 if (!vm_created) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, JNI_ERR);
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3677
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 JNIWrapper("AttachCurrentThreadAsDaemon");
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 jint ret = attach_current_thread(vm, penv, _args, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3681 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3683
a61af66fc99e Initial load
duke
parents:
diff changeset
3684
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 } // End extern "C"
a61af66fc99e Initial load
duke
parents:
diff changeset
3686
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 const struct JNIInvokeInterface_ jni_InvokeInterface = {
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
3689 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
3691
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 jni_DestroyJavaVM,
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 jni_AttachCurrentThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
3694 jni_DetachCurrentThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 jni_GetEnv,
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 jni_AttachCurrentThreadAsDaemon
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 };