annotate src/share/vm/prims/jni.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 833b0f92429a
children b12a2a9b05ca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17898
diff changeset
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
6837
75982791ddb6 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 6831
diff changeset
3 * Copyright (c) 2012 Red Hat, Inc.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
5 *
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
8 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
9 *
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
14 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
15 *
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
19 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
21 * 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
22 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
23 *
a61af66fc99e Initial load
duke
parents:
diff changeset
24 */
a61af66fc99e Initial load
duke
parents:
diff changeset
25
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
26 #include "precompiled.hpp"
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
27 #include "ci/ciReplay.hpp"
6162
e9140bf80b4a 7158800: Improve storage of symbol tables
coleenp
parents: 6125
diff changeset
28 #include "classfile/altHashing.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
29 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
30 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
31 #include "classfile/symbolTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
32 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
33 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
34 #include "interpreter/linkResolver.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7182
diff changeset
35 #include "utilities/macros.hpp"
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7182
diff changeset
36 #if INCLUDE_ALL_GCS
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
37 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7182
diff changeset
38 #endif // INCLUDE_ALL_GCS
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6162
diff changeset
39 #include "memory/allocation.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
40 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
41 #include "memory/gcLocker.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
42 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
43 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
44 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
45 #include "oops/instanceOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
46 #include "oops/markOop.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
47 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
48 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
49 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
50 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
51 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
52 #include "oops/typeArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
53 #include "oops/typeArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
54 #include "prims/jni.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
55 #include "prims/jniCheck.hpp"
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4708
diff changeset
56 #include "prims/jniExport.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
57 #include "prims/jniFastGetField.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
58 #include "prims/jvm.h"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
59 #include "prims/jvm_misc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
60 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
61 #include "prims/jvmtiThreadState.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
62 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
63 #include "runtime/fieldDescriptor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
64 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
65 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
66 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
67 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
68 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
69 #include "runtime/jfieldIDWorkaround.hpp"
20197
ce8f6bb717c9 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 17937
diff changeset
70 #include "runtime/orderAccess.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
71 #include "runtime/reflection.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
72 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
73 #include "runtime/signature.hpp"
7180
f34d701e952e 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 6985
diff changeset
74 #include "runtime/thread.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
75 #include "runtime/vm_operations.hpp"
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 20337
diff changeset
76 #include "services/memTracker.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
77 #include "services/runtimeService.hpp"
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4708
diff changeset
78 #include "trace/tracing.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
79 #include "utilities/defaultStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
80 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
81 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
82 #include "utilities/histogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
83 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
84 # include "os_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 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
89 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
90 # include "os_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
91 #endif
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
92 #ifdef TARGET_OS_FAMILY_bsd
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
93 # include "os_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents: 3938
diff changeset
94 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95
8793
499ccc15bbc8 8005716: Enhance JNI specification to allow support of static JNI libraries in Embedded JREs
bpittore
parents: 8001
diff changeset
96 static jint CurrentVersion = JNI_VERSION_1_8;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // The DT_RETURN_MARK macros create a scoped object to fire the dtrace
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // '-return' probe regardless of the return path is taken out of the function.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // Methods that have multiple return paths use this to avoid having to
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // instrument each return path. Methods that use CHECK or THROW must use this
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // since those macros can cause an immedate uninstrumented return.
a61af66fc99e Initial load
duke
parents:
diff changeset
104 //
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // In order to get the return value, a reference to the variable containing
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // the return value must be passed to the contructor of the object, and
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // the return value must be set before return (since the mark object has
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // a reference to it).
a61af66fc99e Initial load
duke
parents:
diff changeset
109 //
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Example:
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // DT_RETURN_MARK_DECL(SomeFunc, int);
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // JNI_ENTRY(int, SomeFunc, ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // int return_value = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // DT_RETURN_MARK(SomeFunc, int, (const int&)return_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // foo(CHECK_0)
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // return_value = 5;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // return return_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // JNI_END
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
119 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 #define DT_RETURN_MARK_DECL(name, type) \
a61af66fc99e Initial load
duke
parents:
diff changeset
121 HS_DTRACE_PROBE_DECL1(hotspot_jni, name##__return, type); \
a61af66fc99e Initial load
duke
parents:
diff changeset
122 DTRACE_ONLY( \
a61af66fc99e Initial load
duke
parents:
diff changeset
123 class DTraceReturnProbeMark_##name { \
a61af66fc99e Initial load
duke
parents:
diff changeset
124 public: \
a61af66fc99e Initial load
duke
parents:
diff changeset
125 const type& _ret_ref; \
a61af66fc99e Initial load
duke
parents:
diff changeset
126 DTraceReturnProbeMark_##name(const type& v) : _ret_ref(v) {} \
a61af66fc99e Initial load
duke
parents:
diff changeset
127 ~DTraceReturnProbeMark_##name() { \
a61af66fc99e Initial load
duke
parents:
diff changeset
128 HS_DTRACE_PROBE1(hotspot_jni, name##__return, _ret_ref); \
a61af66fc99e Initial load
duke
parents:
diff changeset
129 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
130 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
131 )
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // Void functions are simpler since there's no return value
a61af66fc99e Initial load
duke
parents:
diff changeset
133 #define DT_VOID_RETURN_MARK_DECL(name) \
a61af66fc99e Initial load
duke
parents:
diff changeset
134 HS_DTRACE_PROBE_DECL0(hotspot_jni, name##__return); \
a61af66fc99e Initial load
duke
parents:
diff changeset
135 DTRACE_ONLY( \
a61af66fc99e Initial load
duke
parents:
diff changeset
136 class DTraceReturnProbeMark_##name { \
a61af66fc99e Initial load
duke
parents:
diff changeset
137 public: \
a61af66fc99e Initial load
duke
parents:
diff changeset
138 ~DTraceReturnProbeMark_##name() { \
a61af66fc99e Initial load
duke
parents:
diff changeset
139 HS_DTRACE_PROBE0(hotspot_jni, name##__return); \
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
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
144 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
145
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
146 #define DT_RETURN_MARK_DECL(name, type, probe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
147 DTRACE_ONLY( \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
148 class DTraceReturnProbeMark_##name { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
149 public: \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
150 const type& _ret_ref; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
151 DTraceReturnProbeMark_##name(const type& v) : _ret_ref(v) {} \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
152 ~DTraceReturnProbeMark_##name() { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
153 probe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
154 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
155 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
156 )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
157 // Void functions are simpler since there's no return value
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
158 #define DT_VOID_RETURN_MARK_DECL(name, probe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
159 DTRACE_ONLY( \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
160 class DTraceReturnProbeMark_##name { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
161 public: \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
162 ~DTraceReturnProbeMark_##name() { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
163 probe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
164 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
165 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
166 )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
167 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // Place these macros in the function to mark the return. Non-void
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // functions need the type and address of the return value.
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #define DT_RETURN_MARK(name, type, ref) \
a61af66fc99e Initial load
duke
parents:
diff changeset
172 DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark(ref) )
a61af66fc99e Initial load
duke
parents:
diff changeset
173 #define DT_VOID_RETURN_MARK(name) \
a61af66fc99e Initial load
duke
parents:
diff changeset
174 DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark )
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Use these to select distinct code for floating-point vs. non-floating point
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // situations. Used from within common macros where we need slightly
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // different behavior for Float/Double
a61af66fc99e Initial load
duke
parents:
diff changeset
180 #define FP_SELECT_Boolean(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
181 #define FP_SELECT_Byte(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
182 #define FP_SELECT_Char(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
183 #define FP_SELECT_Short(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
184 #define FP_SELECT_Object(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
185 #define FP_SELECT_Int(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
186 #define FP_SELECT_Long(intcode, fpcode) intcode
a61af66fc99e Initial load
duke
parents:
diff changeset
187 #define FP_SELECT_Float(intcode, fpcode) fpcode
a61af66fc99e Initial load
duke
parents:
diff changeset
188 #define FP_SELECT_Double(intcode, fpcode) fpcode
a61af66fc99e Initial load
duke
parents:
diff changeset
189 #define FP_SELECT(TypeName, intcode, fpcode) \
a61af66fc99e Initial load
duke
parents:
diff changeset
190 FP_SELECT_##TypeName(intcode, fpcode)
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 #define COMMA ,
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Choose DT_RETURN_MARK macros based on the type: float/double -> void
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // (dtrace doesn't do FP yet)
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
196 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 #define DT_RETURN_MARK_DECL_FOR(TypeName, name, type) \
a61af66fc99e Initial load
duke
parents:
diff changeset
198 FP_SELECT(TypeName, \
a61af66fc99e Initial load
duke
parents:
diff changeset
199 DT_RETURN_MARK_DECL(name, type), DT_VOID_RETURN_MARK_DECL(name) )
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
200 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
201 #define DT_RETURN_MARK_DECL_FOR(TypeName, name, type, probe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
202 FP_SELECT(TypeName, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
203 DT_RETURN_MARK_DECL(name, type, probe), DT_VOID_RETURN_MARK_DECL(name, probe) )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
204 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
205 #define DT_RETURN_MARK_FOR(TypeName, name, type, ref) \
a61af66fc99e Initial load
duke
parents:
diff changeset
206 FP_SELECT(TypeName, \
a61af66fc99e Initial load
duke
parents:
diff changeset
207 DT_RETURN_MARK(name, type, ref), DT_VOID_RETURN_MARK(name) )
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // out-of-line helpers for class jfieldIDWorkaround:
a61af66fc99e Initial load
duke
parents:
diff changeset
211
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
212 bool jfieldIDWorkaround::is_valid_jfieldID(Klass* k, jfieldID id) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (jfieldIDWorkaround::is_instance_jfieldID(k, id)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 uintptr_t as_uint = (uintptr_t) id;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 intptr_t offset = raw_instance_offset(id);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 if (is_checked_jfieldID(id)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (!klass_hash_ok(k, id)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
221 return InstanceKlass::cast(k)->contains_field_offset(offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
222 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 JNIid* result = (JNIid*) id;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
225 return result != NULL && result->is_static_field_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
226 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
227 return result != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
233 intptr_t jfieldIDWorkaround::encode_klass_hash(Klass* k, intptr_t offset) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if (offset <= small_offset_mask) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
235 Klass* field_klass = k;
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
236 Klass* super_klass = field_klass->super();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
237 // 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
238 // be the owner of fields embedded in the header.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
239 while (InstanceKlass::cast(super_klass)->has_nonstatic_fields() &&
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
240 InstanceKlass::cast(super_klass)->contains_field_offset(offset)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 field_klass = super_klass; // super contains the field also
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
242 super_klass = field_klass->super();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 debug_only(No_Safepoint_Verifier nosafepoint;)
a61af66fc99e Initial load
duke
parents:
diff changeset
245 uintptr_t klass_hash = field_klass->identity_hash();
a61af66fc99e Initial load
duke
parents:
diff changeset
246 return ((klass_hash & klass_mask) << klass_shift) | checked_mask_in_place;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 #if 0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
250 {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 ResourceMark rm;
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
252 warning("VerifyJNIFields: long offset %d in %s", offset, k->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
255 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
256 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
260 bool jfieldIDWorkaround::klass_hash_ok(Klass* k, jfieldID id) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
261 uintptr_t as_uint = (uintptr_t) id;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 intptr_t klass_hash = (as_uint >> klass_shift) & klass_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 debug_only(No_Safepoint_Verifier nosafepoint;)
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // Could use a non-blocking query for identity_hash here...
a61af66fc99e Initial load
duke
parents:
diff changeset
266 if ((k->identity_hash() & klass_mask) == klass_hash)
a61af66fc99e Initial load
duke
parents:
diff changeset
267 return true;
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
268 k = k->super();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
269 } while (k != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
273 void jfieldIDWorkaround::verify_instance_jfieldID(Klass* k, jfieldID id) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
274 guarantee(jfieldIDWorkaround::is_instance_jfieldID(k, id), "must be an instance field" );
a61af66fc99e Initial load
duke
parents:
diff changeset
275 uintptr_t as_uint = (uintptr_t) id;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 intptr_t offset = raw_instance_offset(id);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (VerifyJNIFields) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 if (is_checked_jfieldID(id)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 guarantee(klass_hash_ok(k, id),
a61af66fc99e Initial load
duke
parents:
diff changeset
280 "Bug in native code: jfieldID class must match object");
a61af66fc99e Initial load
duke
parents:
diff changeset
281 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 #if 0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
284 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 ResourceMark rm;
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
286 warning("VerifyJNIFields: unverified offset %d for %s", offset, k->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
289 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
292 guarantee(InstanceKlass::cast(k)->contains_field_offset(offset),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293 "Bug in native code: jfieldID offset must address interior of object");
a61af66fc99e Initial load
duke
parents:
diff changeset
294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Wrapper to trace JNI functions
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
299 Histogram* JNIHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 static volatile jint JNIHistogram_lock = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 class JNITraceWrapper : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 public:
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17898
diff changeset
304 JNITraceWrapper(const char* format, ...) ATTRIBUTE_PRINTF(2, 3) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
305 if (TraceJNICalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 tty->print("JNI ");
a61af66fc99e Initial load
duke
parents:
diff changeset
309 tty->vprint_cr(format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 };
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 class JNIHistogramElement : public HistogramElement {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
317 JNIHistogramElement(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 };
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 JNIHistogramElement::JNIHistogramElement(const char* elementName) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 _name = elementName;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 uintx count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 while (Atomic::cmpxchg(1, &JNIHistogram_lock, 0) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 while (OrderAccess::load_acquire(&JNIHistogram_lock) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 count +=1;
a61af66fc99e Initial load
duke
parents:
diff changeset
327 if ( (WarnOnStalledSpinLock > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
328 && (count % WarnOnStalledSpinLock == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 warning("JNIHistogram_lock seems to be stalled");
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 if(JNIHistogram == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
336 JNIHistogram = new Histogram("JNI Call Counts",100);
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 JNIHistogram->add_element(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
339 Atomic::dec(&JNIHistogram_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 #define JNICountWrapper(arg) \
a61af66fc99e Initial load
duke
parents:
diff changeset
343 static JNIHistogramElement* e = new JNIHistogramElement(arg); \
a61af66fc99e Initial load
duke
parents:
diff changeset
344 /* 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
345 if (e != NULL) e->increment_count()
a61af66fc99e Initial load
duke
parents:
diff changeset
346 #define JNIWrapper(arg) JNICountWrapper(arg); JNITraceWrapper(arg)
a61af66fc99e Initial load
duke
parents:
diff changeset
347 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
348 #define JNIWrapper(arg)
a61af66fc99e Initial load
duke
parents:
diff changeset
349 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // Implementation of JNI entries
a61af66fc99e Initial load
duke
parents:
diff changeset
353
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
354 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
355 DT_RETURN_MARK_DECL(DefineClass, jclass);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
356 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
357 DT_RETURN_MARK_DECL(DefineClass, jclass
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
358 , HOTSPOT_JNI_DEFINECLASS_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
359 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
362 const jbyte *buf, jsize bufLen))
a61af66fc99e Initial load
duke
parents:
diff changeset
363 JNIWrapper("DefineClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
364
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
365 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
366 DTRACE_PROBE5(hotspot_jni, DefineClass__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
367 env, name, loaderRef, buf, bufLen);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
368 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
369 HOTSPOT_JNI_DEFINECLASS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
370 env, (char*) name, loaderRef, (char*) buf, bufLen);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
371 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
372 jclass cls = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 DT_RETURN_MARK(DefineClass, jclass, (const jclass&)cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
374
6125
dcfcdd01af4b 7171703: JNI DefineClass crashes client VM when first parameter is NULL
fparain
parents: 4800
diff changeset
375 TempNewSymbol class_name = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // Since exceptions can be thrown, class initialization can take place
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // if name is NULL no check for class name in .class stream has to be made.
a61af66fc99e Initial load
duke
parents:
diff changeset
378 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 const int str_len = (int)strlen(name);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
380 if (str_len > Symbol::max_length()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
383 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
6125
dcfcdd01af4b 7171703: JNI DefineClass crashes client VM when first parameter is NULL
fparain
parents: 4800
diff changeset
385 class_name = SymbolTable::new_symbol(name, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
387 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 ClassFileStream st((u1*) buf, bufLen, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
389 Handle class_loader (THREAD, JNIHandles::resolve(loaderRef));
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (UsePerfData && !class_loader.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // check whether the current caller thread holds the lock or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // If not, increment the corresponding counter
a61af66fc99e Initial load
duke
parents:
diff changeset
394 if (ObjectSynchronizer::
a61af66fc99e Initial load
duke
parents:
diff changeset
395 query_lock_ownership((JavaThread*)THREAD, class_loader) !=
a61af66fc99e Initial load
duke
parents:
diff changeset
396 ObjectSynchronizer::owner_self) {
a61af66fc99e Initial load
duke
parents:
diff changeset
397 ClassLoader::sync_JNIDefineClassLockFreeCounter()->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
400 Klass* k = SystemDictionary::resolve_from_stream(class_name, class_loader,
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 657
diff changeset
401 Handle(), &st, true,
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 657
diff changeset
402 CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
404 if (TraceClassResolution && k != NULL) {
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
405 trace_class_resolution(k);
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
406 }
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
407
0
a61af66fc99e Initial load
duke
parents:
diff changeset
408 cls = (jclass)JNIHandles::make_local(
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
409 env, k->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 return cls;
a61af66fc99e Initial load
duke
parents:
diff changeset
411 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 static bool first_time_FindClass = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
416
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
417 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
418 DT_RETURN_MARK_DECL(FindClass, jclass);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
419 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
420 DT_RETURN_MARK_DECL(FindClass, jclass
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
421 , HOTSPOT_JNI_FINDCLASS_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
422 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name))
a61af66fc99e Initial load
duke
parents:
diff changeset
425 JNIWrapper("FindClass");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
426 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
427 DTRACE_PROBE2(hotspot_jni, FindClass__entry, env, name);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
428 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
429 HOTSPOT_JNI_FINDCLASS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
430 env, (char *)name);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
431 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 jclass result = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
434 DT_RETURN_MARK(FindClass, jclass, (const jclass&)result);
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // Remember if we are the first invocation of jni_FindClass
a61af66fc99e Initial load
duke
parents:
diff changeset
437 bool first_time = first_time_FindClass;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 first_time_FindClass = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // Sanity check the name: it cannot be null or larger than the maximum size
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // 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
442 if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
443 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 //%note jni_3
a61af66fc99e Initial load
duke
parents:
diff changeset
447 Handle loader;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 Handle protection_domain;
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Find calling class
a61af66fc99e Initial load
duke
parents:
diff changeset
450 instanceKlassHandle k (THREAD, thread->security_get_caller_class(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if (k.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 loader = Handle(THREAD, k->class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // Special handling to make sure JNI_OnLoad and JNI_OnUnload are executed
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // in the correct class context.
a61af66fc99e Initial load
duke
parents:
diff changeset
455 if (loader.is_null() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
456 k->name() == vmSymbols::java_lang_ClassLoader_NativeLibrary()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
457 JavaValue result(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 JavaCalls::call_static(&result, k,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
459 vmSymbols::getFromClass_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
460 vmSymbols::void_class_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461 thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 Handle ex(thread, thread->pending_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
464 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
465 THROW_HANDLE_0(ex);
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 oop mirror = (oop) result.get_jobject();
a61af66fc99e Initial load
duke
parents:
diff changeset
468 loader = Handle(THREAD,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
469 InstanceKlass::cast(java_lang_Class::as_Klass(mirror))->class_loader());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
470 protection_domain = Handle(THREAD,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
471 InstanceKlass::cast(java_lang_Class::as_Klass(mirror))->protection_domain());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // We call ClassLoader.getSystemClassLoader to obtain the system class loader.
a61af66fc99e Initial load
duke
parents:
diff changeset
475 loader = Handle(THREAD, SystemDictionary::java_system_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
478 TempNewSymbol sym = SymbolTable::new_symbol(name, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
479 result = find_class_from_class_loader(env, sym, true, loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
480 protection_domain, true, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
481
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
482 if (TraceClassResolution && result != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
483 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
484 }
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
485
0
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // If we were the first invocation of jni_FindClass, we enable compilation again
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // rather than just allowing invocation counter to overflow and decay.
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // Controlled by flag DelayCompilationDuringStartup.
a61af66fc99e Initial load
duke
parents:
diff changeset
489 if (first_time && !CompileTheWorld)
a61af66fc99e Initial load
duke
parents:
diff changeset
490 CompilationPolicy::completed_vm_startup();
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
493 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
494
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
495 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
496 DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
497 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
498 DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
499 , HOTSPOT_JNI_FROMREFLECTEDMETHOD_RETURN((uintptr_t)_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
500 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 JNI_ENTRY(jmethodID, jni_FromReflectedMethod(JNIEnv *env, jobject method))
a61af66fc99e Initial load
duke
parents:
diff changeset
503 JNIWrapper("FromReflectedMethod");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
504 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 DTRACE_PROBE2(hotspot_jni, FromReflectedMethod__entry, env, method);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
506 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
507 HOTSPOT_JNI_FROMREFLECTEDMETHOD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
508 env, method);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
509 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
510 jmethodID ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
511 DT_RETURN_MARK(FromReflectedMethod, jmethodID, (const jmethodID&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // method is a handle to a java.lang.reflect.Method object
a61af66fc99e Initial load
duke
parents:
diff changeset
514 oop reflected = JNIHandles::resolve_non_null(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
515 oop mirror = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 int slot = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
517
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
518 if (reflected->klass() == SystemDictionary::reflect_Constructor_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
519 mirror = java_lang_reflect_Constructor::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
520 slot = java_lang_reflect_Constructor::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
521 } else {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
522 assert(reflected->klass() == SystemDictionary::reflect_Method_klass(), "wrong type");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
523 mirror = java_lang_reflect_Method::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 slot = java_lang_reflect_Method::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
526 Klass* k = java_lang_Class::as_Klass(mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 KlassHandle k1(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // Make sure class is initialized before handing id's out to methods
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
530 k1()->initialize(CHECK_NULL);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
531 Method* m = InstanceKlass::cast(k1())->method_with_idnum(slot);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
532 ret = m==NULL? NULL : m->jmethod_id(); // return NULL if reflected method deleted
a61af66fc99e Initial load
duke
parents:
diff changeset
533 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
534 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
535
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
536 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
537 DT_RETURN_MARK_DECL(FromReflectedField, jfieldID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
538 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
539 DT_RETURN_MARK_DECL(FromReflectedField, jfieldID
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
540 , HOTSPOT_JNI_FROMREFLECTEDFIELD_RETURN((uintptr_t)_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
541 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 JNI_ENTRY(jfieldID, jni_FromReflectedField(JNIEnv *env, jobject field))
a61af66fc99e Initial load
duke
parents:
diff changeset
544 JNIWrapper("FromReflectedField");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
545 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 DTRACE_PROBE2(hotspot_jni, FromReflectedField__entry, env, field);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
547 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
548 HOTSPOT_JNI_FROMREFLECTEDFIELD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
549 env, field);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
550 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
551 jfieldID ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 DT_RETURN_MARK(FromReflectedField, jfieldID, (const jfieldID&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // field is a handle to a java.lang.reflect.Field object
a61af66fc99e Initial load
duke
parents:
diff changeset
555 oop reflected = JNIHandles::resolve_non_null(field);
a61af66fc99e Initial load
duke
parents:
diff changeset
556 oop mirror = java_lang_reflect_Field::clazz(reflected);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
557 Klass* k = java_lang_Class::as_Klass(mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
558 int slot = java_lang_reflect_Field::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
559 int modifiers = java_lang_reflect_Field::modifiers(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 KlassHandle k1(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // Make sure class is initialized before handing id's out to fields
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
563 k1()->initialize(CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // First check if this is a static field
a61af66fc99e Initial load
duke
parents:
diff changeset
566 if (modifiers & JVM_ACC_STATIC) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
567 intptr_t offset = InstanceKlass::cast(k1())->field_offset( slot );
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
568 JNIid* id = InstanceKlass::cast(k1())->jni_id_for(offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
569 assert(id != NULL, "corrupt Field object");
a61af66fc99e Initial load
duke
parents:
diff changeset
570 debug_only(id->set_is_static_field_id();)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
571 // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the Klass*
0
a61af66fc99e Initial load
duke
parents:
diff changeset
572 ret = jfieldIDWorkaround::to_static_jfieldID(id);
a61af66fc99e Initial load
duke
parents:
diff changeset
573 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // The slot is the index of the field description in the field-array
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // The jfieldID is the offset of the field within the object
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // It may also have hash bits for k, if VerifyJNIFields is turned on.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
579 intptr_t offset = InstanceKlass::cast(k1())->field_offset( slot );
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
580 assert(InstanceKlass::cast(k1())->contains_field_offset(offset), "stay within object");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
581 ret = jfieldIDWorkaround::to_instance_jfieldID(k1(), offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
582 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
583 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
584
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
585 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
586 DT_RETURN_MARK_DECL(ToReflectedMethod, jobject);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
587 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
588 DT_RETURN_MARK_DECL(ToReflectedMethod, jobject
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
589 , HOTSPOT_JNI_TOREFLECTEDMETHOD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
590 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 JNI_ENTRY(jobject, jni_ToReflectedMethod(JNIEnv *env, jclass cls, jmethodID method_id, jboolean isStatic))
a61af66fc99e Initial load
duke
parents:
diff changeset
593 JNIWrapper("ToReflectedMethod");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
594 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595 DTRACE_PROBE4(hotspot_jni, ToReflectedMethod__entry, env, cls, method_id, isStatic);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
596 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
597 HOTSPOT_JNI_TOREFLECTEDMETHOD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
598 env, cls, (uintptr_t) method_id, isStatic);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
599 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
600 jobject ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
601 DT_RETURN_MARK(ToReflectedMethod, jobject, (const jobject&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
602
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
603 methodHandle m (THREAD, Method::resolve_jmethod_id(method_id));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
604 assert(m->is_static() == (isStatic != 0), "jni_ToReflectedMethod access flags doesn't match");
a61af66fc99e Initial load
duke
parents:
diff changeset
605 oop reflection_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 if (m->is_initializer()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
607 reflection_method = Reflection::new_constructor(m, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
608 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
609 reflection_method = Reflection::new_method(m, UseNewReflection, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
610 }
a61af66fc99e Initial load
duke
parents:
diff changeset
611 ret = JNIHandles::make_local(env, reflection_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
612 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
613 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
614
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
615 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
616 DT_RETURN_MARK_DECL(GetSuperclass, jclass);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
617 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
618 DT_RETURN_MARK_DECL(GetSuperclass, jclass
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
619 , HOTSPOT_JNI_GETSUPERCLASS_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
620 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 JNI_ENTRY(jclass, jni_GetSuperclass(JNIEnv *env, jclass sub))
a61af66fc99e Initial load
duke
parents:
diff changeset
623 JNIWrapper("GetSuperclass");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
624 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
625 DTRACE_PROBE2(hotspot_jni, GetSuperclass__entry, env, sub);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
626 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
627 HOTSPOT_JNI_GETSUPERCLASS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
628 env, sub);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
629 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
630 jclass obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
631 DT_RETURN_MARK(GetSuperclass, jclass, (const jclass&)obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
632
a61af66fc99e Initial load
duke
parents:
diff changeset
633 oop mirror = JNIHandles::resolve_non_null(sub);
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // primitive classes return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
635 if (java_lang_Class::is_primitive(mirror)) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
636
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // Rules of Class.getSuperClass as implemented by KLass::java_super:
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // arrays return Object
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // interfaces return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // proper classes return Klass::super()
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
641 Klass* k = java_lang_Class::as_Klass(mirror);
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
642 if (k->is_interface()) return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 // return mirror for superclass
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
645 Klass* super = k->java_super();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // super2 is the value computed by the compiler's getSuperClass intrinsic:
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
647 debug_only(Klass* super2 = ( k->oop_is_array()
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
648 ? SystemDictionary::Object_klass()
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
649 : k->super() ) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
650 assert(super == super2,
a61af66fc99e Initial load
duke
parents:
diff changeset
651 "java_super computation depends on interface, array, other super");
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
652 obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(super->java_mirror());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
653 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super))
a61af66fc99e Initial load
duke
parents:
diff changeset
657 JNIWrapper("IsSubclassOf");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
658 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
659 DTRACE_PROBE3(hotspot_jni, IsAssignableFrom__entry, env, sub, super);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
660 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
661 HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
662 env, sub, super);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
663 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
664 oop sub_mirror = JNIHandles::resolve_non_null(sub);
a61af66fc99e Initial load
duke
parents:
diff changeset
665 oop super_mirror = JNIHandles::resolve_non_null(super);
a61af66fc99e Initial load
duke
parents:
diff changeset
666 if (java_lang_Class::is_primitive(sub_mirror) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
667 java_lang_Class::is_primitive(super_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
668 jboolean ret = (sub_mirror == super_mirror);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
669 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670 DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
671 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
672 HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
673 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
674 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
675 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
677 Klass* sub_klass = java_lang_Class::as_Klass(sub_mirror);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
678 Klass* super_klass = java_lang_Class::as_Klass(super_mirror);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
679 assert(sub_klass != NULL && super_klass != NULL, "invalid arguments to jni_IsAssignableFrom");
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
680 jboolean ret = sub_klass->is_subtype_of(super_klass) ?
0
a61af66fc99e Initial load
duke
parents:
diff changeset
681 JNI_TRUE : JNI_FALSE;
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
682 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
683 DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
684 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
685 HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
686 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
687 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
689 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
690
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
691 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692 DT_RETURN_MARK_DECL(Throw, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
693 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
694 DT_RETURN_MARK_DECL(Throw, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
695 , HOTSPOT_JNI_THROW_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
696 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 JNI_ENTRY(jint, jni_Throw(JNIEnv *env, jthrowable obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
699 JNIWrapper("Throw");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
700 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
701 DTRACE_PROBE2(hotspot_jni, Throw__entry, env, obj);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
702 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
703 HOTSPOT_JNI_THROW_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
704 env, obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
705 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
706 jint ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 DT_RETURN_MARK(Throw, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 THROW_OOP_(JNIHandles::resolve(obj), JNI_OK);
a61af66fc99e Initial load
duke
parents:
diff changeset
710 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
711 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
712
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
713 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
714 DT_RETURN_MARK_DECL(ThrowNew, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
715 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
716 DT_RETURN_MARK_DECL(ThrowNew, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
717 , HOTSPOT_JNI_THROWNEW_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
718 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 JNI_ENTRY(jint, jni_ThrowNew(JNIEnv *env, jclass clazz, const char *message))
a61af66fc99e Initial load
duke
parents:
diff changeset
721 JNIWrapper("ThrowNew");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
722 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
723 DTRACE_PROBE3(hotspot_jni, ThrowNew__entry, env, clazz, message);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
724 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
725 HOTSPOT_JNI_THROWNEW_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
726 env, clazz, (char *) message);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
727 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
728 jint ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
729 DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
730
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
731 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
732 Symbol* name = k->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
733 Handle class_loader (THREAD, k->class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
734 Handle protection_domain (THREAD, k->protection_domain());
a61af66fc99e Initial load
duke
parents:
diff changeset
735 THROW_MSG_LOADER_(name, (char *)message, class_loader, protection_domain, JNI_OK);
a61af66fc99e Initial load
duke
parents:
diff changeset
736 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
737 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // JNI functions only transform a pending async exception to a synchronous
a61af66fc99e Initial load
duke
parents:
diff changeset
741 // exception in ExceptionOccurred and ExceptionCheck calls, since
a61af66fc99e Initial load
duke
parents:
diff changeset
742 // delivering an async exception in other places won't change the native
a61af66fc99e Initial load
duke
parents:
diff changeset
743 // code's control flow and would be harmful when native code further calls
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // JNI functions with a pending exception. Async exception is also checked
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // during the call, so ExceptionOccurred/ExceptionCheck won't return
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // false but deliver the async exception at the very end during
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // state transition.
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 static void jni_check_async_exceptions(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
750 assert(thread == Thread::current(), "must be itself");
a61af66fc99e Initial load
duke
parents:
diff changeset
751 thread->check_and_handle_async_exceptions();
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_NO_PRESERVE(jthrowable, jni_ExceptionOccurred(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
755 JNIWrapper("ExceptionOccurred");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
756 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
757 DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__entry, env);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
758 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
759 HOTSPOT_JNI_EXCEPTIONOCCURRED_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
760 env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
761 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
762 jni_check_async_exceptions(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
763 oop exception = thread->pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
764 jthrowable ret = (jthrowable) JNIHandles::make_local(env, exception);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
765 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
766 DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
767 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
768 HOTSPOT_JNI_EXCEPTIONOCCURRED_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
769 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
770 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
771 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
772 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionDescribe(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
776 JNIWrapper("ExceptionDescribe");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
777 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
778 DTRACE_PROBE1(hotspot_jni, ExceptionDescribe__entry, env);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
779 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
780 HOTSPOT_JNI_EXCEPTIONDESCRIBE_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
781 env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
782 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
783 if (thread->has_pending_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 Handle ex(thread, thread->pending_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
785 thread->clear_pending_exception();
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
786 if (ex->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // Don't print anything if we are being killed.
a61af66fc99e Initial load
duke
parents:
diff changeset
788 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
789 jio_fprintf(defaultStream::error_stream(), "Exception ");
a61af66fc99e Initial load
duke
parents:
diff changeset
790 if (thread != NULL && thread->threadObj() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
791 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
793 "in thread \"%s\" ", thread->get_thread_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
795 if (ex->is_a(SystemDictionary::Throwable_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
796 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
797 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
798 ex,
a61af66fc99e Initial load
duke
parents:
diff changeset
799 KlassHandle(THREAD,
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1132
diff changeset
800 SystemDictionary::Throwable_klass()),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
801 vmSymbols::printStackTrace_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
802 vmSymbols::void_method_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
803 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // If an exception is thrown in the call it gets thrown away. Not much
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // we can do with it. The native code that calls this, does not check
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // for the exception - hence, it might still be in the thread when DestroyVM gets
a61af66fc99e Initial load
duke
parents:
diff changeset
807 // called, potentially causing a few asserts to trigger - since no pending exception
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // is expected.
a61af66fc99e Initial load
duke
parents:
diff changeset
809 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
812 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
813 ". Uncaught exception of type %s.",
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
814 ex->klass()->external_name());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
815 }
a61af66fc99e Initial load
duke
parents:
diff changeset
816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
817 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
818 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
819 DTRACE_PROBE(hotspot_jni, ExceptionDescribe__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
820 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
821 HOTSPOT_JNI_EXCEPTIONDESCRIBE_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
822 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
823 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
824 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
825
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 JNI_QUICK_ENTRY(void, jni_ExceptionClear(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
828 JNIWrapper("ExceptionClear");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
829 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
830 DTRACE_PROBE1(hotspot_jni, ExceptionClear__entry, env);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
831 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
832 HOTSPOT_JNI_EXCEPTIONCLEAR_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
833 env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
834 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // The jni code might be using this API to clear java thrown exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // So just mark jvmti thread exception state as exception caught.
a61af66fc99e Initial load
duke
parents:
diff changeset
838 JvmtiThreadState *state = JavaThread::current()->jvmti_thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
839 if (state != NULL && state->is_exception_detected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
840 state->set_exception_caught();
a61af66fc99e Initial load
duke
parents:
diff changeset
841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
842 thread->clear_pending_exception();
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
843 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
844 DTRACE_PROBE(hotspot_jni, ExceptionClear__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
845 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
846 HOTSPOT_JNI_EXCEPTIONCLEAR_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
847 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
848 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
849 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 JNI_ENTRY(void, jni_FatalError(JNIEnv *env, const char *msg))
a61af66fc99e Initial load
duke
parents:
diff changeset
853 JNIWrapper("FatalError");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
854 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
855 DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
856 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
857 HOTSPOT_JNI_FATALERROR_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
858 env, (char *) msg);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
859 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
860 tty->print_cr("FATAL ERROR in native method: %s", msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
861 thread->print_stack();
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 113
diff changeset
862 os::abort(); // Dump core and abort
0
a61af66fc99e Initial load
duke
parents:
diff changeset
863 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 JNI_ENTRY(jint, jni_PushLocalFrame(JNIEnv *env, jint capacity))
a61af66fc99e Initial load
duke
parents:
diff changeset
867 JNIWrapper("PushLocalFrame");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
868 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
869 DTRACE_PROBE2(hotspot_jni, PushLocalFrame__entry, env, capacity);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
870 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
871 HOTSPOT_JNI_PUSHLOCALFRAME_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
872 env, capacity);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
873 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
874 //%note jni_11
20324
8ae0d26ab728 8046919: jni_PushLocalFrame OOM - increase MAX_REASONABLE_LOCAL_CAPACITY
dsimms
parents: 20318
diff changeset
875 if (capacity < 0 ||
8ae0d26ab728 8046919: jni_PushLocalFrame OOM - increase MAX_REASONABLE_LOCAL_CAPACITY
dsimms
parents: 20318
diff changeset
876 ((MaxJNILocalCapacity > 0) && (capacity > MaxJNILocalCapacity))) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
877 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
878 DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, JNI_ERR);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
879 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
880 HOTSPOT_JNI_PUSHLOCALFRAME_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
881 (uint32_t)JNI_ERR);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
882 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
883 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
885 JNIHandleBlock* old_handles = thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
886 JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
887 assert(new_handles != NULL, "should not be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
888 new_handles->set_pop_frame_link(old_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 thread->set_active_handles(new_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 jint ret = JNI_OK;
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
891 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
892 DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
893 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
894 HOTSPOT_JNI_PUSHLOCALFRAME_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
895 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
896 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
897 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900
a61af66fc99e Initial load
duke
parents:
diff changeset
901 JNI_ENTRY(jobject, jni_PopLocalFrame(JNIEnv *env, jobject result))
a61af66fc99e Initial load
duke
parents:
diff changeset
902 JNIWrapper("PopLocalFrame");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
903 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
904 DTRACE_PROBE2(hotspot_jni, PopLocalFrame__entry, env, result);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
905 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
906 HOTSPOT_JNI_POPLOCALFRAME_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
907 env, result);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
908 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
909 //%note jni_11
a61af66fc99e Initial load
duke
parents:
diff changeset
910 Handle result_handle(thread, JNIHandles::resolve(result));
a61af66fc99e Initial load
duke
parents:
diff changeset
911 JNIHandleBlock* old_handles = thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
912 JNIHandleBlock* new_handles = old_handles->pop_frame_link();
a61af66fc99e Initial load
duke
parents:
diff changeset
913 if (new_handles != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // 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
915 // This way code will still work if PopLocalFrame is called without a corresponding
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // PushLocalFrame call. Note that we set the pop_frame_link to NULL explicitly, otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // the release_block call will release the blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
918 thread->set_active_handles(new_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
919 old_handles->set_pop_frame_link(NULL); // clear link we won't release new_handles below
a61af66fc99e Initial load
duke
parents:
diff changeset
920 JNIHandleBlock::release_block(old_handles, thread); // may block
a61af66fc99e Initial load
duke
parents:
diff changeset
921 result = JNIHandles::make_local(thread, result_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
923 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
924 DTRACE_PROBE1(hotspot_jni, PopLocalFrame__return, result);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
925 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
926 HOTSPOT_JNI_POPLOCALFRAME_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
927 result);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
928 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
929 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
930 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933 JNI_ENTRY(jobject, jni_NewGlobalRef(JNIEnv *env, jobject ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
934 JNIWrapper("NewGlobalRef");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
935 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
936 DTRACE_PROBE2(hotspot_jni, NewGlobalRef__entry, env, ref);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
937 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
938 HOTSPOT_JNI_NEWGLOBALREF_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
939 env, ref);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
940 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
941 Handle ref_handle(thread, JNIHandles::resolve(ref));
a61af66fc99e Initial load
duke
parents:
diff changeset
942 jobject ret = JNIHandles::make_global(ref_handle);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
943 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
944 DTRACE_PROBE1(hotspot_jni, NewGlobalRef__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
945 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
946 HOTSPOT_JNI_NEWGLOBALREF_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
947 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
948 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
949 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
950 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
951
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // Must be JNI_ENTRY (with HandleMark)
a61af66fc99e Initial load
duke
parents:
diff changeset
953 JNI_ENTRY_NO_PRESERVE(void, jni_DeleteGlobalRef(JNIEnv *env, jobject ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
954 JNIWrapper("DeleteGlobalRef");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
955 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
956 DTRACE_PROBE2(hotspot_jni, DeleteGlobalRef__entry, env, ref);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
957 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
958 HOTSPOT_JNI_DELETEGLOBALREF_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
959 env, ref);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
960 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
961 JNIHandles::destroy_global(ref);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
962 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
963 DTRACE_PROBE(hotspot_jni, DeleteGlobalRef__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
964 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
965 HOTSPOT_JNI_DELETEGLOBALREF_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
966 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
967 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
968 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 JNI_QUICK_ENTRY(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
971 JNIWrapper("DeleteLocalRef");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
972 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
973 DTRACE_PROBE2(hotspot_jni, DeleteLocalRef__entry, env, obj);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
974 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
975 HOTSPOT_JNI_DELETELOCALREF_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
976 env, obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
977 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
978 JNIHandles::destroy_local(obj);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
979 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
980 DTRACE_PROBE(hotspot_jni, DeleteLocalRef__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
981 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
982 HOTSPOT_JNI_DELETELOCALREF_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
983 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
984 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
985 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
986
a61af66fc99e Initial load
duke
parents:
diff changeset
987 JNI_QUICK_ENTRY(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2))
a61af66fc99e Initial load
duke
parents:
diff changeset
988 JNIWrapper("IsSameObject");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
989 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
990 DTRACE_PROBE3(hotspot_jni, IsSameObject__entry, env, r1, r2);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
991 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
992 HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
993 env, r1, r2);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
994 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
995 oop a = JNIHandles::resolve(r1);
a61af66fc99e Initial load
duke
parents:
diff changeset
996 oop b = JNIHandles::resolve(r2);
a61af66fc99e Initial load
duke
parents:
diff changeset
997 jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE;
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
998 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
999 DTRACE_PROBE1(hotspot_jni, IsSameObject__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1000 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1001 HOTSPOT_JNI_ISSAMEOBJECT_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1002 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1003 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1006
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 JNI_ENTRY(jobject, jni_NewLocalRef(JNIEnv *env, jobject ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 JNIWrapper("NewLocalRef");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1010 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 DTRACE_PROBE2(hotspot_jni, NewLocalRef__entry, env, ref);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1012 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1013 HOTSPOT_JNI_NEWLOCALREF_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1014 env, ref);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1015 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 jobject ret = JNIHandles::make_local(env, JNIHandles::resolve(ref));
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1017 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 DTRACE_PROBE1(hotspot_jni, NewLocalRef__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1019 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1020 HOTSPOT_JNI_NEWLOCALREF_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1021 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1022 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1025
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 JNI_LEAF(jint, jni_EnsureLocalCapacity(JNIEnv *env, jint capacity))
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 JNIWrapper("EnsureLocalCapacity");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1028 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 DTRACE_PROBE2(hotspot_jni, EnsureLocalCapacity__entry, env, capacity);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1030 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1031 HOTSPOT_JNI_ENSURELOCALCAPACITY_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1032 env, capacity);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1033 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 jint ret;
20324
8ae0d26ab728 8046919: jni_PushLocalFrame OOM - increase MAX_REASONABLE_LOCAL_CAPACITY
dsimms
parents: 20318
diff changeset
1035 if (capacity >= 0 &&
8ae0d26ab728 8046919: jni_PushLocalFrame OOM - increase MAX_REASONABLE_LOCAL_CAPACITY
dsimms
parents: 20318
diff changeset
1036 ((MaxJNILocalCapacity <= 0) || (capacity <= MaxJNILocalCapacity))) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1041 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 DTRACE_PROBE1(hotspot_jni, EnsureLocalCapacity__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1043 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1044 HOTSPOT_JNI_ENSURELOCALCAPACITY_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1045 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1046 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1049
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 // Return the Handle Type
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 JNI_LEAF(jobjectRefType, jni_GetObjectRefType(JNIEnv *env, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 JNIWrapper("GetObjectRefType");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1053 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 DTRACE_PROBE2(hotspot_jni, GetObjectRefType__entry, env, obj);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1055 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1056 HOTSPOT_JNI_GETOBJECTREFTYPE_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1057 env, obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1058 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 jobjectRefType ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 if (JNIHandles::is_local_handle(thread, obj) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 JNIHandles::is_frame_handle(thread, obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 ret = JNILocalRefType;
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 else if (JNIHandles::is_global_handle(obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 ret = JNIGlobalRefType;
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 else if (JNIHandles::is_weak_global_handle(obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 ret = JNIWeakGlobalRefType;
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 ret = JNIInvalidRefType;
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1069 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 DTRACE_PROBE1(hotspot_jni, GetObjectRefType__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1071 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1072 HOTSPOT_JNI_GETOBJECTREFTYPE_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1073 (void *) ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1074 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 class JNI_ArgumentPusher : public SignatureIterator {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 JavaCallArguments* _arguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
1082
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 virtual void get_bool () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 virtual void get_char () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 virtual void get_short () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 virtual void get_byte () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 virtual void get_int () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 virtual void get_long () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 virtual void get_float () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 virtual void get_double () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 virtual void get_object () = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1093 JNI_ArgumentPusher(Symbol* signature) : SignatureIterator(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 this->_return_type = T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 _arguments = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 virtual void iterate( uint64_t fingerprint ) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 void set_java_argument_object(JavaCallArguments *arguments) { _arguments = arguments; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1102
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 inline void do_bool() { if (!is_return_type()) get_bool(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 inline void do_char() { if (!is_return_type()) get_char(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 inline void do_short() { if (!is_return_type()) get_short(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 inline void do_byte() { if (!is_return_type()) get_byte(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 inline void do_int() { if (!is_return_type()) get_int(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 inline void do_long() { if (!is_return_type()) get_long(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 inline void do_float() { if (!is_return_type()) get_float(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 inline void do_double() { if (!is_return_type()) get_double(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 inline void do_object(int begin, int end) { if (!is_return_type()) get_object(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 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
1113 inline void do_void() { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 JavaCallArguments* arguments() { return _arguments; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 void push_receiver(Handle h) { _arguments->push_oop(h); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1118
a61af66fc99e Initial load
duke
parents:
diff changeset
1119
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 class JNI_ArgumentPusherVaArg : public JNI_ArgumentPusher {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 va_list _ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1123
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 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
1125 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
1126 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
1127 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
1128 inline void get_int() { _arguments->push_int(va_arg(_ap, jint)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 // 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
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 inline void get_long() { _arguments->push_long(va_arg(_ap, jlong)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 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
1134 inline void get_double() { _arguments->push_double(va_arg(_ap, jdouble)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 inline void get_object() { jobject l = va_arg(_ap, jobject);
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 _arguments->push_oop(Handle((oop *)l, false)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1137
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 inline void set_ap(va_list rap) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 #ifdef va_copy
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 va_copy(_ap, rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 #elif defined (__va_copy)
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 __va_copy(_ap, rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 _ap = rap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1149 JNI_ArgumentPusherVaArg(Symbol* signature, va_list rap)
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1150 : JNI_ArgumentPusher(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 set_ap(rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1153 JNI_ArgumentPusherVaArg(jmethodID method_id, va_list rap)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1154 : JNI_ArgumentPusher(Method::resolve_jmethod_id(method_id)->signature()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 set_ap(rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 // Optimized path if we have the bitvector form of signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 void iterate( uint64_t fingerprint ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 if ( fingerprint == UCONST64(-1) ) SignatureIterator::iterate();// Must be too many arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 _return_type = (BasicType)((fingerprint >> static_feature_size) &
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 result_feature_mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
1164
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 assert(fingerprint, "Fingerprint should not be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 fingerprint = fingerprint >> (static_feature_size + result_feature_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 while ( 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 switch ( fingerprint & parameter_feature_mask ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 case bool_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 case char_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 case short_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 case byte_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 case int_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 get_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 case obj_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 get_object();
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 case long_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 get_long();
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 case float_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 get_float();
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 case double_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 case done_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 fingerprint >>= parameter_feature_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 class JNI_ArgumentPusherArray : public JNI_ArgumentPusher {
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 const jvalue *_ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1205
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 inline void get_bool() { _arguments->push_int((jint)(_ap++)->z); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 inline void get_char() { _arguments->push_int((jint)(_ap++)->c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 inline void get_short() { _arguments->push_int((jint)(_ap++)->s); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 inline void get_byte() { _arguments->push_int((jint)(_ap++)->b); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 inline void get_int() { _arguments->push_int((jint)(_ap++)->i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 inline void get_long() { _arguments->push_long((_ap++)->j); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 inline void get_float() { _arguments->push_float((_ap++)->f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 inline void get_double() { _arguments->push_double((_ap++)->d);}
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 inline void get_object() { _arguments->push_oop(Handle((oop *)(_ap++)->l, false)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 inline void set_ap(const jvalue *rap) { _ap = rap; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 public:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1220 JNI_ArgumentPusherArray(Symbol* signature, const jvalue *rap)
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1221 : JNI_ArgumentPusher(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 set_ap(rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1224 JNI_ArgumentPusherArray(jmethodID method_id, const jvalue *rap)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1225 : JNI_ArgumentPusher(Method::resolve_jmethod_id(method_id)->signature()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 set_ap(rap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1228
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // Optimized path if we have the bitvector form of signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 void iterate( uint64_t fingerprint ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 if ( fingerprint == UCONST64(-1) ) SignatureIterator::iterate(); // Must be too many arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 _return_type = (BasicType)((fingerprint >> static_feature_size) &
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 result_feature_mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 assert(fingerprint, "Fingerprint should not be 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 fingerprint = fingerprint >> (static_feature_size + result_feature_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 while ( 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 switch ( fingerprint & parameter_feature_mask ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 case bool_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 get_bool();
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 case char_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 get_char();
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 case short_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 get_short();
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 case byte_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 get_byte();
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 case int_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 get_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 case obj_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 get_object();
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 case long_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 get_long();
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 case float_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 get_float();
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 case double_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 get_double();
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 case done_parm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 fingerprint >>= parameter_feature_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1278
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 enum JNICallType {
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 JNI_STATIC,
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 JNI_VIRTUAL,
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 JNI_NONVIRTUAL
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1285
a61af66fc99e Initial load
duke
parents:
diff changeset
1286
a61af66fc99e Initial load
duke
parents:
diff changeset
1287
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1289 methodHandle method(THREAD, Method::resolve_jmethod_id(method_id));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1290
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 // Create object to hold arguments for the JavaCall, and associate it with
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 // the jni parser
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 int number_of_parameters = method->size_of_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 JavaCallArguments java_args(number_of_parameters);
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 args->set_java_argument_object(&java_args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1297
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 assert(method->is_static(), "method should be static");
a61af66fc99e Initial load
duke
parents:
diff changeset
1299
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 // Fill out JavaCallArguments object
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1301 args->iterate( Fingerprinter(method).fingerprint() );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 // Initialize result type
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 result->set_type(args->get_ret_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1304
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 // Invoke the method. Result is returned as oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 JavaCalls::call(result, method, &java_args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1307
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 // Convert result
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1313
a61af66fc99e Initial load
duke
parents:
diff changeset
1314
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 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
1316 oop recv = JNIHandles::resolve(receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 if (recv == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 Handle h_recv(THREAD, recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
1321
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 int number_of_parameters;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1323 Method* selected_method;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1325 Method* m = Method::resolve_jmethod_id(method_id);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 number_of_parameters = m->size_of_parameters();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1327 Klass* holder = m->method_holder();
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1328 if (!(holder)->is_interface()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 // non-interface call -- for that little speed boost, don't handlize
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 debug_only(No_Safepoint_Verifier nosafepoint;)
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 if (call_type == JNI_VIRTUAL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 // jni_GetMethodID makes sure class is linked and initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 // so m should have a valid vtable index.
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12111
diff changeset
1334 assert(!m->has_itable_index(), "");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 int vtbl_index = m->vtable_index();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1336 if (vtbl_index != Method::nonvirtual_vtable_index) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1337 Klass* k = h_recv->klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 // k might be an arrayKlassOop but all vtables start at
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 // the same place. The cast is to avoid virtual call and assertion.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1340 InstanceKlass *ik = (InstanceKlass*)k;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 selected_method = ik->method_at_vtable(vtbl_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 // final method
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 selected_method = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 // JNI_NONVIRTUAL call
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 selected_method = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 // interface call
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 KlassHandle h_holder(THREAD, holder);
a61af66fc99e Initial load
duke
parents:
diff changeset
1353
17685
fd07a7e4222b 8033126: Can't call default methods from JNI
sla
parents: 17648
diff changeset
1354 if (call_type == JNI_VIRTUAL) {
fd07a7e4222b 8033126: Can't call default methods from JNI
sla
parents: 17648
diff changeset
1355 int itbl_index = m->itable_index();
fd07a7e4222b 8033126: Can't call default methods from JNI
sla
parents: 17648
diff changeset
1356 Klass* k = h_recv->klass();
fd07a7e4222b 8033126: Can't call default methods from JNI
sla
parents: 17648
diff changeset
1357 selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
fd07a7e4222b 8033126: Can't call default methods from JNI
sla
parents: 17648
diff changeset
1358 } else {
fd07a7e4222b 8033126: Can't call default methods from JNI
sla
parents: 17648
diff changeset
1359 selected_method = m;
fd07a7e4222b 8033126: Can't call default methods from JNI
sla
parents: 17648
diff changeset
1360 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1363
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 methodHandle method(THREAD, selected_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1365
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 // Create object to hold arguments for the JavaCall, and associate it with
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 // the jni parser
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 JavaCallArguments java_args(number_of_parameters);
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 args->set_java_argument_object(&java_args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 // handle arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 assert(!method->is_static(), "method should not be static");
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 args->push_receiver(h_recv); // Push jobject handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1375
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 // Fill out JavaCallArguments object
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1377 args->iterate( Fingerprinter(method).fingerprint() );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 // Initialize result type
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 result->set_type(args->get_ret_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1380
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 // Invoke the method. Result is returned as oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 JavaCalls::call(result, method, &java_args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1383
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 // Convert result
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1389
a61af66fc99e Initial load
duke
parents:
diff changeset
1390
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 static instanceOop alloc_object(jclass clazz, TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1392 KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1393 k()->check_valid_for_instantiation(false, CHECK_NULL);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1394 InstanceKlass::cast(k())->initialize(CHECK_NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1395 instanceOop ih = InstanceKlass::cast(k())->allocate_instance(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 return ih;
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1398
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1399 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 DT_RETURN_MARK_DECL(AllocObject, jobject);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1401 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1402 DT_RETURN_MARK_DECL(AllocObject, jobject
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1403 , HOTSPOT_JNI_ALLOCOBJECT_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1404 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1405
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 JNI_ENTRY(jobject, jni_AllocObject(JNIEnv *env, jclass clazz))
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 JNIWrapper("AllocObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
1408
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1409 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 DTRACE_PROBE2(hotspot_jni, AllocObject__entry, env, clazz);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1411 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1412 HOTSPOT_JNI_ALLOCOBJECT_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1413 env, clazz);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1414 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 jobject ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 DT_RETURN_MARK(AllocObject, jobject, (const jobject&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
1417
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 instanceOop i = alloc_object(clazz, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 ret = JNIHandles::make_local(env, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1422
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1423 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 DT_RETURN_MARK_DECL(NewObjectA, jobject);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1425 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1426 DT_RETURN_MARK_DECL(NewObjectA, jobject
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1427 , HOTSPOT_JNI_NEWOBJECTA_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1428 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1429
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 JNI_ENTRY(jobject, jni_NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 JNIWrapper("NewObjectA");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1432 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 DTRACE_PROBE3(hotspot_jni, NewObjectA__entry, env, clazz, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1434 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1435 HOTSPOT_JNI_NEWOBJECTA_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1436 env, clazz, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1437 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 jobject obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1440
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 instanceOop i = alloc_object(clazz, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 obj = JNIHandles::make_local(env, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1444 JNI_ArgumentPusherArray ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1449 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 DT_RETURN_MARK_DECL(NewObjectV, jobject);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1451 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1452 DT_RETURN_MARK_DECL(NewObjectV, jobject
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1453 , HOTSPOT_JNI_NEWOBJECTV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1454 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1455
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 JNI_ENTRY(jobject, jni_NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 JNIWrapper("NewObjectV");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1458 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 DTRACE_PROBE3(hotspot_jni, NewObjectV__entry, env, clazz, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1460 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1461 HOTSPOT_JNI_NEWOBJECTV_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1462 env, clazz, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1463 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 jobject obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1466
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 instanceOop i = alloc_object(clazz, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 obj = JNIHandles::make_local(env, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1470 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1474
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1475 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 DT_RETURN_MARK_DECL(NewObject, jobject);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1477 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1478 DT_RETURN_MARK_DECL(NewObject, jobject
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1479 , HOTSPOT_JNI_NEWOBJECT_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1480 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1481
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 JNI_ENTRY(jobject, jni_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...))
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 JNIWrapper("NewObject");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1484 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 DTRACE_PROBE3(hotspot_jni, NewObject__entry, env, clazz, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1486 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1487 HOTSPOT_JNI_NEWOBJECT_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1488 env, clazz, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1489 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 jobject obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1492
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 instanceOop i = alloc_object(clazz, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 obj = JNIHandles::make_local(env, i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 va_start(args, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1498 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 return obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1503
a61af66fc99e Initial load
duke
parents:
diff changeset
1504
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 JNIWrapper("GetObjectClass");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1507 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 DTRACE_PROBE2(hotspot_jni, GetObjectClass__entry, env, obj);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1509 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1510 HOTSPOT_JNI_GETOBJECTCLASS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1511 env, obj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1512 #endif /* USDT2 */
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1513 Klass* k = JNIHandles::resolve_non_null(obj)->klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 jclass ret =
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1515 (jclass) JNIHandles::make_local(env, k->java_mirror());
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1516 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 DTRACE_PROBE1(hotspot_jni, GetObjectClass__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1518 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1519 HOTSPOT_JNI_GETOBJECTCLASS_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1520 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1521 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1524
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 JNI_QUICK_ENTRY(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz))
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 JNIWrapper("IsInstanceOf");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1527 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 DTRACE_PROBE3(hotspot_jni, IsInstanceOf__entry, env, obj, clazz);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1529 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1530 HOTSPOT_JNI_ISINSTANCEOF_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1531 env, obj, clazz);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1532 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 jboolean ret = JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 if (obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 ret = JNI_FALSE;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1536 Klass* k = java_lang_Class::as_Klass(
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 JNIHandles::resolve_non_null(clazz));
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 if (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 ret = JNIHandles::resolve_non_null(obj)->is_a(k) ? JNI_TRUE : JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1542 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 DTRACE_PROBE1(hotspot_jni, IsInstanceOf__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1544 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1545 HOTSPOT_JNI_ISINSTANCEOF_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1546 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1547 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1550
a61af66fc99e Initial load
duke
parents:
diff changeset
1551
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 static jmethodID get_method_id(JNIEnv *env, jclass clazz, const char *name_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 const char *sig, bool is_static, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 // %%%% This code should probably just call into a method in the LinkResolver
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 // The class should have been loaded (we have an instance of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 // passed in) so the method and signature should already be in the symbol
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 // 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
1559 const char *name_to_probe = (name_str == NULL)
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1560 ? vmSymbols::object_initializer_name()->as_C_string()
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1561 : name_str;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1562 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
1563 TempNewSymbol signature = SymbolTable::probe(sig, (int)strlen(sig));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1564
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1565 if (name == NULL || signature == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1568
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 // Throw a NoSuchMethodError exception if we have an instance of a
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 // primitive java.lang.Class
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(clazz))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1574
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 KlassHandle klass(THREAD,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1576 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1577
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 // Make sure class is linked and initialized before handing id's out to
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1579 // Method*s.
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
1580 klass()->initialize(CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1581
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1582 Method* m;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1583 if (name == vmSymbols::object_initializer_name() ||
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1584 name == vmSymbols::class_initializer_name()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 // Never search superclasses for constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 if (klass->oop_is_instance()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
1587 m = InstanceKlass::cast(klass())->find_method(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 m = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 } else {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1592 m = klass->lookup_method(name, signature);
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12819
diff changeset
1593 if (m == NULL && klass->oop_is_instance()) {
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12819
diff changeset
1594 m = InstanceKlass::cast(klass())->lookup_method_in_ordered_interfaces(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 if (m == NULL || (m->is_static() != is_static)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 return m->jmethod_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1602
a61af66fc99e Initial load
duke
parents:
diff changeset
1603
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 JNI_ENTRY(jmethodID, jni_GetMethodID(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 const char *name, const char *sig))
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 JNIWrapper("GetMethodID");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1607 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 DTRACE_PROBE4(hotspot_jni, GetMethodID__entry, env, clazz, name, sig);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1609 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1610 HOTSPOT_JNI_GETMETHODID_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1611 env, clazz, (char *) name, (char *) sig);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1612 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 jmethodID ret = get_method_id(env, clazz, name, sig, false, thread);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1614 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 DTRACE_PROBE1(hotspot_jni, GetMethodID__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1616 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1617 HOTSPOT_JNI_GETMETHODID_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1618 (uintptr_t) ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1619 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1622
a61af66fc99e Initial load
duke
parents:
diff changeset
1623
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 JNI_ENTRY(jmethodID, jni_GetStaticMethodID(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 const char *name, const char *sig))
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 JNIWrapper("GetStaticMethodID");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1627 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 DTRACE_PROBE4(hotspot_jni, GetStaticMethodID__entry, env, clazz, name, sig);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1629 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1630 HOTSPOT_JNI_GETSTATICMETHODID_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1631 env, (char *) clazz, (char *) name, (char *)sig);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1632 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 jmethodID ret = get_method_id(env, clazz, name, sig, true, thread);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1634 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 DTRACE_PROBE1(hotspot_jni, GetStaticMethodID__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1636 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1637 HOTSPOT_JNI_GETSTATICMETHODID_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1638 (uintptr_t) ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1639 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1642
a61af66fc99e Initial load
duke
parents:
diff changeset
1643
a61af66fc99e Initial load
duke
parents:
diff changeset
1644
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 // Calling Methods
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1648
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1649 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 #define DEFINE_CALLMETHOD(ResultType, Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodV, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodA, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 jni_Call##Result##Method(JNIEnv *env, jobject obj, jmethodID methodID, ...)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 JNIWrapper("Call" XSTR(Result) "Method"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1660 DTRACE_PROBE3(hotspot_jni, Call##Result##Method__entry, env, obj, methodID); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 DT_RETURN_MARK_FOR(Result, Call##Result##Method, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 va_list args; \
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 va_start(args, methodID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1668 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 va_end(args); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 jni_Call##Result##MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 JNIWrapper("Call" XSTR(Result) "MethodV"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1680 DTRACE_PROBE3(hotspot_jni, Call##Result##MethodV__entry, env, obj, methodID); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 DT_RETURN_MARK_FOR(Result, Call##Result##MethodV, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1686 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 jni_Call##Result##MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 JNIWrapper("Call" XSTR(Result) "MethodA"); \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1696 DTRACE_PROBE3(hotspot_jni, Call##Result##MethodA__entry, env, obj, methodID); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 DT_RETURN_MARK_FOR(Result, Call##Result##MethodA, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1702 JNI_ArgumentPusherArray ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1707
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 // the runtime type of subword integral basic types is integer
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 DEFINE_CALLMETHOD(jboolean, Boolean, T_BOOLEAN)
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 DEFINE_CALLMETHOD(jbyte, Byte, T_BYTE)
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 DEFINE_CALLMETHOD(jchar, Char, T_CHAR)
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 DEFINE_CALLMETHOD(jshort, Short, T_SHORT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1713
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 DEFINE_CALLMETHOD(jobject, Object, T_OBJECT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 DEFINE_CALLMETHOD(jint, Int, T_INT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 DEFINE_CALLMETHOD(jlong, Long, T_LONG)
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 DEFINE_CALLMETHOD(jfloat, Float, T_FLOAT)
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 DEFINE_CALLMETHOD(jdouble, Double, T_DOUBLE)
a61af66fc99e Initial load
duke
parents:
diff changeset
1719
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 DT_VOID_RETURN_MARK_DECL(CallVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 DT_VOID_RETURN_MARK_DECL(CallVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 DT_VOID_RETURN_MARK_DECL(CallVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
1723
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1724 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1725
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1726 #define DEFINE_CALLMETHOD(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1727 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1728 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1729 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1730 , ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1731 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1732 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1733 jni_Call##Result##Method(JNIEnv *env, jobject obj, jmethodID methodID, ...)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1734 JNIWrapper("Call" XSTR(Result) "Method"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1735 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1736 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1737 ResultType ret = 0;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1738 DT_RETURN_MARK_FOR(Result, Call##Result##Method, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1739 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1740 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1741 va_list args; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1742 va_start(args, methodID); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1743 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1744 JNI_ArgumentPusherVaArg ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1745 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1746 va_end(args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1747 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1748 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1749 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1750
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1751 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1752 DEFINE_CALLMETHOD(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1753 , HOTSPOT_JNI_CALLBOOLEANMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1754 HOTSPOT_JNI_CALLBOOLEANMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1755 DEFINE_CALLMETHOD(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1756 , HOTSPOT_JNI_CALLBYTEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1757 HOTSPOT_JNI_CALLBYTEMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1758 DEFINE_CALLMETHOD(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1759 , HOTSPOT_JNI_CALLCHARMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1760 HOTSPOT_JNI_CALLCHARMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1761 DEFINE_CALLMETHOD(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1762 , HOTSPOT_JNI_CALLSHORTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1763 HOTSPOT_JNI_CALLSHORTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1764
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1765 DEFINE_CALLMETHOD(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1766 , HOTSPOT_JNI_CALLOBJECTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1767 HOTSPOT_JNI_CALLOBJECTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1768 DEFINE_CALLMETHOD(jint, Int, T_INT,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1769 HOTSPOT_JNI_CALLINTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1770 HOTSPOT_JNI_CALLINTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1771 DEFINE_CALLMETHOD(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1772 , HOTSPOT_JNI_CALLLONGMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1773 HOTSPOT_JNI_CALLLONGMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1774 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1775 DEFINE_CALLMETHOD(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1776 , HOTSPOT_JNI_CALLFLOATMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1777 HOTSPOT_JNI_CALLFLOATMETHOD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1778 DEFINE_CALLMETHOD(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1779 , HOTSPOT_JNI_CALLDOUBLEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1780 HOTSPOT_JNI_CALLDOUBLEMETHOD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1781
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1782 #define DEFINE_CALLMETHODV(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1783 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1784 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1785 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodV, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1786 , ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1787 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1788 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1789 jni_Call##Result##MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1790 JNIWrapper("Call" XSTR(Result) "MethodV"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1791 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1792 EntryProbe;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1793 ResultType ret = 0;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1794 DT_RETURN_MARK_FOR(Result, Call##Result##MethodV, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1795 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1796 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1797 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1798 JNI_ArgumentPusherVaArg ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1799 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1800 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1801 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1802 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1803
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1804 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1805 DEFINE_CALLMETHODV(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1806 , HOTSPOT_JNI_CALLBOOLEANMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1807 HOTSPOT_JNI_CALLBOOLEANMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1808 DEFINE_CALLMETHODV(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1809 , HOTSPOT_JNI_CALLBYTEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1810 HOTSPOT_JNI_CALLBYTEMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1811 DEFINE_CALLMETHODV(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1812 , HOTSPOT_JNI_CALLCHARMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1813 HOTSPOT_JNI_CALLCHARMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1814 DEFINE_CALLMETHODV(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1815 , HOTSPOT_JNI_CALLSHORTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1816 HOTSPOT_JNI_CALLSHORTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1817
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1818 DEFINE_CALLMETHODV(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1819 , HOTSPOT_JNI_CALLOBJECTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1820 HOTSPOT_JNI_CALLOBJECTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1821 DEFINE_CALLMETHODV(jint, Int, T_INT,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1822 HOTSPOT_JNI_CALLINTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1823 HOTSPOT_JNI_CALLINTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1824 DEFINE_CALLMETHODV(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1825 , HOTSPOT_JNI_CALLLONGMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1826 HOTSPOT_JNI_CALLLONGMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1827 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1828 DEFINE_CALLMETHODV(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1829 , HOTSPOT_JNI_CALLFLOATMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1830 HOTSPOT_JNI_CALLFLOATMETHOD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1831 DEFINE_CALLMETHODV(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1832 , HOTSPOT_JNI_CALLDOUBLEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1833 HOTSPOT_JNI_CALLDOUBLEMETHOD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1834
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1835 #define DEFINE_CALLMETHODA(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1836 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1837 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1838 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodA, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1839 , ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1840 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1841 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1842 jni_Call##Result##MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1843 JNIWrapper("Call" XSTR(Result) "MethodA"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1844 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1845 ResultType ret = 0;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1846 DT_RETURN_MARK_FOR(Result, Call##Result##MethodA, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1847 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1848 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1849 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1850 JNI_ArgumentPusherArray ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1851 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1852 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1853 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1854 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1855
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1856 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1857 DEFINE_CALLMETHODA(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1858 , HOTSPOT_JNI_CALLBOOLEANMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1859 HOTSPOT_JNI_CALLBOOLEANMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1860 DEFINE_CALLMETHODA(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1861 , HOTSPOT_JNI_CALLBYTEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1862 HOTSPOT_JNI_CALLBYTEMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1863 DEFINE_CALLMETHODA(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1864 , HOTSPOT_JNI_CALLCHARMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1865 HOTSPOT_JNI_CALLCHARMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1866 DEFINE_CALLMETHODA(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1867 , HOTSPOT_JNI_CALLSHORTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1868 HOTSPOT_JNI_CALLSHORTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1869
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1870 DEFINE_CALLMETHODA(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1871 , HOTSPOT_JNI_CALLOBJECTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1872 HOTSPOT_JNI_CALLOBJECTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1873 DEFINE_CALLMETHODA(jint, Int, T_INT,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1874 HOTSPOT_JNI_CALLINTMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1875 HOTSPOT_JNI_CALLINTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1876 DEFINE_CALLMETHODA(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1877 , HOTSPOT_JNI_CALLLONGMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1878 HOTSPOT_JNI_CALLLONGMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1879 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1880 DEFINE_CALLMETHODA(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1881 , HOTSPOT_JNI_CALLFLOATMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1882 HOTSPOT_JNI_CALLFLOATMETHOD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1883 DEFINE_CALLMETHODA(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1884 , HOTSPOT_JNI_CALLDOUBLEMETHOD_ENTRY(env, obj, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1885 HOTSPOT_JNI_CALLDOUBLEMETHOD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1886
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1887 DT_VOID_RETURN_MARK_DECL(CallVoidMethod, HOTSPOT_JNI_CALLVOIDMETHOD_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1888 DT_VOID_RETURN_MARK_DECL(CallVoidMethodV, HOTSPOT_JNI_CALLVOIDMETHODV_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1889 DT_VOID_RETURN_MARK_DECL(CallVoidMethodA, HOTSPOT_JNI_CALLVOIDMETHODA_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1890
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1891 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1892
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 JNI_ENTRY(void, jni_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...))
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 JNIWrapper("CallVoidMethod");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1895 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 DTRACE_PROBE3(hotspot_jni, CallVoidMethod__entry, env, obj, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1897 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1898 HOTSPOT_JNI_CALLVOIDMETHOD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1899 env, obj, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1900 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 DT_VOID_RETURN_MARK(CallVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1902
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 va_start(args, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1906 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1910
a61af66fc99e Initial load
duke
parents:
diff changeset
1911
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 JNI_ENTRY(void, jni_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 JNIWrapper("CallVoidMethodV");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1914 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 DTRACE_PROBE3(hotspot_jni, CallVoidMethodV__entry, env, obj, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1916 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1917 HOTSPOT_JNI_CALLVOIDMETHODV_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1918 env, obj, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1919 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 DT_VOID_RETURN_MARK(CallVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
1921
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1923 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1926
a61af66fc99e Initial load
duke
parents:
diff changeset
1927
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 JNI_ENTRY(void, jni_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args))
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 JNIWrapper("CallVoidMethodA");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1930 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 DTRACE_PROBE3(hotspot_jni, CallVoidMethodA__entry, env, obj, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1932 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1933 HOTSPOT_JNI_CALLVOIDMETHODA_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1934 env, obj, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1935 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 DT_VOID_RETURN_MARK(CallVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
1937
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1939 JNI_ArgumentPusherArray ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1942
a61af66fc99e Initial load
duke
parents:
diff changeset
1943
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
1944 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 #define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodV, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodA, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 jni_CallNonvirtual##Result##Method(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 JNIWrapper("CallNonvitual" XSTR(Result) "Method"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##Method__entry, env, obj, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 ResultType ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##Method, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 va_list args; \
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 va_start(args, methodID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1963 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 va_end(args); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 jni_CallNonvirtual##Result##MethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 JNIWrapper("CallNonvitual" XSTR(Result) "#MethodV"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodV__entry, env, obj, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 ResultType ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodV, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1979 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 jni_CallNonvirtual##Result##MethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 JNIWrapper("CallNonvitual" XSTR(Result) "MethodA"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodA__entry, env, obj, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 ResultType ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodA, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 \
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
1994 JNI_ArgumentPusherArray ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1999
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 // the runtime type of subword integral basic types is integer
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 DEFINE_CALLNONVIRTUALMETHOD(jboolean, Boolean, T_BOOLEAN)
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 DEFINE_CALLNONVIRTUALMETHOD(jbyte, Byte, T_BYTE)
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 DEFINE_CALLNONVIRTUALMETHOD(jchar, Char, T_CHAR)
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 DEFINE_CALLNONVIRTUALMETHOD(jshort, Short, T_SHORT)
a61af66fc99e Initial load
duke
parents:
diff changeset
2005
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 DEFINE_CALLNONVIRTUALMETHOD(jobject, Object, T_OBJECT)
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 DEFINE_CALLNONVIRTUALMETHOD(jint, Int, T_INT)
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 DEFINE_CALLNONVIRTUALMETHOD(jlong, Long, T_LONG)
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 DEFINE_CALLNONVIRTUALMETHOD(jfloat, Float, T_FLOAT)
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 DEFINE_CALLNONVIRTUALMETHOD(jdouble, Double, T_DOUBLE)
a61af66fc99e Initial load
duke
parents:
diff changeset
2011
a61af66fc99e Initial load
duke
parents:
diff changeset
2012
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
2016
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2017 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2018
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2019 #define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2020 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2021 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2022 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2023 , ReturnProbe);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2024 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2025 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2026 jni_CallNonvirtual##Result##Method(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2027 JNIWrapper("CallNonvitual" XSTR(Result) "Method"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2028 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2029 EntryProbe;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2030 ResultType ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2031 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##Method, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2032 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2033 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2034 va_list args; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2035 va_start(args, methodID); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2036 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2037 JNI_ArgumentPusherVaArg ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2038 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2039 va_end(args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2040 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2041 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2042 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2043
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2044 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2045 DEFINE_CALLNONVIRTUALMETHOD(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2046 , HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2047 HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2048 DEFINE_CALLNONVIRTUALMETHOD(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2049 , HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2050 HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2051 DEFINE_CALLNONVIRTUALMETHOD(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2052 , HOTSPOT_JNI_CALLNONVIRTUALCHARMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2053 HOTSPOT_JNI_CALLNONVIRTUALCHARMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2054 DEFINE_CALLNONVIRTUALMETHOD(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2055 , HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2056 HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2057
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2058 DEFINE_CALLNONVIRTUALMETHOD(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2059 , HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2060 HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2061 DEFINE_CALLNONVIRTUALMETHOD(jint, Int, T_INT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2062 , HOTSPOT_JNI_CALLNONVIRTUALINTMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2063 HOTSPOT_JNI_CALLNONVIRTUALINTMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2064 DEFINE_CALLNONVIRTUALMETHOD(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2065 , HOTSPOT_JNI_CALLNONVIRTUALLONGMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2066 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2067 HOTSPOT_JNI_CALLNONVIRTUALLONGMETHOD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2068 DEFINE_CALLNONVIRTUALMETHOD(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2069 , HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2070 HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHOD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2071 DEFINE_CALLNONVIRTUALMETHOD(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2072 , HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHOD_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2073 HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHOD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2074
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2075 #define DEFINE_CALLNONVIRTUALMETHODV(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2076 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2077 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2078 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodV, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2079 , ReturnProbe);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2080 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2081 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2082 jni_CallNonvirtual##Result##MethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2083 JNIWrapper("CallNonvitual" XSTR(Result) "MethodV"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2084 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2085 EntryProbe;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2086 ResultType ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2087 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodV, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2088 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2089 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2090 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2091 JNI_ArgumentPusherVaArg ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2092 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2093 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2094 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2095 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2096
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2097 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2098 DEFINE_CALLNONVIRTUALMETHODV(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2099 , HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2100 HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHODV_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2101 DEFINE_CALLNONVIRTUALMETHODV(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2102 , HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2103 HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHODV_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2104 DEFINE_CALLNONVIRTUALMETHODV(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2105 , HOTSPOT_JNI_CALLNONVIRTUALCHARMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2106 HOTSPOT_JNI_CALLNONVIRTUALCHARMETHODV_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2107 DEFINE_CALLNONVIRTUALMETHODV(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2108 , HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2109 HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHODV_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2110
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2111 DEFINE_CALLNONVIRTUALMETHODV(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2112 , HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2113 HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHODV_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2114 DEFINE_CALLNONVIRTUALMETHODV(jint, Int, T_INT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2115 , HOTSPOT_JNI_CALLNONVIRTUALINTMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2116 HOTSPOT_JNI_CALLNONVIRTUALINTMETHODV_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2117 DEFINE_CALLNONVIRTUALMETHODV(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2118 , HOTSPOT_JNI_CALLNONVIRTUALLONGMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2119 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2120 HOTSPOT_JNI_CALLNONVIRTUALLONGMETHODV_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2121 DEFINE_CALLNONVIRTUALMETHODV(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2122 , HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2123 HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHODV_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2124 DEFINE_CALLNONVIRTUALMETHODV(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2125 , HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHODV_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2126 HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHODV_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2127
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2128 #define DEFINE_CALLNONVIRTUALMETHODA(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2129 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2130 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2131 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodA, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2132 , ReturnProbe);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2133 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2134 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2135 jni_CallNonvirtual##Result##MethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2136 JNIWrapper("CallNonvitual" XSTR(Result) "MethodA"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2137 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2138 EntryProbe;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2139 ResultType ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2140 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodA, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2141 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2142 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2143 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2144 JNI_ArgumentPusherArray ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2145 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2146 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2147 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2148 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2149
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2150 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2151 DEFINE_CALLNONVIRTUALMETHODA(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2152 , HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2153 HOTSPOT_JNI_CALLNONVIRTUALBOOLEANMETHODA_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2154 DEFINE_CALLNONVIRTUALMETHODA(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2155 , HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2156 HOTSPOT_JNI_CALLNONVIRTUALBYTEMETHODA_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2157 DEFINE_CALLNONVIRTUALMETHODA(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2158 , HOTSPOT_JNI_CALLNONVIRTUALCHARMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2159 HOTSPOT_JNI_CALLNONVIRTUALCHARMETHODA_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2160 DEFINE_CALLNONVIRTUALMETHODA(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2161 , HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2162 HOTSPOT_JNI_CALLNONVIRTUALSHORTMETHODA_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2163
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2164 DEFINE_CALLNONVIRTUALMETHODA(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2165 , HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2166 HOTSPOT_JNI_CALLNONVIRTUALOBJECTMETHODA_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2167 DEFINE_CALLNONVIRTUALMETHODA(jint, Int, T_INT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2168 , HOTSPOT_JNI_CALLNONVIRTUALINTMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2169 HOTSPOT_JNI_CALLNONVIRTUALINTMETHODA_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2170 DEFINE_CALLNONVIRTUALMETHODA(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2171 , HOTSPOT_JNI_CALLNONVIRTUALLONGMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2172 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2173 HOTSPOT_JNI_CALLNONVIRTUALLONGMETHODA_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2174 DEFINE_CALLNONVIRTUALMETHODA(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2175 , HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2176 HOTSPOT_JNI_CALLNONVIRTUALFLOATMETHODA_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2177 DEFINE_CALLNONVIRTUALMETHODA(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2178 , HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHODA_ENTRY(env, obj, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2179 HOTSPOT_JNI_CALLNONVIRTUALDOUBLEMETHODA_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2180
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2181 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethod
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2182 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHOD_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2183 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2184 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODV_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2185 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2186 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODA_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2187 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2188
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 JNI_ENTRY(void, jni_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...))
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 JNIWrapper("CallNonvirtualVoidMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
2191
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2192 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethod__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 env, obj, cls, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2195 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2196 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHOD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2197 env, obj, cls, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2198 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
2200
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 va_start(args, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2204 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2208
a61af66fc99e Initial load
duke
parents:
diff changeset
2209
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 JNI_ENTRY(void, jni_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args))
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 JNIWrapper("CallNonvirtualVoidMethodV");
a61af66fc99e Initial load
duke
parents:
diff changeset
2212
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2213 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodV__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 env, obj, cls, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2216 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2217 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODV_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2218 env, obj, cls, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2219 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
2221
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2223 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2226
a61af66fc99e Initial load
duke
parents:
diff changeset
2227
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 JNI_ENTRY(void, jni_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args))
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 JNIWrapper("CallNonvirtualVoidMethodA");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2230 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodA__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 env, obj, cls, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2233 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2234 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODA_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2235 env, obj, cls, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2236 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2239 JNI_ArgumentPusherArray ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2242
a61af66fc99e Initial load
duke
parents:
diff changeset
2243
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2244 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 #define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodV, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodA, ResultType);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 jni_CallStatic##Result##Method(JNIEnv *env, jclass cls, jmethodID methodID, ...)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 JNIWrapper("CallStatic" XSTR(Result) "Method"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##Method__entry, env, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 DT_RETURN_MARK_FOR(Result, CallStatic##Result##Method, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 va_list args; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 va_start(args, methodID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2263 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 va_end(args); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 jni_CallStatic##Result##MethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 JNIWrapper("CallStatic" XSTR(Result) "MethodV"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodV__entry, env, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodV, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2279 JNI_ArgumentPusherVaArg ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 JNI_END \
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 JNI_ENTRY(ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 jni_CallStatic##Result##MethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 JNIWrapper("CallStatic" XSTR(Result) "MethodA"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodA__entry, env, cls, methodID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 ResultType ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodA, ResultType, \
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 (const ResultType&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 JavaValue jvalue(Tag); \
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2294 JNI_ArgumentPusherArray ap(methodID, args); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 ret = jvalue.get_##ResultType(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2299
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 // the runtime type of subword integral basic types is integer
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 DEFINE_CALLSTATICMETHOD(jboolean, Boolean, T_BOOLEAN)
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 DEFINE_CALLSTATICMETHOD(jbyte, Byte, T_BYTE)
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 DEFINE_CALLSTATICMETHOD(jchar, Char, T_CHAR)
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 DEFINE_CALLSTATICMETHOD(jshort, Short, T_SHORT)
a61af66fc99e Initial load
duke
parents:
diff changeset
2305
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 DEFINE_CALLSTATICMETHOD(jobject, Object, T_OBJECT)
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 DEFINE_CALLSTATICMETHOD(jint, Int, T_INT)
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 DEFINE_CALLSTATICMETHOD(jlong, Long, T_LONG)
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 DEFINE_CALLSTATICMETHOD(jfloat, Float, T_FLOAT)
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 DEFINE_CALLSTATICMETHOD(jdouble, Double, T_DOUBLE)
a61af66fc99e Initial load
duke
parents:
diff changeset
2311
a61af66fc99e Initial load
duke
parents:
diff changeset
2312
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
2316
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2317 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2318
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2319 #define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2320 , EntryProbe, ResultProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2321 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2322 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2323 , ResultProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2324 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2325 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2326 jni_CallStatic##Result##Method(JNIEnv *env, jclass cls, jmethodID methodID, ...)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2327 JNIWrapper("CallStatic" XSTR(Result) "Method"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2328 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2329 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2330 ResultType ret = 0;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2331 DT_RETURN_MARK_FOR(Result, CallStatic##Result##Method, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2332 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2333 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2334 va_list args; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2335 va_start(args, methodID); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2336 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2337 JNI_ArgumentPusherVaArg ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2338 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2339 va_end(args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2340 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2341 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2342 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2343
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2344 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2345 DEFINE_CALLSTATICMETHOD(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2346 , HOTSPOT_JNI_CALLSTATICBOOLEANMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2347 HOTSPOT_JNI_CALLSTATICBOOLEANMETHOD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2348 DEFINE_CALLSTATICMETHOD(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2349 , HOTSPOT_JNI_CALLSTATICBYTEMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2350 HOTSPOT_JNI_CALLSTATICBYTEMETHOD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2351 DEFINE_CALLSTATICMETHOD(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2352 , HOTSPOT_JNI_CALLSTATICCHARMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2353 HOTSPOT_JNI_CALLSTATICCHARMETHOD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2354 DEFINE_CALLSTATICMETHOD(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2355 , HOTSPOT_JNI_CALLSTATICSHORTMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2356 HOTSPOT_JNI_CALLSTATICSHORTMETHOD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2357
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2358 DEFINE_CALLSTATICMETHOD(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2359 , HOTSPOT_JNI_CALLSTATICOBJECTMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2360 HOTSPOT_JNI_CALLSTATICOBJECTMETHOD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2361 DEFINE_CALLSTATICMETHOD(jint, Int, T_INT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2362 , HOTSPOT_JNI_CALLSTATICINTMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2363 HOTSPOT_JNI_CALLSTATICINTMETHOD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2364 DEFINE_CALLSTATICMETHOD(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2365 , HOTSPOT_JNI_CALLSTATICLONGMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2366 HOTSPOT_JNI_CALLSTATICLONGMETHOD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2367 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2368 DEFINE_CALLSTATICMETHOD(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2369 , HOTSPOT_JNI_CALLSTATICFLOATMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2370 HOTSPOT_JNI_CALLSTATICFLOATMETHOD_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2371 DEFINE_CALLSTATICMETHOD(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2372 , HOTSPOT_JNI_CALLSTATICDOUBLEMETHOD_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2373 HOTSPOT_JNI_CALLSTATICDOUBLEMETHOD_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2374
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2375 #define DEFINE_CALLSTATICMETHODV(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2376 , EntryProbe, ResultProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2377 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2378 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodV, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2379 , ResultProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2380 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2381 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2382 jni_CallStatic##Result##MethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2383 JNIWrapper("CallStatic" XSTR(Result) "MethodV"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2384 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2385 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2386 ResultType ret = 0;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2387 DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodV, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2388 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2389 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2390 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2391 JNI_ArgumentPusherVaArg ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2392 /* Make sure class is initialized before trying to invoke its method */ \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2393 KlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls))); \
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2394 k()->initialize(CHECK_0); \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2395 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2396 va_end(args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2397 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2398 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2399 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2400
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2401 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2402 DEFINE_CALLSTATICMETHODV(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2403 , HOTSPOT_JNI_CALLSTATICBOOLEANMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2404 HOTSPOT_JNI_CALLSTATICBOOLEANMETHODV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2405 DEFINE_CALLSTATICMETHODV(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2406 , HOTSPOT_JNI_CALLSTATICBYTEMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2407 HOTSPOT_JNI_CALLSTATICBYTEMETHODV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2408 DEFINE_CALLSTATICMETHODV(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2409 , HOTSPOT_JNI_CALLSTATICCHARMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2410 HOTSPOT_JNI_CALLSTATICCHARMETHODV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2411 DEFINE_CALLSTATICMETHODV(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2412 , HOTSPOT_JNI_CALLSTATICSHORTMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2413 HOTSPOT_JNI_CALLSTATICSHORTMETHODV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2414
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2415 DEFINE_CALLSTATICMETHODV(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2416 , HOTSPOT_JNI_CALLSTATICOBJECTMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2417 HOTSPOT_JNI_CALLSTATICOBJECTMETHODV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2418 DEFINE_CALLSTATICMETHODV(jint, Int, T_INT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2419 , HOTSPOT_JNI_CALLSTATICINTMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2420 HOTSPOT_JNI_CALLSTATICINTMETHODV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2421 DEFINE_CALLSTATICMETHODV(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2422 , HOTSPOT_JNI_CALLSTATICLONGMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2423 HOTSPOT_JNI_CALLSTATICLONGMETHODV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2424 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2425 DEFINE_CALLSTATICMETHODV(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2426 , HOTSPOT_JNI_CALLSTATICFLOATMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2427 HOTSPOT_JNI_CALLSTATICFLOATMETHODV_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2428 DEFINE_CALLSTATICMETHODV(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2429 , HOTSPOT_JNI_CALLSTATICDOUBLEMETHODV_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2430 HOTSPOT_JNI_CALLSTATICDOUBLEMETHODV_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2431
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2432 #define DEFINE_CALLSTATICMETHODA(ResultType, Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2433 , EntryProbe, ResultProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2434 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2435 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodA, ResultType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2436 , ResultProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2437 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2438 JNI_ENTRY(ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2439 jni_CallStatic##Result##MethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2440 JNIWrapper("CallStatic" XSTR(Result) "MethodA"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2441 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2442 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2443 ResultType ret = 0;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2444 DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodA, ResultType, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2445 (const ResultType&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2446 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2447 JavaValue jvalue(Tag); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2448 JNI_ArgumentPusherArray ap(methodID, args); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2449 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2450 ret = jvalue.get_##ResultType(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2451 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2452 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2453
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2454 // the runtime type of subword integral basic types is integer
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2455 DEFINE_CALLSTATICMETHODA(jboolean, Boolean, T_BOOLEAN
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2456 , HOTSPOT_JNI_CALLSTATICBOOLEANMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2457 HOTSPOT_JNI_CALLSTATICBOOLEANMETHODA_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2458 DEFINE_CALLSTATICMETHODA(jbyte, Byte, T_BYTE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2459 , HOTSPOT_JNI_CALLSTATICBYTEMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2460 HOTSPOT_JNI_CALLSTATICBYTEMETHODA_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2461 DEFINE_CALLSTATICMETHODA(jchar, Char, T_CHAR
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2462 , HOTSPOT_JNI_CALLSTATICCHARMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2463 HOTSPOT_JNI_CALLSTATICCHARMETHODA_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2464 DEFINE_CALLSTATICMETHODA(jshort, Short, T_SHORT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2465 , HOTSPOT_JNI_CALLSTATICSHORTMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2466 HOTSPOT_JNI_CALLSTATICSHORTMETHODA_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2467
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2468 DEFINE_CALLSTATICMETHODA(jobject, Object, T_OBJECT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2469 , HOTSPOT_JNI_CALLSTATICOBJECTMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2470 HOTSPOT_JNI_CALLSTATICOBJECTMETHODA_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2471 DEFINE_CALLSTATICMETHODA(jint, Int, T_INT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2472 , HOTSPOT_JNI_CALLSTATICINTMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2473 HOTSPOT_JNI_CALLSTATICINTMETHODA_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2474 DEFINE_CALLSTATICMETHODA(jlong, Long, T_LONG
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2475 , HOTSPOT_JNI_CALLSTATICLONGMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2476 HOTSPOT_JNI_CALLSTATICLONGMETHODA_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2477 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2478 DEFINE_CALLSTATICMETHODA(jfloat, Float, T_FLOAT
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2479 , HOTSPOT_JNI_CALLSTATICFLOATMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2480 HOTSPOT_JNI_CALLSTATICFLOATMETHODA_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2481 DEFINE_CALLSTATICMETHODA(jdouble, Double, T_DOUBLE
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2482 , HOTSPOT_JNI_CALLSTATICDOUBLEMETHODA_ENTRY(env, cls, (uintptr_t)methodID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2483 HOTSPOT_JNI_CALLSTATICDOUBLEMETHODA_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2484
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2485 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethod
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2486 , HOTSPOT_JNI_CALLSTATICVOIDMETHOD_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2487 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2488 , HOTSPOT_JNI_CALLSTATICVOIDMETHODV_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2489 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2490 , HOTSPOT_JNI_CALLSTATICVOIDMETHODA_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2491 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2492
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 JNI_ENTRY(void, jni_CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...))
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 JNIWrapper("CallStaticVoidMethod");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2495 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethod__entry, env, cls, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2497 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2498 HOTSPOT_JNI_CALLSTATICVOIDMETHOD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2499 env, cls, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2500 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 DT_VOID_RETURN_MARK(CallStaticVoidMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
2502
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 va_start(args, methodID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2506 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2510
a61af66fc99e Initial load
duke
parents:
diff changeset
2511
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 JNI_ENTRY(void, jni_CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args))
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 JNIWrapper("CallStaticVoidMethodV");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2514 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodV__entry, env, cls, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2516 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2517 HOTSPOT_JNI_CALLSTATICVOIDMETHODV_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2518 env, cls, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2519 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 DT_VOID_RETURN_MARK(CallStaticVoidMethodV);
a61af66fc99e Initial load
duke
parents:
diff changeset
2521
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2523 JNI_ArgumentPusherVaArg ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2526
a61af66fc99e Initial load
duke
parents:
diff changeset
2527
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 JNI_ENTRY(void, jni_CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args))
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 JNIWrapper("CallStaticVoidMethodA");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2530 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodA__entry, env, cls, methodID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2532 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2533 HOTSPOT_JNI_CALLSTATICVOIDMETHODA_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2534 env, cls, (uintptr_t) methodID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2535 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 DT_VOID_RETURN_MARK(CallStaticVoidMethodA);
a61af66fc99e Initial load
duke
parents:
diff changeset
2537
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 JavaValue jvalue(T_VOID);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2539 JNI_ArgumentPusherArray ap(methodID, args);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2542
a61af66fc99e Initial load
duke
parents:
diff changeset
2543
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 // Accessing Fields
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2547
a61af66fc99e Initial load
duke
parents:
diff changeset
2548
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2549 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 DT_RETURN_MARK_DECL(GetFieldID, jfieldID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2551 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2552 DT_RETURN_MARK_DECL(GetFieldID, jfieldID
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2553 , HOTSPOT_JNI_GETFIELDID_RETURN((uintptr_t)_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2554 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2555
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 JNI_ENTRY(jfieldID, jni_GetFieldID(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 const char *name, const char *sig))
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 JNIWrapper("GetFieldID");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2559 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 DTRACE_PROBE4(hotspot_jni, GetFieldID__entry, env, clazz, name, sig);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2561 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2562 HOTSPOT_JNI_GETFIELDID_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2563 env, clazz, (char *) name, (char *) sig);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2564 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 jfieldID ret = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 DT_RETURN_MARK(GetFieldID, jfieldID, (const jfieldID&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2567
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 // The class should have been loaded (we have an instance of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 // passed in) so the field and signature should already be in the symbol
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 // 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
2571 TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2572 TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2573 if (fieldname == NULL || signame == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 KlassHandle k(THREAD,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2577 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 // Make sure class is initialized before handing id's out to fields
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2579 k()->initialize(CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2580
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 fieldDescriptor fd;
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2582 if (!k()->oop_is_instance() ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2583 !InstanceKlass::cast(k())->find_field(fieldname, signame, false, &fd)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2586
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 // A jfieldID for a non-static field is simply the offset of the field within the instanceOop
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 // It may also have hash bits for k, if VerifyJNIFields is turned on.
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 ret = jfieldIDWorkaround::to_instance_jfieldID(k(), fd.offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2592
a61af66fc99e Initial load
duke
parents:
diff changeset
2593
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 JNI_ENTRY(jobject, jni_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID))
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 JNIWrapper("GetObjectField");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2596 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2598 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2599 HOTSPOT_JNI_GETOBJECTFIELD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2600 env, obj, (uintptr_t) fieldID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2601 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 oop o = JNIHandles::resolve_non_null(obj);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2603 Klass* k = o->klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 // Keep JVMTI addition small and only check enabled flag here.
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 // jni_GetField_probe() assumes that is okay to create handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 if (JvmtiExport::should_post_field_access()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7182
diff changeset
2611 #if INCLUDE_ALL_GCS
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2612 // 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
2613 // 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
2614 // referent with the SATB barrier.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2615 if (UseG1GC) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2616 bool needs_barrier = false;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2617
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2618 if (ret != NULL &&
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2619 offset == java_lang_ref_Reference::referent_offset &&
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2620 InstanceKlass::cast(k)->reference_type() != REF_NONE) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2621 assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2622 needs_barrier = true;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2623 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2624
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2625 if (needs_barrier) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2626 oop referent = JNIHandles::resolve(ret);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2627 G1SATBCardTableModRefBS::enqueue(referent);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2628 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2376
diff changeset
2629 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7182
diff changeset
2630 #endif // INCLUDE_ALL_GCS
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2631 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2633 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2634 HOTSPOT_JNI_GETOBJECTFIELD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2635 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2636 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2639
a61af66fc99e Initial load
duke
parents:
diff changeset
2640
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2641 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 #define DEFINE_GETFIELD(Return,Fieldname,Result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2646 JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 JNIWrapper("Get" XSTR(Result) "Field"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 DTRACE_PROBE3(hotspot_jni, Get##Result##Field__entry, env, obj, fieldID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 Return ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 oop o = JNIHandles::resolve_non_null(obj); \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2654 Klass* k = o->klass(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 /* Keep JVMTI addition small and only check enabled flag here. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2657 /* jni_GetField_probe_nh() assumes that is not okay to create handles */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 /* and creates a ResetNoHandleMark. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 if (JvmtiExport::should_post_field_access()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 o = JvmtiExport::jni_GetField_probe_nh(thread, obj, o, k, fieldID, false); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 ret = o->Fieldname##_field(offset); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 return ret; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2665
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 DEFINE_GETFIELD(jboolean, bool, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 DEFINE_GETFIELD(jbyte, byte, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 DEFINE_GETFIELD(jchar, char, Char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 DEFINE_GETFIELD(jshort, short, Short)
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 DEFINE_GETFIELD(jint, int, Int)
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 DEFINE_GETFIELD(jlong, long, Long)
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 DEFINE_GETFIELD(jfloat, float, Float)
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 DEFINE_GETFIELD(jdouble, double, Double)
a61af66fc99e Initial load
duke
parents:
diff changeset
2674
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2675 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2676
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2677 #define DEFINE_GETFIELD(Return,Fieldname,Result \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2678 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2679 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2680 DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2681 , ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2682 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2683 JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2684 JNIWrapper("Get" XSTR(Result) "Field"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2685 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2686 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2687 Return ret = 0;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2688 DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2689 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2690 oop o = JNIHandles::resolve_non_null(obj); \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2691 Klass* k = o->klass(); \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2692 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2693 /* Keep JVMTI addition small and only check enabled flag here. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2694 /* jni_GetField_probe_nh() assumes that is not okay to create handles */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2695 /* and creates a ResetNoHandleMark. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2696 if (JvmtiExport::should_post_field_access()) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2697 o = JvmtiExport::jni_GetField_probe_nh(thread, obj, o, k, fieldID, false); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2698 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2699 ret = o->Fieldname##_field(offset); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2700 return ret; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2701 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2702
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2703 DEFINE_GETFIELD(jboolean, bool, Boolean
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2704 , HOTSPOT_JNI_GETBOOLEANFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2705 HOTSPOT_JNI_GETBOOLEANFIELD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2706 DEFINE_GETFIELD(jbyte, byte, Byte
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2707 , HOTSPOT_JNI_GETBYTEFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2708 HOTSPOT_JNI_GETBYTEFIELD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2709 DEFINE_GETFIELD(jchar, char, Char
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2710 , HOTSPOT_JNI_GETCHARFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2711 HOTSPOT_JNI_GETCHARFIELD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2712 DEFINE_GETFIELD(jshort, short, Short
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2713 , HOTSPOT_JNI_GETSHORTFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2714 HOTSPOT_JNI_GETSHORTFIELD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2715 DEFINE_GETFIELD(jint, int, Int
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2716 , HOTSPOT_JNI_GETINTFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2717 HOTSPOT_JNI_GETINTFIELD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2718 DEFINE_GETFIELD(jlong, long, Long
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2719 , HOTSPOT_JNI_GETLONGFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2720 HOTSPOT_JNI_GETLONGFIELD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2721 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2722 DEFINE_GETFIELD(jfloat, float, Float
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2723 , HOTSPOT_JNI_GETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2724 HOTSPOT_JNI_GETFLOATFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2725 DEFINE_GETFIELD(jdouble, double, Double
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2726 , HOTSPOT_JNI_GETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2727 HOTSPOT_JNI_GETDOUBLEFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2728 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2729
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 address jni_GetBooleanField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 return (address)jni_GetBooleanField;
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 address jni_GetByteField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 return (address)jni_GetByteField;
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 address jni_GetCharField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 return (address)jni_GetCharField;
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 address jni_GetShortField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 return (address)jni_GetShortField;
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 address jni_GetIntField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 return (address)jni_GetIntField;
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 address jni_GetLongField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 return (address)jni_GetLongField;
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 address jni_GetFloatField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 return (address)jni_GetFloatField;
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2751 address jni_GetDoubleField_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 return (address)jni_GetDoubleField;
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2754
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 JNI_QUICK_ENTRY(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value))
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 JNIWrapper("SetObjectField");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2757 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 DTRACE_PROBE4(hotspot_jni, SetObjectField__entry, env, obj, fieldID, value);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2759 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2760 HOTSPOT_JNI_SETOBJECTFIELD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2761 env, obj, (uintptr_t) fieldID, value);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2762 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 oop o = JNIHandles::resolve_non_null(obj);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2764 Klass* k = o->klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 // Keep JVMTI addition small and only check enabled flag here.
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 // jni_SetField_probe_nh() assumes that is not okay to create handles
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 // and creates a ResetNoHandleMark.
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 if (JvmtiExport::should_post_field_modification()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 jvalue field_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 field_value.l = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, 'L', (jvalue *)&field_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 o->obj_field_put(offset, JNIHandles::resolve(value));
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2775 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 DTRACE_PROBE(hotspot_jni, SetObjectField__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2777 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2778 HOTSPOT_JNI_SETOBJECTFIELD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2779 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2780 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2782
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2783 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 JNIWrapper("Set" XSTR(Result) "Field"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2788 \
6837
75982791ddb6 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 6831
diff changeset
2789 FP_SELECT_##Result( \
75982791ddb6 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 6831
diff changeset
2790 DTRACE_PROBE4(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID, value), \
75982791ddb6 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 6831
diff changeset
2791 DTRACE_PROBE3(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID)); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2793 oop o = JNIHandles::resolve_non_null(obj); \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2794 Klass* k = o->klass(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 /* Keep JVMTI addition small and only check enabled flag here. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 /* jni_SetField_probe_nh() assumes that is not okay to create handles */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 /* and creates a ResetNoHandleMark. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 if (JvmtiExport::should_post_field_modification()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 jvalue field_value; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 field_value.unionType = value; \
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, SigType, (jvalue *)&field_value); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 o->Fieldname##_field_put(offset, value); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 DTRACE_PROBE(hotspot_jni, Set##Result##Field__return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2807
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 DEFINE_SETFIELD(jboolean, bool, Boolean, 'Z', z)
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 DEFINE_SETFIELD(jbyte, byte, Byte, 'B', b)
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 DEFINE_SETFIELD(jchar, char, Char, 'C', c)
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 DEFINE_SETFIELD(jshort, short, Short, 'S', s)
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 DEFINE_SETFIELD(jint, int, Int, 'I', i)
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 DEFINE_SETFIELD(jlong, long, Long, 'J', j)
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 DEFINE_SETFIELD(jfloat, float, Float, 'F', f)
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 DEFINE_SETFIELD(jdouble, double, Double, 'D', d)
a61af66fc99e Initial load
duke
parents:
diff changeset
2816
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2817 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2818
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2819 #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2820 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2821 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2822 JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2823 JNIWrapper("Set" XSTR(Result) "Field"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2824 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2825 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2826 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2827 oop o = JNIHandles::resolve_non_null(obj); \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2828 Klass* k = o->klass(); \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2829 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2830 /* Keep JVMTI addition small and only check enabled flag here. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2831 /* jni_SetField_probe_nh() assumes that is not okay to create handles */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2832 /* and creates a ResetNoHandleMark. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2833 if (JvmtiExport::should_post_field_modification()) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2834 jvalue field_value; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2835 field_value.unionType = value; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2836 o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, SigType, (jvalue *)&field_value); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2837 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2838 o->Fieldname##_field_put(offset, value); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2839 ReturnProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2840 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2841
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2842 DEFINE_SETFIELD(jboolean, bool, Boolean, 'Z', z
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2843 , HOTSPOT_JNI_SETBOOLEANFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2844 HOTSPOT_JNI_SETBOOLEANFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2845 DEFINE_SETFIELD(jbyte, byte, Byte, 'B', b
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2846 , HOTSPOT_JNI_SETBYTEFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2847 HOTSPOT_JNI_SETBYTEFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2848 DEFINE_SETFIELD(jchar, char, Char, 'C', c
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2849 , HOTSPOT_JNI_SETCHARFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2850 HOTSPOT_JNI_SETCHARFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2851 DEFINE_SETFIELD(jshort, short, Short, 'S', s
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2852 , HOTSPOT_JNI_SETSHORTFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2853 HOTSPOT_JNI_SETSHORTFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2854 DEFINE_SETFIELD(jint, int, Int, 'I', i
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2855 , HOTSPOT_JNI_SETINTFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2856 HOTSPOT_JNI_SETINTFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2857 DEFINE_SETFIELD(jlong, long, Long, 'J', j
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2858 , HOTSPOT_JNI_SETLONGFIELD_ENTRY(env, obj, (uintptr_t)fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2859 HOTSPOT_JNI_SETLONGFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2860 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2861 DEFINE_SETFIELD(jfloat, float, Float, 'F', f
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2862 , HOTSPOT_JNI_SETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2863 HOTSPOT_JNI_SETFLOATFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2864 DEFINE_SETFIELD(jdouble, double, Double, 'D', d
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2865 , HOTSPOT_JNI_SETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2866 HOTSPOT_JNI_SETDOUBLEFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2867 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2868
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2869 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 DT_RETURN_MARK_DECL(ToReflectedField, jobject);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2871 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2872 DT_RETURN_MARK_DECL(ToReflectedField, jobject
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2873 , HOTSPOT_JNI_TOREFLECTEDFIELD_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2874 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2875
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic))
a61af66fc99e Initial load
duke
parents:
diff changeset
2877 JNIWrapper("ToReflectedField");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2878 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 DTRACE_PROBE4(hotspot_jni, ToReflectedField__entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 env, cls, fieldID, isStatic);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2881 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2882 HOTSPOT_JNI_TOREFLECTEDFIELD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2883 env, cls, (uintptr_t) fieldID, isStatic);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2884 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 jobject ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 DT_RETURN_MARK(ToReflectedField, jobject, (const jobject&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2887
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
2889 bool found = false;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2890 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2891
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 assert(jfieldIDWorkaround::is_static_jfieldID(fieldID) == (isStatic != 0), "invalid fieldID");
a61af66fc99e Initial load
duke
parents:
diff changeset
2893
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 if (isStatic) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2895 // Static field. The fieldID a JNIid specifying the field holder and the offset within the Klass*.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 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
2898 found = id->find_local_field(&fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 // Non-static field. The fieldID is really the offset of the field within the instanceOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2902 found = InstanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 assert(found, "bad fieldID passed into jni_ToReflectedField");
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 oop reflected = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 ret = JNIHandles::make_local(env, reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2909
a61af66fc99e Initial load
duke
parents:
diff changeset
2910
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 // Accessing Static Fields
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 //
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2914 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2915 DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2916 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2917 DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2918 , HOTSPOT_JNI_GETSTATICFIELDID_RETURN((uintptr_t)_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2919 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2920
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 const char *name, const char *sig))
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 JNIWrapper("GetStaticFieldID");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2924 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 DTRACE_PROBE4(hotspot_jni, GetStaticFieldID__entry, env, clazz, name, sig);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2926 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2927 HOTSPOT_JNI_GETSTATICFIELDID_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2928 env, clazz, (char *) name, (char *) sig);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2929 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 jfieldID ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 DT_RETURN_MARK(GetStaticFieldID, jfieldID, (const jfieldID&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2932
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 // The class should have been loaded (we have an instance of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 // passed in) so the field and signature should already be in the symbol
a61af66fc99e Initial load
duke
parents:
diff changeset
2935 // 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
2936 TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2937 TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig));
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
2938 if (fieldname == NULL || signame == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 KlassHandle k(THREAD,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2942 java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 // Make sure class is initialized before handing id's out to static fields
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2944 k()->initialize(CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2945
a61af66fc99e Initial load
duke
parents:
diff changeset
2946 fieldDescriptor fd;
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
2947 if (!k()->oop_is_instance() ||
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2948 !InstanceKlass::cast(k())->find_field(fieldname, signame, true, &fd)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2949 THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2951
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2952 // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the Klass*
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6856
diff changeset
2953 JNIid* id = fd.field_holder()->jni_id_for(fd.offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 debug_only(id->set_is_static_field_id();)
a61af66fc99e Initial load
duke
parents:
diff changeset
2955
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
2956 debug_only(id->verify(fd.field_holder()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2957
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 ret = jfieldIDWorkaround::to_static_jfieldID(id);
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2960 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2961
a61af66fc99e Initial load
duke
parents:
diff changeset
2962
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID))
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 JNIWrapper("GetStaticObjectField");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2965 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 DTRACE_PROBE3(hotspot_jni, GetStaticObjectField__entry, env, clazz, fieldID);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2967 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2968 HOTSPOT_JNI_GETSTATICOBJECTFIELD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2969 env, clazz, (uintptr_t) fieldID);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2970 #endif /* USDT2 */
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
2971 #if INCLUDE_JNI_CHECK
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2972 DEBUG_ONLY(Klass* param_k = jniCheck::validate_class(thread, clazz);)
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
2973 #endif // INCLUDE_JNI_CHECK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2974 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2975 assert(id->is_static_field_id(), "invalid static field id");
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 // Keep JVMTI addition small and only check enabled flag here.
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 // jni_GetField_probe() assumes that is okay to create handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
2978 if (JvmtiExport::should_post_field_access()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2979 JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 }
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
2981 jobject ret = JNIHandles::make_local(id->holder()->java_mirror()->obj_field(id->offset()));
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2982 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2983 DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2984 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2985 HOTSPOT_JNI_GETSTATICOBJECTFIELD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2986 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2987 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2990
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
2991 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 \
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 JNIWrapper("GetStatic" XSTR(Result) "Field"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 DTRACE_PROBE3(hotspot_jni, GetStatic##Result##Field__entry, env, clazz, fieldID);\
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 Return ret = 0;\
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 (const Return&)ret);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 assert(id->is_static_field_id(), "invalid static field id"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 /* Keep JVMTI addition small and only check enabled flag here. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 /* jni_GetField_probe() assumes that is okay to create handles. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 if (JvmtiExport::should_post_field_access()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 } \
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
3009 ret = id->holder()->java_mirror()-> Fieldname##_field (id->offset()); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3012
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 DEFINE_GETSTATICFIELD(jboolean, bool, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 DEFINE_GETSTATICFIELD(jbyte, byte, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 DEFINE_GETSTATICFIELD(jchar, char, Char)
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 DEFINE_GETSTATICFIELD(jshort, short, Short)
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 DEFINE_GETSTATICFIELD(jint, int, Int)
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 DEFINE_GETSTATICFIELD(jlong, long, Long)
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 DEFINE_GETSTATICFIELD(jfloat, float, Float)
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 DEFINE_GETSTATICFIELD(jdouble, double, Double)
a61af66fc99e Initial load
duke
parents:
diff changeset
3021
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3022 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3023
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3024 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3025 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3026 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3027 DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3028 , ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3029 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3030 JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3031 JNIWrapper("GetStatic" XSTR(Result) "Field"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3032 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3033 Return ret = 0;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3034 DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3035 (const Return&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3036 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3037 assert(id->is_static_field_id(), "invalid static field id"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3038 /* Keep JVMTI addition small and only check enabled flag here. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3039 /* jni_GetField_probe() assumes that is okay to create handles. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3040 if (JvmtiExport::should_post_field_access()) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3041 JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3042 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3043 ret = id->holder()->java_mirror()-> Fieldname##_field (id->offset()); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3044 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3045 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3046
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3047 DEFINE_GETSTATICFIELD(jboolean, bool, Boolean
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3048 , HOTSPOT_JNI_GETSTATICBOOLEANFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICBOOLEANFIELD_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3049 DEFINE_GETSTATICFIELD(jbyte, byte, Byte
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3050 , HOTSPOT_JNI_GETSTATICBYTEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICBYTEFIELD_RETURN(_ret_ref) )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3051 DEFINE_GETSTATICFIELD(jchar, char, Char
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3052 , HOTSPOT_JNI_GETSTATICCHARFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICCHARFIELD_RETURN(_ret_ref) )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3053 DEFINE_GETSTATICFIELD(jshort, short, Short
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3054 , HOTSPOT_JNI_GETSTATICSHORTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICSHORTFIELD_RETURN(_ret_ref) )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3055 DEFINE_GETSTATICFIELD(jint, int, Int
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3056 , HOTSPOT_JNI_GETSTATICINTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICINTFIELD_RETURN(_ret_ref) )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3057 DEFINE_GETSTATICFIELD(jlong, long, Long
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3058 , HOTSPOT_JNI_GETSTATICLONGFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICLONGFIELD_RETURN(_ret_ref) )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3059 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3060 DEFINE_GETSTATICFIELD(jfloat, float, Float
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3061 , HOTSPOT_JNI_GETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICFLOATFIELD_RETURN() )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3062 DEFINE_GETSTATICFIELD(jdouble, double, Double
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3063 , HOTSPOT_JNI_GETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICDOUBLEFIELD_RETURN() )
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3064 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3065
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value))
a61af66fc99e Initial load
duke
parents:
diff changeset
3067 JNIWrapper("SetStaticObjectField");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3068 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 DTRACE_PROBE4(hotspot_jni, SetStaticObjectField__entry, env, clazz, fieldID, value);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3070 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3071 HOTSPOT_JNI_SETSTATICOBJECTFIELD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3072 env, clazz, (uintptr_t) fieldID, value);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3073 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 assert(id->is_static_field_id(), "invalid static field id");
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 // Keep JVMTI addition small and only check enabled flag here.
a61af66fc99e Initial load
duke
parents:
diff changeset
3077 // jni_SetField_probe() assumes that is okay to create handles.
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 if (JvmtiExport::should_post_field_modification()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 jvalue field_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 field_value.l = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3081 JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 }
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
3083 id->holder()->java_mirror()->obj_field_put(id->offset(), JNIHandles::resolve(value));
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3084 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3086 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3087 HOTSPOT_JNI_SETSTATICOBJECTFIELD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3088 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3089 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3091
a61af66fc99e Initial load
duke
parents:
diff changeset
3092
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3093 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 \
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3097 JNIWrapper("SetStatic" XSTR(Result) "Field"); \
6837
75982791ddb6 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 6831
diff changeset
3098 FP_SELECT_##Result( \
75982791ddb6 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 6831
diff changeset
3099 DTRACE_PROBE4(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID, value), \
75982791ddb6 7170638: Use DTRACE_PROBE[N] in JNI Set and SetStatic Field.
coleenp
parents: 6831
diff changeset
3100 DTRACE_PROBE3(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID)); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3101 \
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 assert(id->is_static_field_id(), "invalid static field id"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3104 /* Keep JVMTI addition small and only check enabled flag here. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
3105 /* jni_SetField_probe() assumes that is okay to create handles. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
3106 if (JvmtiExport::should_post_field_modification()) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3107 jvalue field_value; \
a61af66fc99e Initial load
duke
parents:
diff changeset
3108 field_value.unionType = value; \
a61af66fc99e Initial load
duke
parents:
diff changeset
3109 JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3110 } \
2376
c7f3d0b4570f 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 2177
diff changeset
3111 id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3113 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3114
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 DEFINE_SETSTATICFIELD(jboolean, bool, Boolean, 'Z', z)
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 DEFINE_SETSTATICFIELD(jbyte, byte, Byte, 'B', b)
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 DEFINE_SETSTATICFIELD(jchar, char, Char, 'C', c)
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 DEFINE_SETSTATICFIELD(jshort, short, Short, 'S', s)
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 DEFINE_SETSTATICFIELD(jint, int, Int, 'I', i)
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 DEFINE_SETSTATICFIELD(jlong, long, Long, 'J', j)
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 DEFINE_SETSTATICFIELD(jfloat, float, Float, 'F', f)
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 DEFINE_SETSTATICFIELD(jdouble, double, Double, 'D', d)
a61af66fc99e Initial load
duke
parents:
diff changeset
3123
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3124 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3125
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3126 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3127 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3128 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3129 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3130 JNIWrapper("SetStatic" XSTR(Result) "Field"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3131 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3132 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3133 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3134 assert(id->is_static_field_id(), "invalid static field id"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3135 /* Keep JVMTI addition small and only check enabled flag here. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3136 /* jni_SetField_probe() assumes that is okay to create handles. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3137 if (JvmtiExport::should_post_field_modification()) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3138 jvalue field_value; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3139 field_value.unionType = value; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3140 JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3141 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3142 id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3143 ReturnProbe;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3144 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3145
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3146 DEFINE_SETSTATICFIELD(jboolean, bool, Boolean, 'Z', z
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3147 , HOTSPOT_JNI_SETBOOLEANFIELD_ENTRY(env, clazz, (uintptr_t)fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3148 HOTSPOT_JNI_SETBOOLEANFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3149 DEFINE_SETSTATICFIELD(jbyte, byte, Byte, 'B', b
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3150 , HOTSPOT_JNI_SETSTATICBYTEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3151 HOTSPOT_JNI_SETSTATICBYTEFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3152 DEFINE_SETSTATICFIELD(jchar, char, Char, 'C', c
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3153 , HOTSPOT_JNI_SETSTATICCHARFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3154 HOTSPOT_JNI_SETSTATICCHARFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3155 DEFINE_SETSTATICFIELD(jshort, short, Short, 'S', s
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3156 , HOTSPOT_JNI_SETSTATICSHORTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3157 HOTSPOT_JNI_SETSTATICSHORTFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3158 DEFINE_SETSTATICFIELD(jint, int, Int, 'I', i
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3159 , HOTSPOT_JNI_SETSTATICINTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3160 HOTSPOT_JNI_SETSTATICINTFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3161 DEFINE_SETSTATICFIELD(jlong, long, Long, 'J', j
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3162 , HOTSPOT_JNI_SETSTATICLONGFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3163 HOTSPOT_JNI_SETSTATICLONGFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3164 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3165 DEFINE_SETSTATICFIELD(jfloat, float, Float, 'F', f
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3166 , HOTSPOT_JNI_SETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3167 HOTSPOT_JNI_SETSTATICFLOATFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3168 DEFINE_SETSTATICFIELD(jdouble, double, Double, 'D', d
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3169 , HOTSPOT_JNI_SETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3170 HOTSPOT_JNI_SETSTATICDOUBLEFIELD_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3171 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3172
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 // String Operations
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3176
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 // Unicode Interface
a61af66fc99e Initial load
duke
parents:
diff changeset
3178
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3179 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3180 DT_RETURN_MARK_DECL(NewString, jstring);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3181 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3182 DT_RETURN_MARK_DECL(NewString, jstring
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3183 , HOTSPOT_JNI_NEWSTRING_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3184 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3185
a61af66fc99e Initial load
duke
parents:
diff changeset
3186 JNI_ENTRY(jstring, jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3187 JNIWrapper("NewString");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3188 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 DTRACE_PROBE3(hotspot_jni, NewString__entry, env, unicodeChars, len);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3190 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3191 HOTSPOT_JNI_NEWSTRING_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3192 env, (uint16_t *) unicodeChars, len);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3193 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 jstring ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 DT_RETURN_MARK(NewString, jstring, (const jstring&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 oop string=java_lang_String::create_oop_from_unicode((jchar*) unicodeChars, len, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3197 ret = (jstring) JNIHandles::make_local(env, string);
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3200
a61af66fc99e Initial load
duke
parents:
diff changeset
3201
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string))
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 JNIWrapper("GetStringLength");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3204 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 DTRACE_PROBE2(hotspot_jni, GetStringLength__entry, env, string);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3206 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3207 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3208 env, string);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3209 #endif /* USDT2 */
12819
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3210 jsize ret = 0;
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3211 oop s = JNIHandles::resolve_non_null(string);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3212 if (java_lang_String::value(s) != NULL) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3213 ret = java_lang_String::length(s);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3214 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3215 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 DTRACE_PROBE1(hotspot_jni, GetStringLength__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3217 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3218 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3219 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3220 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3222 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3223
a61af66fc99e Initial load
duke
parents:
diff changeset
3224
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 JNIEnv *env, jstring string, jboolean *isCopy))
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 JNIWrapper("GetStringChars");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3228 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 DTRACE_PROBE3(hotspot_jni, GetStringChars__entry, env, string, isCopy);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3230 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3231 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3232 env, string, (uintptr_t *) isCopy);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3233 #endif /* USDT2 */
12819
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3234 jchar* buf = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 oop s = JNIHandles::resolve_non_null(string);
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 typeArrayOop s_value = java_lang_String::value(s);
12819
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3237 if (s_value != NULL) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3238 int s_len = java_lang_String::length(s);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3239 int s_offset = java_lang_String::offset(s);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3240 buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3241 /* JNI Specification states return NULL on OOM */
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3242 if (buf != NULL) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3243 if (s_len > 0) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3244 memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3245 }
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3246 buf[s_len] = 0;
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3247 //%note jni_5
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3248 if (isCopy != NULL) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3249 *isCopy = JNI_TRUE;
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3250 }
12109
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3251 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3253 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3254 DTRACE_PROBE1(hotspot_jni, GetStringChars__return, buf);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3255 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3256 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3257 buf);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3258 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 return buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
3260 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3261
a61af66fc99e Initial load
duke
parents:
diff changeset
3262
a61af66fc99e Initial load
duke
parents:
diff changeset
3263 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 JNIWrapper("ReleaseStringChars");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3265 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 DTRACE_PROBE3(hotspot_jni, ReleaseStringChars__entry, env, str, chars);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3267 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3268 HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3269 env, str, (uint16_t *) chars);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3270 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 //%note jni_6
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 if (chars != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 // Since String objects are supposed to be immutable, don't copy any
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 // new data back. A bad user will have to go after the char array.
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 FreeHeap((void*) chars);
a61af66fc99e Initial load
duke
parents:
diff changeset
3276 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3277 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 DTRACE_PROBE(hotspot_jni, ReleaseStringChars__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3279 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3280 HOTSPOT_JNI_RELEASESTRINGCHARS_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3281 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3282 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3284
a61af66fc99e Initial load
duke
parents:
diff changeset
3285
a61af66fc99e Initial load
duke
parents:
diff changeset
3286 // UTF Interface
a61af66fc99e Initial load
duke
parents:
diff changeset
3287
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3288 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3289 DT_RETURN_MARK_DECL(NewStringUTF, jstring);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3290 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3291 DT_RETURN_MARK_DECL(NewStringUTF, jstring
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3292 , HOTSPOT_JNI_NEWSTRINGUTF_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3293 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3294
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 JNI_ENTRY(jstring, jni_NewStringUTF(JNIEnv *env, const char *bytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 JNIWrapper("NewStringUTF");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3297 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 DTRACE_PROBE2(hotspot_jni, NewStringUTF__entry, env, bytes);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3299 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3300 HOTSPOT_JNI_NEWSTRINGUTF_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3301 env, (char *) bytes);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3302 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3303 jstring ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 DT_RETURN_MARK(NewStringUTF, jstring, (const jstring&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3305
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 oop result = java_lang_String::create_oop_from_str((char*) bytes, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3307 ret = (jstring) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3308 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3309 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3310
a61af66fc99e Initial load
duke
parents:
diff changeset
3311
a61af66fc99e Initial load
duke
parents:
diff changeset
3312 JNI_ENTRY(jsize, jni_GetStringUTFLength(JNIEnv *env, jstring string))
a61af66fc99e Initial load
duke
parents:
diff changeset
3313 JNIWrapper("GetStringUTFLength");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3314 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3315 DTRACE_PROBE2(hotspot_jni, GetStringUTFLength__entry, env, string);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3316 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3317 HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3318 env, string);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3319 #endif /* USDT2 */
12819
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3320 jsize ret = 0;
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3321 oop java_string = JNIHandles::resolve_non_null(string);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3322 if (java_lang_String::value(java_string) != NULL) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3323 ret = java_lang_String::utf8_length(java_string);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3324 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3325 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 DTRACE_PROBE1(hotspot_jni, GetStringUTFLength__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3327 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3328 HOTSPOT_JNI_GETSTRINGUTFLENGTH_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3329 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3330 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3332 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3333
a61af66fc99e Initial load
duke
parents:
diff changeset
3334
a61af66fc99e Initial load
duke
parents:
diff changeset
3335 JNI_ENTRY(const char*, jni_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy))
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 JNIWrapper("GetStringUTFChars");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3337 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3338 DTRACE_PROBE3(hotspot_jni, GetStringUTFChars__entry, env, string, isCopy);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3339 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3340 HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3341 env, string, (uintptr_t *) isCopy);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3342 #endif /* USDT2 */
12819
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3343 char* result = NULL;
1989
017cd8bce8a8 6539281: -Xcheck:jni should validate char* argument to ReleaseStringUTFChars
sla
parents: 1980
diff changeset
3344 oop java_string = JNIHandles::resolve_non_null(string);
12819
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3345 if (java_lang_String::value(java_string) != NULL) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3346 size_t length = java_lang_String::utf8_length(java_string);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3347 /* JNI Specification states return NULL on OOM */
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3348 result = AllocateHeap(length + 1, mtInternal, 0, AllocFailStrategy::RETURN_NULL);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3349 if (result != NULL) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3350 java_lang_String::as_utf8_string(java_string, result, (int) length + 1);
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3351 if (isCopy != NULL) {
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3352 *isCopy = JNI_TRUE;
f9be370a7d54 8025922: JNI access to Strings need to check if the value field is non-null
sla
parents: 12306
diff changeset
3353 }
12109
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3354 }
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3355 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3356 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 DTRACE_PROBE1(hotspot_jni, GetStringUTFChars__return, result);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3358 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3359 HOTSPOT_JNI_GETSTRINGUTFCHARS_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3360 result);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3361 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3364
a61af66fc99e Initial load
duke
parents:
diff changeset
3365
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 JNI_LEAF(void, jni_ReleaseStringUTFChars(JNIEnv *env, jstring str, const char *chars))
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 JNIWrapper("ReleaseStringUTFChars");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3368 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 DTRACE_PROBE3(hotspot_jni, ReleaseStringUTFChars__entry, env, str, chars);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3370 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3371 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3372 env, str, (char *) chars);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3373 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 if (chars != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 FreeHeap((char*) chars);
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3377 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 DTRACE_PROBE(hotspot_jni, ReleaseStringUTFChars__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3379 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3380 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3381 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3382 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3384
a61af66fc99e Initial load
duke
parents:
diff changeset
3385
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array))
a61af66fc99e Initial load
duke
parents:
diff changeset
3387 JNIWrapper("GetArrayLength");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3388 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 DTRACE_PROBE2(hotspot_jni, GetArrayLength__entry, env, array);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3390 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3391 HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3392 env, array);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3393 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
a61af66fc99e Initial load
duke
parents:
diff changeset
3395 assert(a->is_array(), "must be array");
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 jsize ret = a->length();
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3397 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3398 DTRACE_PROBE1(hotspot_jni, GetArrayLength__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3399 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3400 HOTSPOT_JNI_GETARRAYLENGTH_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3401 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3402 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3404 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3405
a61af66fc99e Initial load
duke
parents:
diff changeset
3406
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 // Object Array Operations
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3410
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3411 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3413 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3414 DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3415 , HOTSPOT_JNI_NEWOBJECTARRAY_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3416 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3417
a61af66fc99e Initial load
duke
parents:
diff changeset
3418 JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement))
a61af66fc99e Initial load
duke
parents:
diff changeset
3419 JNIWrapper("NewObjectArray");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3420 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 DTRACE_PROBE4(hotspot_jni, NewObjectArray__entry, env, length, elementClass, initialElement);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3422 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3423 HOTSPOT_JNI_NEWOBJECTARRAY_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3424 env, length, elementClass, initialElement);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3425 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3426 jobjectArray ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
3428 KlassHandle ek(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass)));
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
3429 Klass* ako = ek()->array_klass(CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 KlassHandle ak = KlassHandle(THREAD, ako);
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3431 ObjArrayKlass::cast(ak())->initialize(CHECK_NULL);
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3432 objArrayOop result = ObjArrayKlass::cast(ak())->allocate(length, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 oop initial_value = JNIHandles::resolve(initialElement);
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 if (initial_value != NULL) { // array already initialized with NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 result->obj_at_put(index, initial_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3437 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 ret = (jobjectArray) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3442
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3443 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3445 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3446 DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3447 , HOTSPOT_JNI_GETOBJECTARRAYELEMENT_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3448 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3449
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index))
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 JNIWrapper("GetObjectArrayElement");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3452 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3453 DTRACE_PROBE3(hotspot_jni, GetObjectArrayElement__entry, env, array, index);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3454 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3455 HOTSPOT_JNI_GETOBJECTARRAYELEMENT_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3456 env, array, index);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3457 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 jobject ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3460 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 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
3462 ret = JNIHandles::make_local(env, a->obj_at(index));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 char buf[jintAsStringSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 sprintf(buf, "%d", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 THROW_MSG_0(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3470
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3471 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3473 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3474 DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3475 , HOTSPOT_JNI_SETOBJECTARRAYELEMENT_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3476 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3477
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value))
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 JNIWrapper("SetObjectArrayElement");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3480 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 DTRACE_PROBE4(hotspot_jni, SetObjectArrayElement__entry, env, array, index, value);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3482 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3483 HOTSPOT_JNI_SETOBJECTARRAYELEMENT_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3484 env, array, index, value);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3485 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3486 DT_VOID_RETURN_MARK(SetObjectArrayElement);
a61af66fc99e Initial load
duke
parents:
diff changeset
3487
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 oop v = JNIHandles::resolve(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 if (a->is_within_bounds(index)) {
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3491 if (v == NULL || v->is_a(ObjArrayKlass::cast(a->klass())->element_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 a->obj_at_put(index, v);
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 THROW(vmSymbols::java_lang_ArrayStoreException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 char buf[jintAsStringSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 sprintf(buf, "%d", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 THROW_MSG(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3502
a61af66fc99e Initial load
duke
parents:
diff changeset
3503
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3504 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3505 #define DEFINE_NEWSCALARARRAY(Return,Allocator,Result) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3507 DT_RETURN_MARK_DECL(New##Result##Array, Return); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3508 \
a61af66fc99e Initial load
duke
parents:
diff changeset
3509 JNI_ENTRY(Return, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3510 jni_New##Result##Array(JNIEnv *env, jsize len)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3511 JNIWrapper("New" XSTR(Result) "Array"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 DTRACE_PROBE2(hotspot_jni, New##Result##Array__entry, env, len);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 Return ret = NULL;\
1034
08780c8a9f04 6893483: DTrace probe return values for a couple JNI methods are wrong
kamg
parents: 973
diff changeset
3514 DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 \
a61af66fc99e Initial load
duke
parents:
diff changeset
3516 oop obj= oopFactory::Allocator(len, CHECK_0); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3517 ret = (Return) JNIHandles::make_local(env, obj); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3518 return ret;\
a61af66fc99e Initial load
duke
parents:
diff changeset
3519 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3520
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 DEFINE_NEWSCALARARRAY(jbooleanArray, new_boolArray, Boolean)
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 DEFINE_NEWSCALARARRAY(jbyteArray, new_byteArray, Byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 DEFINE_NEWSCALARARRAY(jshortArray, new_shortArray, Short)
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 DEFINE_NEWSCALARARRAY(jcharArray, new_charArray, Char)
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 DEFINE_NEWSCALARARRAY(jintArray, new_intArray, Int)
a61af66fc99e Initial load
duke
parents:
diff changeset
3526 DEFINE_NEWSCALARARRAY(jlongArray, new_longArray, Long)
a61af66fc99e Initial load
duke
parents:
diff changeset
3527 DEFINE_NEWSCALARARRAY(jfloatArray, new_singleArray, Float)
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 DEFINE_NEWSCALARARRAY(jdoubleArray, new_doubleArray, Double)
a61af66fc99e Initial load
duke
parents:
diff changeset
3529
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3530 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3531
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3532 #define DEFINE_NEWSCALARARRAY(Return,Allocator,Result \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3533 ,EntryProbe,ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3534 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3535 DT_RETURN_MARK_DECL(New##Result##Array, Return \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3536 , ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3537 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3538 JNI_ENTRY(Return, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3539 jni_New##Result##Array(JNIEnv *env, jsize len)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3540 JNIWrapper("New" XSTR(Result) "Array"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3541 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3542 Return ret = NULL;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3543 DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3544 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3545 oop obj= oopFactory::Allocator(len, CHECK_0); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3546 ret = (Return) JNIHandles::make_local(env, obj); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3547 return ret;\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3548 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3549
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3550 DEFINE_NEWSCALARARRAY(jbooleanArray, new_boolArray, Boolean,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3551 HOTSPOT_JNI_NEWBOOLEANARRAY_ENTRY(env, len),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3552 HOTSPOT_JNI_NEWBOOLEANARRAY_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3553 DEFINE_NEWSCALARARRAY(jbyteArray, new_byteArray, Byte,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3554 HOTSPOT_JNI_NEWBYTEARRAY_ENTRY(env, len),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3555 HOTSPOT_JNI_NEWBYTEARRAY_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3556 DEFINE_NEWSCALARARRAY(jshortArray, new_shortArray, Short,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3557 HOTSPOT_JNI_NEWSHORTARRAY_ENTRY(env, len),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3558 HOTSPOT_JNI_NEWSHORTARRAY_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3559 DEFINE_NEWSCALARARRAY(jcharArray, new_charArray, Char,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3560 HOTSPOT_JNI_NEWCHARARRAY_ENTRY(env, len),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3561 HOTSPOT_JNI_NEWCHARARRAY_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3562 DEFINE_NEWSCALARARRAY(jintArray, new_intArray, Int,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3563 HOTSPOT_JNI_NEWINTARRAY_ENTRY(env, len),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3564 HOTSPOT_JNI_NEWINTARRAY_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3565 DEFINE_NEWSCALARARRAY(jlongArray, new_longArray, Long,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3566 HOTSPOT_JNI_NEWLONGARRAY_ENTRY(env, len),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3567 HOTSPOT_JNI_NEWLONGARRAY_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3568 DEFINE_NEWSCALARARRAY(jfloatArray, new_singleArray, Float,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3569 HOTSPOT_JNI_NEWFLOATARRAY_ENTRY(env, len),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3570 HOTSPOT_JNI_NEWFLOATARRAY_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3571 DEFINE_NEWSCALARARRAY(jdoubleArray, new_doubleArray, Double,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3572 HOTSPOT_JNI_NEWDOUBLEARRAY_ENTRY(env, len),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3573 HOTSPOT_JNI_NEWDOUBLEARRAY_RETURN(_ret_ref))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3574 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3575
a61af66fc99e Initial load
duke
parents:
diff changeset
3576 // Return an address which will fault if the caller writes to it.
a61af66fc99e Initial load
duke
parents:
diff changeset
3577
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 static char* get_bad_address() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 static char* bad_address = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3580 if (bad_address == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 size_t size = os::vm_allocation_granularity();
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 bad_address = os::reserve_memory(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 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
3584 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
3585 /*is_committed*/false);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 20337
diff changeset
3586 MemTracker::record_virtual_memory_type((void*)bad_address, mtInternal);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 return bad_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3591
a61af66fc99e Initial load
duke
parents:
diff changeset
3592
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3593 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3594 #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 \
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 JNI_QUICK_ENTRY(ElementType*, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3598 JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 DTRACE_PROBE3(hotspot_jni, Get##Result##ArrayElements__entry, env, array, isCopy);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 /* allocate an chunk of memory in c land */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 ElementType* result; \
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 int len = a->length(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 if (len == 0) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 /* Empty array: legal but useless, can't return NULL. \
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 * Return a pointer to something useless. \
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 * Avoid asserts in typeArrayOop. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 result = (ElementType*)get_bad_address(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 } else { \
12109
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3610 /* JNI Specification states return NULL on OOM */ \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3611 result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3612 if (result != NULL) { \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3613 /* copy the array to the c chunk */ \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3614 memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3615 if (isCopy) { \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3616 *isCopy = JNI_TRUE; \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3617 } \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3618 } \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 DTRACE_PROBE1(hotspot_jni, Get##Result##ArrayElements__return, result);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 return result; \
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3623
a61af66fc99e Initial load
duke
parents:
diff changeset
3624 DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 DEFINE_GETSCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
3626 DEFINE_GETSCALARARRAYELEMENTS(T_SHORT, jshort, Short, short)
a61af66fc99e Initial load
duke
parents:
diff changeset
3627 DEFINE_GETSCALARARRAYELEMENTS(T_CHAR, jchar, Char, char)
a61af66fc99e Initial load
duke
parents:
diff changeset
3628 DEFINE_GETSCALARARRAYELEMENTS(T_INT, jint, Int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 DEFINE_GETSCALARARRAYELEMENTS(T_LONG, jlong, Long, long)
a61af66fc99e Initial load
duke
parents:
diff changeset
3630 DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float)
a61af66fc99e Initial load
duke
parents:
diff changeset
3631 DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double)
a61af66fc99e Initial load
duke
parents:
diff changeset
3632
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3633 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3634
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3635 #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3636 , EntryProbe, ReturnProbe) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3637 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3638 JNI_QUICK_ENTRY(ElementType*, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3639 jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3640 JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3641 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3642 /* allocate an chunk of memory in c land */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3643 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3644 ElementType* result; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3645 int len = a->length(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3646 if (len == 0) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3647 /* Empty array: legal but useless, can't return NULL. \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3648 * Return a pointer to something useless. \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3649 * Avoid asserts in typeArrayOop. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3650 result = (ElementType*)get_bad_address(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3651 } else { \
12109
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3652 /* JNI Specification states return NULL on OOM */ \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3653 result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3654 if (result != NULL) { \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3655 /* copy the array to the c chunk */ \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3656 memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3657 if (isCopy) { \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3658 *isCopy = JNI_TRUE; \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3659 } \
faf2631b9334 8022683: JNI GetStringUTFChars should return NULL on allocation failure not abort the VM
dsimms
parents: 11092
diff changeset
3660 } \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3661 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3662 ReturnProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3663 return result; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3664 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3665
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3666 DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3667 , HOTSPOT_JNI_GETBOOLEANARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3668 HOTSPOT_JNI_GETBOOLEANARRAYELEMENTS_RETURN((uintptr_t*)result))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3669 DEFINE_GETSCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3670 , HOTSPOT_JNI_GETBYTEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3671 HOTSPOT_JNI_GETBYTEARRAYELEMENTS_RETURN((char*)result))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3672 DEFINE_GETSCALARARRAYELEMENTS(T_SHORT, jshort, Short, short
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3673 , HOTSPOT_JNI_GETSHORTARRAYELEMENTS_ENTRY(env, (uint16_t*) array, (uintptr_t *) isCopy),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3674 HOTSPOT_JNI_GETSHORTARRAYELEMENTS_RETURN((uint16_t*)result))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3675 DEFINE_GETSCALARARRAYELEMENTS(T_CHAR, jchar, Char, char
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3676 , HOTSPOT_JNI_GETCHARARRAYELEMENTS_ENTRY(env, (uint16_t*) array, (uintptr_t *) isCopy),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3677 HOTSPOT_JNI_GETCHARARRAYELEMENTS_RETURN(result))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3678 DEFINE_GETSCALARARRAYELEMENTS(T_INT, jint, Int, int
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3679 , HOTSPOT_JNI_GETINTARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3680 HOTSPOT_JNI_GETINTARRAYELEMENTS_RETURN((uint32_t*)result))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3681 DEFINE_GETSCALARARRAYELEMENTS(T_LONG, jlong, Long, long
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3682 , HOTSPOT_JNI_GETLONGARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3683 HOTSPOT_JNI_GETLONGARRAYELEMENTS_RETURN(((uintptr_t*)result)))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3684 // Float and double probes don't return value because dtrace doesn't currently support it
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3685 DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3686 , HOTSPOT_JNI_GETFLOATARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3687 HOTSPOT_JNI_GETFLOATARRAYELEMENTS_RETURN(result))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3688 DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3689 , HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3690 HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_RETURN(result))
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3691 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3692
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3693 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3694 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 \
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 JNI_QUICK_ENTRY(void, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 ElementType *buf, jint mode)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3699 JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3700 DTRACE_PROBE4(hotspot_jni, Release##Result##ArrayElements__entry, env, array, buf, mode);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3701 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 int len = a->length(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3703 if (len != 0) { /* Empty array: nothing to free or copy. */ \
a61af66fc99e Initial load
duke
parents:
diff changeset
3704 if ((mode == 0) || (mode == JNI_COMMIT)) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 if ((mode == 0) || (mode == JNI_ABORT)) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3708 FreeHeap(buf); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3709 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
3710 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
3711 DTRACE_PROBE(hotspot_jni, Release##Result##ArrayElements__return);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3712 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3713
a61af66fc99e Initial load
duke
parents:
diff changeset
3714 DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
3715 DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
3716 DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT, jshort, Short, short)
a61af66fc99e Initial load
duke
parents:
diff changeset
3717 DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR, jchar, Char, char)
a61af66fc99e Initial load
duke
parents:
diff changeset
3718 DEFINE_RELEASESCALARARRAYELEMENTS(T_INT, jint, Int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 DEFINE_RELEASESCALARARRAYELEMENTS(T_LONG, jlong, Long, long)
a61af66fc99e Initial load
duke
parents:
diff changeset
3720 DEFINE_RELEASESCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float)
a61af66fc99e Initial load
duke
parents:
diff changeset
3721 DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double)
a61af66fc99e Initial load
duke
parents:
diff changeset
3722
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3723 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3724
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3725 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3726 , EntryProbe, ReturnProbe);\
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3727 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3728 JNI_QUICK_ENTRY(void, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3729 jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3730 ElementType *buf, jint mode)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3731 JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3732 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3733 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3734 int len = a->length(); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3735 if (len != 0) { /* Empty array: nothing to free or copy. */ \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3736 if ((mode == 0) || (mode == JNI_COMMIT)) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3737 memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3738 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3739 if ((mode == 0) || (mode == JNI_ABORT)) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3740 FreeHeap(buf); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3741 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3742 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3743 ReturnProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3744 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3745
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3746 DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3747 , HOTSPOT_JNI_RELEASEBOOLEANARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) buf, mode),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3748 HOTSPOT_JNI_RELEASEBOOLEANARRAYELEMENTS_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3749 DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3750 , HOTSPOT_JNI_RELEASEBYTEARRAYELEMENTS_ENTRY(env, array, (char *) buf, mode),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3751 HOTSPOT_JNI_RELEASEBYTEARRAYELEMENTS_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3752 DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT, jshort, Short, short
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3753 , HOTSPOT_JNI_RELEASESHORTARRAYELEMENTS_ENTRY(env, array, (uint16_t *) buf, mode),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3754 HOTSPOT_JNI_RELEASESHORTARRAYELEMENTS_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3755 DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR, jchar, Char, char
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3756 , HOTSPOT_JNI_RELEASECHARARRAYELEMENTS_ENTRY(env, array, (uint16_t *) buf, mode),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3757 HOTSPOT_JNI_RELEASECHARARRAYELEMENTS_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3758 DEFINE_RELEASESCALARARRAYELEMENTS(T_INT, jint, Int, int
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3759 , HOTSPOT_JNI_RELEASEINTARRAYELEMENTS_ENTRY(env, array, (uint32_t *) buf, mode),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3760 HOTSPOT_JNI_RELEASEINTARRAYELEMENTS_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3761 DEFINE_RELEASESCALARARRAYELEMENTS(T_LONG, jlong, Long, long
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3762 , HOTSPOT_JNI_RELEASELONGARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) buf, mode),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3763 HOTSPOT_JNI_RELEASELONGARRAYELEMENTS_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3764 DEFINE_RELEASESCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3765 , HOTSPOT_JNI_RELEASEFLOATARRAYELEMENTS_ENTRY(env, array, (float *) buf, mode),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3766 HOTSPOT_JNI_RELEASEFLOATARRAYELEMENTS_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3767 DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3768 , HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_ENTRY(env, array, (double *) buf, mode),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3769 HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3770 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3771
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3772 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3773 #define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3775 \
a61af66fc99e Initial load
duke
parents:
diff changeset
3776 JNI_ENTRY(void, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3777 jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3778 jsize len, ElementType *buf)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3779 JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3780 DTRACE_PROBE5(hotspot_jni, Get##Result##ArrayRegion__entry, env, array, start, len, buf);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3781 DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3782 typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3784 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3785 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3786 if (len > 0) { \
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3787 int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3788 memcpy((u_char*) buf, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3789 (u_char*) src->Tag##_at_addr(start), \
a61af66fc99e Initial load
duke
parents:
diff changeset
3790 len << sc); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3791 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
3792 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
3793 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3794
a61af66fc99e Initial load
duke
parents:
diff changeset
3795 DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
3796 DEFINE_GETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
3797 DEFINE_GETSCALARARRAYREGION(T_SHORT, jshort, Short, short)
a61af66fc99e Initial load
duke
parents:
diff changeset
3798 DEFINE_GETSCALARARRAYREGION(T_CHAR, jchar, Char, char)
a61af66fc99e Initial load
duke
parents:
diff changeset
3799 DEFINE_GETSCALARARRAYREGION(T_INT, jint, Int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
3800 DEFINE_GETSCALARARRAYREGION(T_LONG, jlong, Long, long)
a61af66fc99e Initial load
duke
parents:
diff changeset
3801 DEFINE_GETSCALARARRAYREGION(T_FLOAT, jfloat, Float, float)
a61af66fc99e Initial load
duke
parents:
diff changeset
3802 DEFINE_GETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double)
a61af66fc99e Initial load
duke
parents:
diff changeset
3803
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3804 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3805
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3806 #define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3807 , EntryProbe, ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3808 DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3809 , ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3810 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3811 JNI_ENTRY(void, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3812 jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3813 jsize len, ElementType *buf)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3814 JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3815 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3816 DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3817 typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3818 if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3819 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3820 } else { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3821 if (len > 0) { \
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3822 int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3823 memcpy((u_char*) buf, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3824 (u_char*) src->Tag##_at_addr(start), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3825 len << sc); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3826 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3827 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3828 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3829
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3830 DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3831 , HOTSPOT_JNI_GETBOOLEANARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3832 HOTSPOT_JNI_GETBOOLEANARRAYREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3833 DEFINE_GETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3834 , HOTSPOT_JNI_GETBYTEARRAYREGION_ENTRY(env, array, start, len, (char *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3835 HOTSPOT_JNI_GETBYTEARRAYREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3836 DEFINE_GETSCALARARRAYREGION(T_SHORT, jshort, Short, short
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3837 , HOTSPOT_JNI_GETSHORTARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3838 HOTSPOT_JNI_GETSHORTARRAYREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3839 DEFINE_GETSCALARARRAYREGION(T_CHAR, jchar, Char, char
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3840 , HOTSPOT_JNI_GETCHARARRAYREGION_ENTRY(env, array, start, len, (uint16_t*) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3841 HOTSPOT_JNI_GETCHARARRAYREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3842 DEFINE_GETSCALARARRAYREGION(T_INT, jint, Int, int
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3843 , HOTSPOT_JNI_GETINTARRAYREGION_ENTRY(env, array, start, len, (uint32_t*) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3844 HOTSPOT_JNI_GETINTARRAYREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3845 DEFINE_GETSCALARARRAYREGION(T_LONG, jlong, Long, long
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3846 , HOTSPOT_JNI_GETLONGARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3847 HOTSPOT_JNI_GETLONGARRAYREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3848 DEFINE_GETSCALARARRAYREGION(T_FLOAT, jfloat, Float, float
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3849 , HOTSPOT_JNI_GETFLOATARRAYREGION_ENTRY(env, array, start, len, (float *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3850 HOTSPOT_JNI_GETFLOATARRAYREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3851 DEFINE_GETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3852 , HOTSPOT_JNI_GETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3853 HOTSPOT_JNI_GETDOUBLEARRAYREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3854 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3855
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3856 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3857 #define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3858 DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3859 \
a61af66fc99e Initial load
duke
parents:
diff changeset
3860 JNI_ENTRY(void, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3861 jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3862 jsize len, const ElementType *buf)) \
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3864 DTRACE_PROBE5(hotspot_jni, Set##Result##ArrayRegion__entry, env, array, start, len, buf);\
a61af66fc99e Initial load
duke
parents:
diff changeset
3865 DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3866 typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3867 if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3868 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3869 } else { \
a61af66fc99e Initial load
duke
parents:
diff changeset
3870 if (len > 0) { \
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3871 int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3872 memcpy((u_char*) dst->Tag##_at_addr(start), \
a61af66fc99e Initial load
duke
parents:
diff changeset
3873 (u_char*) buf, \
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 len << sc); \
a61af66fc99e Initial load
duke
parents:
diff changeset
3875 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
3876 } \
a61af66fc99e Initial load
duke
parents:
diff changeset
3877 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3878
a61af66fc99e Initial load
duke
parents:
diff changeset
3879 DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool)
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 DEFINE_SETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte)
a61af66fc99e Initial load
duke
parents:
diff changeset
3881 DEFINE_SETSCALARARRAYREGION(T_SHORT, jshort, Short, short)
a61af66fc99e Initial load
duke
parents:
diff changeset
3882 DEFINE_SETSCALARARRAYREGION(T_CHAR, jchar, Char, char)
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 DEFINE_SETSCALARARRAYREGION(T_INT, jint, Int, int)
a61af66fc99e Initial load
duke
parents:
diff changeset
3884 DEFINE_SETSCALARARRAYREGION(T_LONG, jlong, Long, long)
a61af66fc99e Initial load
duke
parents:
diff changeset
3885 DEFINE_SETSCALARARRAYREGION(T_FLOAT, jfloat, Float, float)
a61af66fc99e Initial load
duke
parents:
diff changeset
3886 DEFINE_SETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double)
a61af66fc99e Initial load
duke
parents:
diff changeset
3887
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3888 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3889
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3890 #define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3891 , EntryProbe, ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3892 DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3893 ,ReturnProbe); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3894 \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3895 JNI_ENTRY(void, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3896 jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3897 jsize len, const ElementType *buf)) \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3898 JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3899 EntryProbe; \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3900 DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3901 typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3902 if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3903 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3904 } else { \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3905 if (len > 0) { \
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
3906 int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3907 memcpy((u_char*) dst->Tag##_at_addr(start), \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3908 (u_char*) buf, \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3909 len << sc); \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3910 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3911 } \
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3912 JNI_END
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3913
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3914 DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3915 , HOTSPOT_JNI_SETBOOLEANARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *)buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3916 HOTSPOT_JNI_SETBOOLEANARRAYREGION_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3917 DEFINE_SETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3918 , HOTSPOT_JNI_SETBYTEARRAYREGION_ENTRY(env, array, start, len, (char *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3919 HOTSPOT_JNI_SETBYTEARRAYREGION_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3920 DEFINE_SETSCALARARRAYREGION(T_SHORT, jshort, Short, short
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3921 , HOTSPOT_JNI_SETSHORTARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3922 HOTSPOT_JNI_SETSHORTARRAYREGION_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3923 DEFINE_SETSCALARARRAYREGION(T_CHAR, jchar, Char, char
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3924 , HOTSPOT_JNI_SETCHARARRAYREGION_ENTRY(env, array, start, len, (uint16_t *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3925 HOTSPOT_JNI_SETCHARARRAYREGION_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3926 DEFINE_SETSCALARARRAYREGION(T_INT, jint, Int, int
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3927 , HOTSPOT_JNI_SETINTARRAYREGION_ENTRY(env, array, start, len, (uint32_t *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3928 HOTSPOT_JNI_SETINTARRAYREGION_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3929 DEFINE_SETSCALARARRAYREGION(T_LONG, jlong, Long, long
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3930 , HOTSPOT_JNI_SETLONGARRAYREGION_ENTRY(env, array, start, len, (uintptr_t *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3931 HOTSPOT_JNI_SETLONGARRAYREGION_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3932 DEFINE_SETSCALARARRAYREGION(T_FLOAT, jfloat, Float, float
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3933 , HOTSPOT_JNI_SETFLOATARRAYREGION_ENTRY(env, array, start, len, (float *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3934 HOTSPOT_JNI_SETFLOATARRAYREGION_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3935 DEFINE_SETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3936 , HOTSPOT_JNI_SETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3937 HOTSPOT_JNI_SETDOUBLEARRAYREGION_RETURN())
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3938 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
3939
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3940
a61af66fc99e Initial load
duke
parents:
diff changeset
3941 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3942 // Interception of natives
a61af66fc99e Initial load
duke
parents:
diff changeset
3943 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3944
a61af66fc99e Initial load
duke
parents:
diff changeset
3945 // The RegisterNatives call being attempted tried to register with a method that
a61af66fc99e Initial load
duke
parents:
diff changeset
3946 // is not native. Ask JVM TI what prefixes have been specified. Then check
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 // to see if the native method is now wrapped with the prefixes. See the
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 // SetNativeMethodPrefix(es) functions in the JVM TI Spec for details.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
3949 static Method* find_prefixed_native(KlassHandle k,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
3950 Symbol* name, Symbol* signature, TRAPS) {
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
3951 #if INCLUDE_JVMTI
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3952 ResourceMark rm(THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
3953 Method* method;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3954 int name_len = name->utf8_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
3955 char* name_str = name->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
3956 int prefix_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
3957 char** prefixes = JvmtiExport::get_all_native_method_prefixes(&prefix_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
3958 for (int i = 0; i < prefix_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3959 char* prefix = prefixes[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
3960 int prefix_len = (int)strlen(prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
3961
a61af66fc99e Initial load
duke
parents:
diff changeset
3962 // try adding this prefix to the method name and see if it matches another method name
a61af66fc99e Initial load
duke
parents:
diff changeset
3963 int trial_len = name_len + prefix_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
3964 char* trial_name_str = NEW_RESOURCE_ARRAY(char, trial_len + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3965 strcpy(trial_name_str, prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
3966 strcat(trial_name_str, name_str);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
3967 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
3968 if (trial_name == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3969 continue; // no such symbol, so this prefix wasn't used, try the next prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
3970 }
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
3971 method = k()->lookup_method(trial_name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3972 if (method == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3973 continue; // signature doesn't match, try the next prefix
a61af66fc99e Initial load
duke
parents:
diff changeset
3974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3975 if (method->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3976 method->set_is_prefixed_native();
a61af66fc99e Initial load
duke
parents:
diff changeset
3977 return method; // wahoo, we found a prefixed version of the method, return it
a61af66fc99e Initial load
duke
parents:
diff changeset
3978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3979 // found as non-native, so prefix is good, add it, probably just need more prefixes
a61af66fc99e Initial load
duke
parents:
diff changeset
3980 name_len = trial_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
3981 name_str = trial_name_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
3982 }
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
3983 #endif // INCLUDE_JVMTI
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3984 return NULL; // not found
a61af66fc99e Initial load
duke
parents:
diff changeset
3985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3986
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
3987 static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) {
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
3988 Method* method = k()->lookup_method(name, signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3989 if (method == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3990 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3991 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
3992 st.print("Method %s name or signature does not match",
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
3993 Method::name_and_sig_as_C_string(k(), name, signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3994 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
3995 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3996 if (!method->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3997 // 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
3998 method = find_prefixed_native(k, name, signature, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3999 if (method == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4000 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
4001 stringStream st;
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 st.print("Method %s is not declared as native",
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
4003 Method::name_and_sig_as_C_string(k(), name, signature));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4004 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
4005 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4006 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4007
a61af66fc99e Initial load
duke
parents:
diff changeset
4008 if (entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4009 method->set_native_function(entry,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
4010 Method::native_bind_event_is_interesting);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4011 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4012 method->clear_native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
4013 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4014 if (PrintJNIResolving) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4015 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4016 tty->print_cr("[Registering JNI native method %s.%s]",
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6856
diff changeset
4017 method->method_holder()->external_name(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4018 method->name()->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
4019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4020 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4022
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4023 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4024 DT_RETURN_MARK_DECL(RegisterNatives, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4025 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4026 DT_RETURN_MARK_DECL(RegisterNatives, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4027 , HOTSPOT_JNI_REGISTERNATIVES_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4028 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4029
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,
a61af66fc99e Initial load
duke
parents:
diff changeset
4031 const JNINativeMethod *methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
4032 jint nMethods))
a61af66fc99e Initial load
duke
parents:
diff changeset
4033 JNIWrapper("RegisterNatives");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4034 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4035 DTRACE_PROBE4(hotspot_jni, RegisterNatives__entry, env, clazz, methods, nMethods);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4036 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4037 HOTSPOT_JNI_REGISTERNATIVES_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4038 env, clazz, (void *) methods, nMethods);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4039 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4040 jint ret = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4041 DT_RETURN_MARK(RegisterNatives, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
4042
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
4043 KlassHandle h_k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4044
a61af66fc99e Initial load
duke
parents:
diff changeset
4045 for (int index = 0; index < nMethods; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4046 const char* meth_name = methods[index].name;
a61af66fc99e Initial load
duke
parents:
diff changeset
4047 const char* meth_sig = methods[index].signature;
a61af66fc99e Initial load
duke
parents:
diff changeset
4048 int meth_name_len = (int)strlen(meth_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
4049
a61af66fc99e Initial load
duke
parents:
diff changeset
4050 // The class should have been loaded (we have an instance of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
4051 // passed in) so the method and signature should already be in the symbol
a61af66fc99e Initial load
duke
parents:
diff changeset
4052 // 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
4053 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
4054 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
4055
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
4056 if (name == NULL || signature == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4057 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
4058 stringStream st;
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
4059 st.print("Method %s.%s%s not found", h_k()->external_name(), meth_name, meth_sig);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4060 // Must return negative value on failure
a61af66fc99e Initial load
duke
parents:
diff changeset
4061 THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
4062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4063
a61af66fc99e Initial load
duke
parents:
diff changeset
4064 bool res = register_native(h_k, name, signature,
a61af66fc99e Initial load
duke
parents:
diff changeset
4065 (address) methods[index].fnPtr, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4066 if (!res) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4067 ret = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4068 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4071 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4072 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4073
a61af66fc99e Initial load
duke
parents:
diff changeset
4074
a61af66fc99e Initial load
duke
parents:
diff changeset
4075 JNI_ENTRY(jint, jni_UnregisterNatives(JNIEnv *env, jclass clazz))
a61af66fc99e Initial load
duke
parents:
diff changeset
4076 JNIWrapper("UnregisterNatives");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4077 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4078 DTRACE_PROBE2(hotspot_jni, UnregisterNatives__entry, env, clazz);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4079 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4080 HOTSPOT_JNI_UNREGISTERNATIVES_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4081 env, clazz);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4082 #endif /* USDT2 */
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
4083 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4084 //%note jni_2
6983
070d523b96a7 8001471: Klass::cast() does nothing
hseigel
parents: 6940
diff changeset
4085 if (k->oop_is_instance()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
4086 for (int index = 0; index < InstanceKlass::cast(k)->methods()->length(); index++) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
4087 Method* m = InstanceKlass::cast(k)->methods()->at(index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4088 if (m->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4089 m->clear_native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
4090 m->set_signature_handler(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4092 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4093 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4094 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4095 DTRACE_PROBE1(hotspot_jni, UnregisterNatives__return, 0);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4096 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4097 HOTSPOT_JNI_UNREGISTERNATIVES_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4098 0);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4099 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4100 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4101 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4102
a61af66fc99e Initial load
duke
parents:
diff changeset
4103 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4104 // Monitor functions
a61af66fc99e Initial load
duke
parents:
diff changeset
4105 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4106
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4107 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4108 DT_RETURN_MARK_DECL(MonitorEnter, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4109 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4110 DT_RETURN_MARK_DECL(MonitorEnter, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4111 , HOTSPOT_JNI_MONITORENTER_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4112 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4113
a61af66fc99e Initial load
duke
parents:
diff changeset
4114 JNI_ENTRY(jint, jni_MonitorEnter(JNIEnv *env, jobject jobj))
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4115 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4116 DTRACE_PROBE2(hotspot_jni, MonitorEnter__entry, env, jobj);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4117 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4118 HOTSPOT_JNI_MONITORENTER_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4119 env, jobj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4120 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4121 jint ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
4122 DT_RETURN_MARK(MonitorEnter, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
4123
a61af66fc99e Initial load
duke
parents:
diff changeset
4124 // If the object is null, we can't do anything with it
a61af66fc99e Initial load
duke
parents:
diff changeset
4125 if (jobj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4126 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
a61af66fc99e Initial load
duke
parents:
diff changeset
4127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4128
a61af66fc99e Initial load
duke
parents:
diff changeset
4129 Handle obj(thread, JNIHandles::resolve_non_null(jobj));
a61af66fc99e Initial load
duke
parents:
diff changeset
4130 ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR));
a61af66fc99e Initial load
duke
parents:
diff changeset
4131 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
4132 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4133 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4134
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4135 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4136 DT_RETURN_MARK_DECL(MonitorExit, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4137 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4138 DT_RETURN_MARK_DECL(MonitorExit, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4139 , HOTSPOT_JNI_MONITOREXIT_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4140 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4141
a61af66fc99e Initial load
duke
parents:
diff changeset
4142 JNI_ENTRY(jint, jni_MonitorExit(JNIEnv *env, jobject jobj))
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4143 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4144 DTRACE_PROBE2(hotspot_jni, MonitorExit__entry, env, jobj);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4145 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4146 HOTSPOT_JNI_MONITOREXIT_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4147 env, jobj);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4148 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4149 jint ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
4150 DT_RETURN_MARK(MonitorExit, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
4151
a61af66fc99e Initial load
duke
parents:
diff changeset
4152 // Don't do anything with a null object
a61af66fc99e Initial load
duke
parents:
diff changeset
4153 if (jobj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4154 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
a61af66fc99e Initial load
duke
parents:
diff changeset
4155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4156
a61af66fc99e Initial load
duke
parents:
diff changeset
4157 Handle obj(THREAD, JNIHandles::resolve_non_null(jobj));
a61af66fc99e Initial load
duke
parents:
diff changeset
4158 ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR));
a61af66fc99e Initial load
duke
parents:
diff changeset
4159
a61af66fc99e Initial load
duke
parents:
diff changeset
4160 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
4161 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4162 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4163
a61af66fc99e Initial load
duke
parents:
diff changeset
4164 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4165 // Extensions
a61af66fc99e Initial load
duke
parents:
diff changeset
4166 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4167
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4168 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4169 DT_VOID_RETURN_MARK_DECL(GetStringRegion);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4170 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4171 DT_VOID_RETURN_MARK_DECL(GetStringRegion
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4172 , HOTSPOT_JNI_GETSTRINGREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4173 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4174
a61af66fc99e Initial load
duke
parents:
diff changeset
4175 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
a61af66fc99e Initial load
duke
parents:
diff changeset
4176 JNIWrapper("GetStringRegion");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4177 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4178 DTRACE_PROBE5(hotspot_jni, GetStringRegion__entry, env, string, start, len, buf);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4179 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4180 HOTSPOT_JNI_GETSTRINGREGION_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4181 env, string, start, len, buf);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4182 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4183 DT_VOID_RETURN_MARK(GetStringRegion);
a61af66fc99e Initial load
duke
parents:
diff changeset
4184 oop s = JNIHandles::resolve_non_null(string);
a61af66fc99e Initial load
duke
parents:
diff changeset
4185 int s_len = java_lang_String::length(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
4186 if (start < 0 || len < 0 || start + len > s_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4187 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
a61af66fc99e Initial load
duke
parents:
diff changeset
4188 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4189 if (len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4190 int s_offset = java_lang_String::offset(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
4191 typeArrayOop s_value = java_lang_String::value(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
4192 memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);
a61af66fc99e Initial load
duke
parents:
diff changeset
4193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4195 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4196
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4197 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4198 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4199 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4200 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4201 , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN());
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4202 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4203
a61af66fc99e Initial load
duke
parents:
diff changeset
4204 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
a61af66fc99e Initial load
duke
parents:
diff changeset
4205 JNIWrapper("GetStringUTFRegion");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4206 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4207 DTRACE_PROBE5(hotspot_jni, GetStringUTFRegion__entry, env, string, start, len, buf);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4208 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4209 HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4210 env, string, start, len, buf);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4211 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4212 DT_VOID_RETURN_MARK(GetStringUTFRegion);
a61af66fc99e Initial load
duke
parents:
diff changeset
4213 oop s = JNIHandles::resolve_non_null(string);
a61af66fc99e Initial load
duke
parents:
diff changeset
4214 int s_len = java_lang_String::length(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
4215 if (start < 0 || len < 0 || start + len > s_len) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4216 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
a61af66fc99e Initial load
duke
parents:
diff changeset
4217 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4218 //%note jni_7
a61af66fc99e Initial load
duke
parents:
diff changeset
4219 if (len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4220 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4221 char *utf_region = java_lang_String::as_utf8_string(s, start, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
4222 int utf_len = (int)strlen(utf_region);
a61af66fc99e Initial load
duke
parents:
diff changeset
4223 memcpy(buf, utf_region, utf_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
4224 buf[utf_len] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4225 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4226 // JDK null-terminates the buffer even in len is zero
a61af66fc99e Initial load
duke
parents:
diff changeset
4227 if (buf != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4228 buf[0] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4232 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4233
a61af66fc99e Initial load
duke
parents:
diff changeset
4234
a61af66fc99e Initial load
duke
parents:
diff changeset
4235 JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
a61af66fc99e Initial load
duke
parents:
diff changeset
4236 JNIWrapper("GetPrimitiveArrayCritical");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4237 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4238 DTRACE_PROBE3(hotspot_jni, GetPrimitiveArrayCritical__entry, env, array, isCopy);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4239 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4240 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4241 env, array, (uintptr_t *) isCopy);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4242 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4243 GC_locker::lock_critical(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4244 if (isCopy != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4245 *isCopy = JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4247 oop a = JNIHandles::resolve_non_null(array);
a61af66fc99e Initial load
duke
parents:
diff changeset
4248 assert(a->is_array(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
4249 BasicType type;
a61af66fc99e Initial load
duke
parents:
diff changeset
4250 if (a->is_objArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4251 type = T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
4252 } else {
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6725
diff changeset
4253 type = TypeArrayKlass::cast(a->klass())->element_type();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4255 void* ret = arrayOop(a)->base(type);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4256 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4257 DTRACE_PROBE1(hotspot_jni, GetPrimitiveArrayCritical__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4258 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4259 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4260 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4261 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4262 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4263 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4264
a61af66fc99e Initial load
duke
parents:
diff changeset
4265
a61af66fc99e Initial load
duke
parents:
diff changeset
4266 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
a61af66fc99e Initial load
duke
parents:
diff changeset
4267 JNIWrapper("ReleasePrimitiveArrayCritical");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4268 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4269 DTRACE_PROBE4(hotspot_jni, ReleasePrimitiveArrayCritical__entry, env, array, carray, mode);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4270 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4271 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4272 env, array, carray, mode);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4273 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4274 // The array, carray and mode arguments are ignored
a61af66fc99e Initial load
duke
parents:
diff changeset
4275 GC_locker::unlock_critical(thread);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4276 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4277 DTRACE_PROBE(hotspot_jni, ReleasePrimitiveArrayCritical__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4278 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4279 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4280 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4281 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4282 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4283
a61af66fc99e Initial load
duke
parents:
diff changeset
4284
a61af66fc99e Initial load
duke
parents:
diff changeset
4285 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
a61af66fc99e Initial load
duke
parents:
diff changeset
4286 JNIWrapper("GetStringCritical");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4287 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4288 DTRACE_PROBE3(hotspot_jni, GetStringCritical__entry, env, string, isCopy);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4289 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4290 HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4291 env, string, (uintptr_t *) isCopy);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4292 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4293 GC_locker::lock_critical(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4294 if (isCopy != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4295 *isCopy = JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
4296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4297 oop s = JNIHandles::resolve_non_null(string);
a61af66fc99e Initial load
duke
parents:
diff changeset
4298 int s_len = java_lang_String::length(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
4299 typeArrayOop s_value = java_lang_String::value(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
4300 int s_offset = java_lang_String::offset(s);
a61af66fc99e Initial load
duke
parents:
diff changeset
4301 const jchar* ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4302 if (s_len > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4303 ret = s_value->char_at_addr(s_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
4304 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4305 ret = (jchar*) s_value->base(T_CHAR);
a61af66fc99e Initial load
duke
parents:
diff changeset
4306 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4307 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4308 DTRACE_PROBE1(hotspot_jni, GetStringCritical__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4309 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4310 HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4311 (uint16_t *) ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4312 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4313 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4314 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4315
a61af66fc99e Initial load
duke
parents:
diff changeset
4316
a61af66fc99e Initial load
duke
parents:
diff changeset
4317 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
a61af66fc99e Initial load
duke
parents:
diff changeset
4318 JNIWrapper("ReleaseStringCritical");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4319 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4320 DTRACE_PROBE3(hotspot_jni, ReleaseStringCritical__entry, env, str, chars);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4321 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4322 HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4323 env, str, (uint16_t *) chars);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4324 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4325 // The str and chars arguments are ignored
a61af66fc99e Initial load
duke
parents:
diff changeset
4326 GC_locker::unlock_critical(thread);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4327 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4328 DTRACE_PROBE(hotspot_jni, ReleaseStringCritical__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4329 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4330 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4331 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4332 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4333 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4334
a61af66fc99e Initial load
duke
parents:
diff changeset
4335
a61af66fc99e Initial load
duke
parents:
diff changeset
4336 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
4337 JNIWrapper("jni_NewWeakGlobalRef");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4338 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4339 DTRACE_PROBE2(hotspot_jni, NewWeakGlobalRef__entry, env, ref);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4340 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4341 HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4342 env, ref);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4343 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4344 Handle ref_handle(thread, JNIHandles::resolve(ref));
a61af66fc99e Initial load
duke
parents:
diff changeset
4345 jweak ret = JNIHandles::make_weak_global(ref_handle);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4346 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4347 DTRACE_PROBE1(hotspot_jni, NewWeakGlobalRef__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4348 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4349 HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4350 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4351 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4352 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4353 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4354
a61af66fc99e Initial load
duke
parents:
diff changeset
4355 // Must be JNI_ENTRY (with HandleMark)
a61af66fc99e Initial load
duke
parents:
diff changeset
4356 JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref))
a61af66fc99e Initial load
duke
parents:
diff changeset
4357 JNIWrapper("jni_DeleteWeakGlobalRef");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4358 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4359 DTRACE_PROBE2(hotspot_jni, DeleteWeakGlobalRef__entry, env, ref);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4360 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4361 HOTSPOT_JNI_DELETEWEAKGLOBALREF_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4362 env, ref);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4363 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4364 JNIHandles::destroy_weak_global(ref);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4365 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4366 DTRACE_PROBE(hotspot_jni, DeleteWeakGlobalRef__return);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4367 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4368 HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4369 );
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4370 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4371 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4372
a61af66fc99e Initial load
duke
parents:
diff changeset
4373
a61af66fc99e Initial load
duke
parents:
diff changeset
4374 JNI_QUICK_ENTRY(jboolean, jni_ExceptionCheck(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
4375 JNIWrapper("jni_ExceptionCheck");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4376 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4377 DTRACE_PROBE1(hotspot_jni, ExceptionCheck__entry, env);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4378 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4379 HOTSPOT_JNI_EXCEPTIONCHECK_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4380 env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4381 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4382 jni_check_async_exceptions(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
4383 jboolean ret = (thread->has_pending_exception()) ? JNI_TRUE : JNI_FALSE;
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4384 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4385 DTRACE_PROBE1(hotspot_jni, ExceptionCheck__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4386 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4387 HOTSPOT_JNI_EXCEPTIONCHECK_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4388 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4389 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4390 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4391 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4392
a61af66fc99e Initial load
duke
parents:
diff changeset
4393
a61af66fc99e Initial load
duke
parents:
diff changeset
4394 // Initialization state for three routines below relating to
a61af66fc99e Initial load
duke
parents:
diff changeset
4395 // java.nio.DirectBuffers
a61af66fc99e Initial load
duke
parents:
diff changeset
4396 static jint directBufferSupportInitializeStarted = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4397 static volatile jint directBufferSupportInitializeEnded = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4398 static volatile jint directBufferSupportInitializeFailed = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4399 static jclass bufferClass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4400 static jclass directBufferClass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4401 static jclass directByteBufferClass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4402 static jmethodID directByteBufferConstructor = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4403 static jfieldID directBufferAddressField = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4404 static jfieldID bufferCapacityField = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4405
a61af66fc99e Initial load
duke
parents:
diff changeset
4406 static jclass lookupOne(JNIEnv* env, const char* name, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4407 Handle loader; // null (bootstrap) loader
a61af66fc99e Initial load
duke
parents:
diff changeset
4408 Handle protection_domain; // null protection domain
a61af66fc99e Initial load
duke
parents:
diff changeset
4409
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1989
diff changeset
4410 TempNewSymbol sym = SymbolTable::new_symbol(name, CHECK_NULL);
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
4411 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
4412
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
4413 if (TraceClassResolution && result != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
4414 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result)));
657
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
4415 }
715dceaa89b7 6603316: Improve instrumentation for classes loaded at startup
acorn
parents: 579
diff changeset
4416 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4418
a61af66fc99e Initial load
duke
parents:
diff changeset
4419 // These lookups are done with the NULL (bootstrap) ClassLoader to
a61af66fc99e Initial load
duke
parents:
diff changeset
4420 // circumvent any security checks that would be done by jni_FindClass.
a61af66fc99e Initial load
duke
parents:
diff changeset
4421 JNI_ENTRY(bool, lookupDirectBufferClasses(JNIEnv* env))
a61af66fc99e Initial load
duke
parents:
diff changeset
4422 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4423 if ((bufferClass = lookupOne(env, "java/nio/Buffer", thread)) == NULL) { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
4424 if ((directBufferClass = lookupOne(env, "sun/nio/ch/DirectBuffer", thread)) == NULL) { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
4425 if ((directByteBufferClass = lookupOne(env, "java/nio/DirectByteBuffer", thread)) == NULL) { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
4426 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4428 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4429
a61af66fc99e Initial load
duke
parents:
diff changeset
4430
a61af66fc99e Initial load
duke
parents:
diff changeset
4431 static bool initializeDirectBufferSupport(JNIEnv* env, JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4432 if (directBufferSupportInitializeFailed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4433 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4435
a61af66fc99e Initial load
duke
parents:
diff changeset
4436 if (Atomic::cmpxchg(1, &directBufferSupportInitializeStarted, 0) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4437 if (!lookupDirectBufferClasses(env)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4438 directBufferSupportInitializeFailed = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4439 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4441
a61af66fc99e Initial load
duke
parents:
diff changeset
4442 // Make global references for these
a61af66fc99e Initial load
duke
parents:
diff changeset
4443 bufferClass = (jclass) env->NewGlobalRef(bufferClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
4444 directBufferClass = (jclass) env->NewGlobalRef(directBufferClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
4445 directByteBufferClass = (jclass) env->NewGlobalRef(directByteBufferClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
4446
a61af66fc99e Initial load
duke
parents:
diff changeset
4447 // Get needed field and method IDs
a61af66fc99e Initial load
duke
parents:
diff changeset
4448 directByteBufferConstructor = env->GetMethodID(directByteBufferClass, "<init>", "(JI)V");
17704
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4449 if (env->ExceptionCheck()) {
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4450 env->ExceptionClear();
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4451 directBufferSupportInitializeFailed = 1;
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4452 return false;
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4453 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4454 directBufferAddressField = env->GetFieldID(bufferClass, "address", "J");
17704
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4455 if (env->ExceptionCheck()) {
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4456 env->ExceptionClear();
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4457 directBufferSupportInitializeFailed = 1;
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4458 return false;
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4459 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4460 bufferCapacityField = env->GetFieldID(bufferClass, "capacity", "I");
17704
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4461 if (env->ExceptionCheck()) {
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4462 env->ExceptionClear();
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4463 directBufferSupportInitializeFailed = 1;
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4464 return false;
56cd09c4a5c9 8028785: [parfait] warnings from b116 for hotspot.src.share.vm.prims: JNI exception pending
ccheung
parents: 17694
diff changeset
4465 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4466
a61af66fc99e Initial load
duke
parents:
diff changeset
4467 if ((directByteBufferConstructor == NULL) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
4468 (directBufferAddressField == NULL) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
4469 (bufferCapacityField == NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4470 directBufferSupportInitializeFailed = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4471 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4473
a61af66fc99e Initial load
duke
parents:
diff changeset
4474 directBufferSupportInitializeEnded = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4475 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4476 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
4477 // 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
4478 // 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
4479 // 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
4480 // 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
4481 // 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
4482 ThreadInVMfromNative tivn(thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4483 os::yield_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
4484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4486
a61af66fc99e Initial load
duke
parents:
diff changeset
4487 return !directBufferSupportInitializeFailed;
a61af66fc99e Initial load
duke
parents:
diff changeset
4488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4489
a61af66fc99e Initial load
duke
parents:
diff changeset
4490 extern "C" jobject JNICALL jni_NewDirectByteBuffer(JNIEnv *env, void* address, jlong capacity)
a61af66fc99e Initial load
duke
parents:
diff changeset
4491 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4492 // thread_from_jni_environment() will block if VM is gone.
a61af66fc99e Initial load
duke
parents:
diff changeset
4493 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
a61af66fc99e Initial load
duke
parents:
diff changeset
4494
a61af66fc99e Initial load
duke
parents:
diff changeset
4495 JNIWrapper("jni_NewDirectByteBuffer");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4496 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4497 DTRACE_PROBE3(hotspot_jni, NewDirectByteBuffer__entry, env, address, capacity);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4498 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4499 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4500 env, address, capacity);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4501 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4502
a61af66fc99e Initial load
duke
parents:
diff changeset
4503 if (!directBufferSupportInitializeEnded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4504 if (!initializeDirectBufferSupport(env, thread)) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4505 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4506 DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, NULL);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4507 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4508 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4509 NULL);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4510 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4511 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4514
a61af66fc99e Initial load
duke
parents:
diff changeset
4515 // Being paranoid about accidental sign extension on address
a61af66fc99e Initial load
duke
parents:
diff changeset
4516 jlong addr = (jlong) ((uintptr_t) address);
a61af66fc99e Initial load
duke
parents:
diff changeset
4517 // NOTE that package-private DirectByteBuffer constructor currently
a61af66fc99e Initial load
duke
parents:
diff changeset
4518 // takes int capacity
a61af66fc99e Initial load
duke
parents:
diff changeset
4519 jint cap = (jint) capacity;
a61af66fc99e Initial load
duke
parents:
diff changeset
4520 jobject ret = env->NewObject(directByteBufferClass, directByteBufferConstructor, addr, cap);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4521 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4522 DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4523 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4524 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4525 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4526 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4527 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4529
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4530 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4531 DT_RETURN_MARK_DECL(GetDirectBufferAddress, void*);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4532 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4533 DT_RETURN_MARK_DECL(GetDirectBufferAddress, void*
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4534 , HOTSPOT_JNI_GETDIRECTBUFFERADDRESS_RETURN((void*) _ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4535 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4536
a61af66fc99e Initial load
duke
parents:
diff changeset
4537 extern "C" void* JNICALL jni_GetDirectBufferAddress(JNIEnv *env, jobject buf)
a61af66fc99e Initial load
duke
parents:
diff changeset
4538 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4539 // thread_from_jni_environment() will block if VM is gone.
a61af66fc99e Initial load
duke
parents:
diff changeset
4540 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
a61af66fc99e Initial load
duke
parents:
diff changeset
4541
a61af66fc99e Initial load
duke
parents:
diff changeset
4542 JNIWrapper("jni_GetDirectBufferAddress");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4543 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4544 DTRACE_PROBE2(hotspot_jni, GetDirectBufferAddress__entry, env, buf);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4545 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4546 HOTSPOT_JNI_GETDIRECTBUFFERADDRESS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4547 env, buf);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4548 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4549 void* ret = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4550 DT_RETURN_MARK(GetDirectBufferAddress, void*, (const void*&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
4551
a61af66fc99e Initial load
duke
parents:
diff changeset
4552 if (!directBufferSupportInitializeEnded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4553 if (!initializeDirectBufferSupport(env, thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4554 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4557
a61af66fc99e Initial load
duke
parents:
diff changeset
4558 if ((buf != NULL) && (!env->IsInstanceOf(buf, directBufferClass))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4559 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4561
a61af66fc99e Initial load
duke
parents:
diff changeset
4562 ret = (void*)(intptr_t)env->GetLongField(buf, directBufferAddressField);
a61af66fc99e Initial load
duke
parents:
diff changeset
4563 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4565
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4566 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4567 DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4568 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4569 DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4570 , HOTSPOT_JNI_GETDIRECTBUFFERCAPACITY_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4571 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4572
a61af66fc99e Initial load
duke
parents:
diff changeset
4573 extern "C" jlong JNICALL jni_GetDirectBufferCapacity(JNIEnv *env, jobject buf)
a61af66fc99e Initial load
duke
parents:
diff changeset
4574 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4575 // thread_from_jni_environment() will block if VM is gone.
a61af66fc99e Initial load
duke
parents:
diff changeset
4576 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
a61af66fc99e Initial load
duke
parents:
diff changeset
4577
a61af66fc99e Initial load
duke
parents:
diff changeset
4578 JNIWrapper("jni_GetDirectBufferCapacity");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4579 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4580 DTRACE_PROBE2(hotspot_jni, GetDirectBufferCapacity__entry, env, buf);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4581 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4582 HOTSPOT_JNI_GETDIRECTBUFFERCAPACITY_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4583 env, buf);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4584 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4585 jlong ret = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4586 DT_RETURN_MARK(GetDirectBufferCapacity, jlong, (const jlong&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
4587
a61af66fc99e Initial load
duke
parents:
diff changeset
4588 if (!directBufferSupportInitializeEnded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4589 if (!initializeDirectBufferSupport(env, thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4590 ret = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4591 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4594
a61af66fc99e Initial load
duke
parents:
diff changeset
4595 if (buf == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4596 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4598
a61af66fc99e Initial load
duke
parents:
diff changeset
4599 if (!env->IsInstanceOf(buf, directBufferClass)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4600 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
4601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4602
a61af66fc99e Initial load
duke
parents:
diff changeset
4603 // NOTE that capacity is currently an int in the implementation
a61af66fc99e Initial load
duke
parents:
diff changeset
4604 ret = env->GetIntField(buf, bufferCapacityField);
a61af66fc99e Initial load
duke
parents:
diff changeset
4605 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
4606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4607
a61af66fc99e Initial load
duke
parents:
diff changeset
4608
a61af66fc99e Initial load
duke
parents:
diff changeset
4609 JNI_LEAF(jint, jni_GetVersion(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
4610 JNIWrapper("GetVersion");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4611 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4612 DTRACE_PROBE1(hotspot_jni, GetVersion__entry, env);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4613 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4614 HOTSPOT_JNI_GETVERSION_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4615 env);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4616 #endif /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4617 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4618 DTRACE_PROBE1(hotspot_jni, GetVersion__return, CurrentVersion);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4619 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4620 HOTSPOT_JNI_GETVERSION_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4621 CurrentVersion);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4622 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4623 return CurrentVersion;
a61af66fc99e Initial load
duke
parents:
diff changeset
4624 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4625
a61af66fc99e Initial load
duke
parents:
diff changeset
4626 extern struct JavaVM_ main_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
4627
a61af66fc99e Initial load
duke
parents:
diff changeset
4628 JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
a61af66fc99e Initial load
duke
parents:
diff changeset
4629 JNIWrapper("jni_GetJavaVM");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4630 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4631 DTRACE_PROBE2(hotspot_jni, GetJavaVM__entry, env, vm);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4632 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4633 HOTSPOT_JNI_GETJAVAVM_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4634 env, (void **) vm);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4635 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4636 *vm = (JavaVM *)(&main_vm);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4637 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4638 DTRACE_PROBE1(hotspot_jni, GetJavaVM__return, JNI_OK);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4639 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4640 HOTSPOT_JNI_GETJAVAVM_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4641 JNI_OK);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
4642 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4643 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
4644 JNI_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4645
a61af66fc99e Initial load
duke
parents:
diff changeset
4646 // Structure containing all jni functions
a61af66fc99e Initial load
duke
parents:
diff changeset
4647 struct JNINativeInterface_ jni_NativeInterface = {
a61af66fc99e Initial load
duke
parents:
diff changeset
4648 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
4649 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
4650 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
4651
a61af66fc99e Initial load
duke
parents:
diff changeset
4652 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
4653
a61af66fc99e Initial load
duke
parents:
diff changeset
4654 jni_GetVersion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4655
a61af66fc99e Initial load
duke
parents:
diff changeset
4656 jni_DefineClass,
a61af66fc99e Initial load
duke
parents:
diff changeset
4657 jni_FindClass,
a61af66fc99e Initial load
duke
parents:
diff changeset
4658
a61af66fc99e Initial load
duke
parents:
diff changeset
4659 jni_FromReflectedMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4660 jni_FromReflectedField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4661
a61af66fc99e Initial load
duke
parents:
diff changeset
4662 jni_ToReflectedMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4663
a61af66fc99e Initial load
duke
parents:
diff changeset
4664 jni_GetSuperclass,
a61af66fc99e Initial load
duke
parents:
diff changeset
4665 jni_IsAssignableFrom,
a61af66fc99e Initial load
duke
parents:
diff changeset
4666
a61af66fc99e Initial load
duke
parents:
diff changeset
4667 jni_ToReflectedField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4668
a61af66fc99e Initial load
duke
parents:
diff changeset
4669 jni_Throw,
a61af66fc99e Initial load
duke
parents:
diff changeset
4670 jni_ThrowNew,
a61af66fc99e Initial load
duke
parents:
diff changeset
4671 jni_ExceptionOccurred,
a61af66fc99e Initial load
duke
parents:
diff changeset
4672 jni_ExceptionDescribe,
a61af66fc99e Initial load
duke
parents:
diff changeset
4673 jni_ExceptionClear,
a61af66fc99e Initial load
duke
parents:
diff changeset
4674 jni_FatalError,
a61af66fc99e Initial load
duke
parents:
diff changeset
4675
a61af66fc99e Initial load
duke
parents:
diff changeset
4676 jni_PushLocalFrame,
a61af66fc99e Initial load
duke
parents:
diff changeset
4677 jni_PopLocalFrame,
a61af66fc99e Initial load
duke
parents:
diff changeset
4678
a61af66fc99e Initial load
duke
parents:
diff changeset
4679 jni_NewGlobalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
4680 jni_DeleteGlobalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
4681 jni_DeleteLocalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
4682 jni_IsSameObject,
a61af66fc99e Initial load
duke
parents:
diff changeset
4683
a61af66fc99e Initial load
duke
parents:
diff changeset
4684 jni_NewLocalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
4685 jni_EnsureLocalCapacity,
a61af66fc99e Initial load
duke
parents:
diff changeset
4686
a61af66fc99e Initial load
duke
parents:
diff changeset
4687 jni_AllocObject,
a61af66fc99e Initial load
duke
parents:
diff changeset
4688 jni_NewObject,
a61af66fc99e Initial load
duke
parents:
diff changeset
4689 jni_NewObjectV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4690 jni_NewObjectA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4691
a61af66fc99e Initial load
duke
parents:
diff changeset
4692 jni_GetObjectClass,
a61af66fc99e Initial load
duke
parents:
diff changeset
4693 jni_IsInstanceOf,
a61af66fc99e Initial load
duke
parents:
diff changeset
4694
a61af66fc99e Initial load
duke
parents:
diff changeset
4695 jni_GetMethodID,
a61af66fc99e Initial load
duke
parents:
diff changeset
4696
a61af66fc99e Initial load
duke
parents:
diff changeset
4697 jni_CallObjectMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4698 jni_CallObjectMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4699 jni_CallObjectMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4700 jni_CallBooleanMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4701 jni_CallBooleanMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4702 jni_CallBooleanMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4703 jni_CallByteMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4704 jni_CallByteMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4705 jni_CallByteMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4706 jni_CallCharMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4707 jni_CallCharMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4708 jni_CallCharMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4709 jni_CallShortMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4710 jni_CallShortMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4711 jni_CallShortMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4712 jni_CallIntMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4713 jni_CallIntMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4714 jni_CallIntMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4715 jni_CallLongMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4716 jni_CallLongMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4717 jni_CallLongMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4718 jni_CallFloatMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4719 jni_CallFloatMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4720 jni_CallFloatMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4721 jni_CallDoubleMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4722 jni_CallDoubleMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4723 jni_CallDoubleMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4724 jni_CallVoidMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4725 jni_CallVoidMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4726 jni_CallVoidMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4727
a61af66fc99e Initial load
duke
parents:
diff changeset
4728 jni_CallNonvirtualObjectMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4729 jni_CallNonvirtualObjectMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4730 jni_CallNonvirtualObjectMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4731 jni_CallNonvirtualBooleanMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4732 jni_CallNonvirtualBooleanMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4733 jni_CallNonvirtualBooleanMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4734 jni_CallNonvirtualByteMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4735 jni_CallNonvirtualByteMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4736 jni_CallNonvirtualByteMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4737 jni_CallNonvirtualCharMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4738 jni_CallNonvirtualCharMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4739 jni_CallNonvirtualCharMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4740 jni_CallNonvirtualShortMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4741 jni_CallNonvirtualShortMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4742 jni_CallNonvirtualShortMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4743 jni_CallNonvirtualIntMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4744 jni_CallNonvirtualIntMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4745 jni_CallNonvirtualIntMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4746 jni_CallNonvirtualLongMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4747 jni_CallNonvirtualLongMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4748 jni_CallNonvirtualLongMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4749 jni_CallNonvirtualFloatMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4750 jni_CallNonvirtualFloatMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4751 jni_CallNonvirtualFloatMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4752 jni_CallNonvirtualDoubleMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4753 jni_CallNonvirtualDoubleMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4754 jni_CallNonvirtualDoubleMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4755 jni_CallNonvirtualVoidMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4756 jni_CallNonvirtualVoidMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4757 jni_CallNonvirtualVoidMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4758
a61af66fc99e Initial load
duke
parents:
diff changeset
4759 jni_GetFieldID,
a61af66fc99e Initial load
duke
parents:
diff changeset
4760
a61af66fc99e Initial load
duke
parents:
diff changeset
4761 jni_GetObjectField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4762 jni_GetBooleanField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4763 jni_GetByteField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4764 jni_GetCharField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4765 jni_GetShortField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4766 jni_GetIntField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4767 jni_GetLongField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4768 jni_GetFloatField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4769 jni_GetDoubleField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4770
a61af66fc99e Initial load
duke
parents:
diff changeset
4771 jni_SetObjectField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4772 jni_SetBooleanField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4773 jni_SetByteField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4774 jni_SetCharField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4775 jni_SetShortField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4776 jni_SetIntField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4777 jni_SetLongField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4778 jni_SetFloatField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4779 jni_SetDoubleField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4780
a61af66fc99e Initial load
duke
parents:
diff changeset
4781 jni_GetStaticMethodID,
a61af66fc99e Initial load
duke
parents:
diff changeset
4782
a61af66fc99e Initial load
duke
parents:
diff changeset
4783 jni_CallStaticObjectMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4784 jni_CallStaticObjectMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4785 jni_CallStaticObjectMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4786 jni_CallStaticBooleanMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4787 jni_CallStaticBooleanMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4788 jni_CallStaticBooleanMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4789 jni_CallStaticByteMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4790 jni_CallStaticByteMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4791 jni_CallStaticByteMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4792 jni_CallStaticCharMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4793 jni_CallStaticCharMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4794 jni_CallStaticCharMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4795 jni_CallStaticShortMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4796 jni_CallStaticShortMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4797 jni_CallStaticShortMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4798 jni_CallStaticIntMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4799 jni_CallStaticIntMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4800 jni_CallStaticIntMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4801 jni_CallStaticLongMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4802 jni_CallStaticLongMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4803 jni_CallStaticLongMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4804 jni_CallStaticFloatMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4805 jni_CallStaticFloatMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4806 jni_CallStaticFloatMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4807 jni_CallStaticDoubleMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4808 jni_CallStaticDoubleMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4809 jni_CallStaticDoubleMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4810 jni_CallStaticVoidMethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
4811 jni_CallStaticVoidMethodV,
a61af66fc99e Initial load
duke
parents:
diff changeset
4812 jni_CallStaticVoidMethodA,
a61af66fc99e Initial load
duke
parents:
diff changeset
4813
a61af66fc99e Initial load
duke
parents:
diff changeset
4814 jni_GetStaticFieldID,
a61af66fc99e Initial load
duke
parents:
diff changeset
4815
a61af66fc99e Initial load
duke
parents:
diff changeset
4816 jni_GetStaticObjectField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4817 jni_GetStaticBooleanField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4818 jni_GetStaticByteField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4819 jni_GetStaticCharField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4820 jni_GetStaticShortField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4821 jni_GetStaticIntField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4822 jni_GetStaticLongField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4823 jni_GetStaticFloatField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4824 jni_GetStaticDoubleField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4825
a61af66fc99e Initial load
duke
parents:
diff changeset
4826 jni_SetStaticObjectField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4827 jni_SetStaticBooleanField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4828 jni_SetStaticByteField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4829 jni_SetStaticCharField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4830 jni_SetStaticShortField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4831 jni_SetStaticIntField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4832 jni_SetStaticLongField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4833 jni_SetStaticFloatField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4834 jni_SetStaticDoubleField,
a61af66fc99e Initial load
duke
parents:
diff changeset
4835
a61af66fc99e Initial load
duke
parents:
diff changeset
4836 jni_NewString,
a61af66fc99e Initial load
duke
parents:
diff changeset
4837 jni_GetStringLength,
a61af66fc99e Initial load
duke
parents:
diff changeset
4838 jni_GetStringChars,
a61af66fc99e Initial load
duke
parents:
diff changeset
4839 jni_ReleaseStringChars,
a61af66fc99e Initial load
duke
parents:
diff changeset
4840
a61af66fc99e Initial load
duke
parents:
diff changeset
4841 jni_NewStringUTF,
a61af66fc99e Initial load
duke
parents:
diff changeset
4842 jni_GetStringUTFLength,
a61af66fc99e Initial load
duke
parents:
diff changeset
4843 jni_GetStringUTFChars,
a61af66fc99e Initial load
duke
parents:
diff changeset
4844 jni_ReleaseStringUTFChars,
a61af66fc99e Initial load
duke
parents:
diff changeset
4845
a61af66fc99e Initial load
duke
parents:
diff changeset
4846 jni_GetArrayLength,
a61af66fc99e Initial load
duke
parents:
diff changeset
4847
a61af66fc99e Initial load
duke
parents:
diff changeset
4848 jni_NewObjectArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4849 jni_GetObjectArrayElement,
a61af66fc99e Initial load
duke
parents:
diff changeset
4850 jni_SetObjectArrayElement,
a61af66fc99e Initial load
duke
parents:
diff changeset
4851
a61af66fc99e Initial load
duke
parents:
diff changeset
4852 jni_NewBooleanArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4853 jni_NewByteArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4854 jni_NewCharArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4855 jni_NewShortArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4856 jni_NewIntArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4857 jni_NewLongArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4858 jni_NewFloatArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4859 jni_NewDoubleArray,
a61af66fc99e Initial load
duke
parents:
diff changeset
4860
a61af66fc99e Initial load
duke
parents:
diff changeset
4861 jni_GetBooleanArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4862 jni_GetByteArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4863 jni_GetCharArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4864 jni_GetShortArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4865 jni_GetIntArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4866 jni_GetLongArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4867 jni_GetFloatArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4868 jni_GetDoubleArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4869
a61af66fc99e Initial load
duke
parents:
diff changeset
4870 jni_ReleaseBooleanArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4871 jni_ReleaseByteArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4872 jni_ReleaseCharArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4873 jni_ReleaseShortArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4874 jni_ReleaseIntArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4875 jni_ReleaseLongArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4876 jni_ReleaseFloatArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4877 jni_ReleaseDoubleArrayElements,
a61af66fc99e Initial load
duke
parents:
diff changeset
4878
a61af66fc99e Initial load
duke
parents:
diff changeset
4879 jni_GetBooleanArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4880 jni_GetByteArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4881 jni_GetCharArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4882 jni_GetShortArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4883 jni_GetIntArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4884 jni_GetLongArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4885 jni_GetFloatArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4886 jni_GetDoubleArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4887
a61af66fc99e Initial load
duke
parents:
diff changeset
4888 jni_SetBooleanArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4889 jni_SetByteArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4890 jni_SetCharArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4891 jni_SetShortArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4892 jni_SetIntArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4893 jni_SetLongArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4894 jni_SetFloatArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4895 jni_SetDoubleArrayRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4896
a61af66fc99e Initial load
duke
parents:
diff changeset
4897 jni_RegisterNatives,
a61af66fc99e Initial load
duke
parents:
diff changeset
4898 jni_UnregisterNatives,
a61af66fc99e Initial load
duke
parents:
diff changeset
4899
a61af66fc99e Initial load
duke
parents:
diff changeset
4900 jni_MonitorEnter,
a61af66fc99e Initial load
duke
parents:
diff changeset
4901 jni_MonitorExit,
a61af66fc99e Initial load
duke
parents:
diff changeset
4902
a61af66fc99e Initial load
duke
parents:
diff changeset
4903 jni_GetJavaVM,
a61af66fc99e Initial load
duke
parents:
diff changeset
4904
a61af66fc99e Initial load
duke
parents:
diff changeset
4905 jni_GetStringRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4906 jni_GetStringUTFRegion,
a61af66fc99e Initial load
duke
parents:
diff changeset
4907
a61af66fc99e Initial load
duke
parents:
diff changeset
4908 jni_GetPrimitiveArrayCritical,
a61af66fc99e Initial load
duke
parents:
diff changeset
4909 jni_ReleasePrimitiveArrayCritical,
a61af66fc99e Initial load
duke
parents:
diff changeset
4910
a61af66fc99e Initial load
duke
parents:
diff changeset
4911 jni_GetStringCritical,
a61af66fc99e Initial load
duke
parents:
diff changeset
4912 jni_ReleaseStringCritical,
a61af66fc99e Initial load
duke
parents:
diff changeset
4913
a61af66fc99e Initial load
duke
parents:
diff changeset
4914 jni_NewWeakGlobalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
4915 jni_DeleteWeakGlobalRef,
a61af66fc99e Initial load
duke
parents:
diff changeset
4916
a61af66fc99e Initial load
duke
parents:
diff changeset
4917 jni_ExceptionCheck,
a61af66fc99e Initial load
duke
parents:
diff changeset
4918
a61af66fc99e Initial load
duke
parents:
diff changeset
4919 jni_NewDirectByteBuffer,
a61af66fc99e Initial load
duke
parents:
diff changeset
4920 jni_GetDirectBufferAddress,
a61af66fc99e Initial load
duke
parents:
diff changeset
4921 jni_GetDirectBufferCapacity,
a61af66fc99e Initial load
duke
parents:
diff changeset
4922
a61af66fc99e Initial load
duke
parents:
diff changeset
4923 // New 1_6 features
a61af66fc99e Initial load
duke
parents:
diff changeset
4924
a61af66fc99e Initial load
duke
parents:
diff changeset
4925 jni_GetObjectRefType
a61af66fc99e Initial load
duke
parents:
diff changeset
4926 };
a61af66fc99e Initial load
duke
parents:
diff changeset
4927
a61af66fc99e Initial load
duke
parents:
diff changeset
4928
a61af66fc99e Initial load
duke
parents:
diff changeset
4929 // For jvmti use to modify jni function table.
a61af66fc99e Initial load
duke
parents:
diff changeset
4930 // Java threads in native contiues to run until it is transitioned
a61af66fc99e Initial load
duke
parents:
diff changeset
4931 // to VM at safepoint. Before the transition or before it is blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
4932 // for safepoint it may access jni function table. VM could crash if
a61af66fc99e Initial load
duke
parents:
diff changeset
4933 // any java thread access the jni function table in the middle of memcpy.
a61af66fc99e Initial load
duke
parents:
diff changeset
4934 // To avoid this each function pointers are copied automically.
a61af66fc99e Initial load
duke
parents:
diff changeset
4935 void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4936 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
4937 intptr_t *a = (intptr_t *) jni_functions();
a61af66fc99e Initial load
duke
parents:
diff changeset
4938 intptr_t *b = (intptr_t *) new_jni_NativeInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
4939 for (uint i=0; i < sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4940 Atomic::store_ptr(*b++, a++);
a61af66fc99e Initial load
duke
parents:
diff changeset
4941 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4943
a61af66fc99e Initial load
duke
parents:
diff changeset
4944 void quicken_jni_functions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4945 // Replace Get<Primitive>Field with fast versions
a61af66fc99e Initial load
duke
parents:
diff changeset
4946 if (UseFastJNIAccessors && !JvmtiExport::can_post_field_access()
a61af66fc99e Initial load
duke
parents:
diff changeset
4947 && !VerifyJNIFields && !TraceJNICalls && !CountJNICalls && !CheckJNICalls
a61af66fc99e Initial load
duke
parents:
diff changeset
4948 #if defined(_WINDOWS) && defined(IA32) && defined(COMPILER2)
a61af66fc99e Initial load
duke
parents:
diff changeset
4949 // windows x86 currently needs SEH wrapper and the gain of the fast
a61af66fc99e Initial load
duke
parents:
diff changeset
4950 // versions currently isn't certain for server vm on uniprocessor.
a61af66fc99e Initial load
duke
parents:
diff changeset
4951 && os::is_MP()
a61af66fc99e Initial load
duke
parents:
diff changeset
4952 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
4953 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4954 address func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4955 func = JNI_FastGetField::generate_fast_get_boolean_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
4956 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4957 jni_NativeInterface.GetBooleanField = (GetBooleanField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4959 func = JNI_FastGetField::generate_fast_get_byte_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
4960 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4961 jni_NativeInterface.GetByteField = (GetByteField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4963 func = JNI_FastGetField::generate_fast_get_char_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
4964 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4965 jni_NativeInterface.GetCharField = (GetCharField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4966 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4967 func = JNI_FastGetField::generate_fast_get_short_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
4968 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4969 jni_NativeInterface.GetShortField = (GetShortField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4970 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4971 func = JNI_FastGetField::generate_fast_get_int_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
4972 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4973 jni_NativeInterface.GetIntField = (GetIntField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4975 func = JNI_FastGetField::generate_fast_get_long_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
4976 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4977 jni_NativeInterface.GetLongField = (GetLongField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4979 func = JNI_FastGetField::generate_fast_get_float_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
4980 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4981 jni_NativeInterface.GetFloatField = (GetFloatField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4983 func = JNI_FastGetField::generate_fast_get_double_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
4984 if (func != (address)-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4985 jni_NativeInterface.GetDoubleField = (GetDoubleField_t)func;
a61af66fc99e Initial load
duke
parents:
diff changeset
4986 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4987 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4989
a61af66fc99e Initial load
duke
parents:
diff changeset
4990 // Returns the function structure
a61af66fc99e Initial load
duke
parents:
diff changeset
4991 struct JNINativeInterface_* jni_functions() {
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
4992 #if INCLUDE_JNI_CHECK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4993 if (CheckJNICalls) return jni_functions_check();
6854
fb19af007ffc 7189254: Change makefiles for more flexibility to override defaults
jprovino
parents: 6725
diff changeset
4994 #endif // INCLUDE_JNI_CHECK
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4995 return &jni_NativeInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
4996 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4997
a61af66fc99e Initial load
duke
parents:
diff changeset
4998 // Returns the function structure
a61af66fc99e Initial load
duke
parents:
diff changeset
4999 struct JNINativeInterface_* jni_functions_nocheck() {
a61af66fc99e Initial load
duke
parents:
diff changeset
5000 return &jni_NativeInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
5001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5002
a61af66fc99e Initial load
duke
parents:
diff changeset
5003
a61af66fc99e Initial load
duke
parents:
diff changeset
5004 // Invocation API
a61af66fc99e Initial load
duke
parents:
diff changeset
5005
a61af66fc99e Initial load
duke
parents:
diff changeset
5006
a61af66fc99e Initial load
duke
parents:
diff changeset
5007 // Forward declaration
a61af66fc99e Initial load
duke
parents:
diff changeset
5008 extern const struct JNIInvokeInterface_ jni_InvokeInterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
5009
a61af66fc99e Initial load
duke
parents:
diff changeset
5010 // Global invocation API vars
a61af66fc99e Initial load
duke
parents:
diff changeset
5011 volatile jint vm_created = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
5012 // Indicate whether it is safe to recreate VM
a61af66fc99e Initial load
duke
parents:
diff changeset
5013 volatile jint safe_to_recreate_vm = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
5014 struct JavaVM_ main_vm = {&jni_InvokeInterface};
a61af66fc99e Initial load
duke
parents:
diff changeset
5015
a61af66fc99e Initial load
duke
parents:
diff changeset
5016
a61af66fc99e Initial load
duke
parents:
diff changeset
5017 #define JAVASTACKSIZE (400 * 1024) /* Default size of a thread java stack */
a61af66fc99e Initial load
duke
parents:
diff changeset
5018 enum { VERIFY_NONE, VERIFY_REMOTE, VERIFY_ALL };
a61af66fc99e Initial load
duke
parents:
diff changeset
5019
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5020 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5021 HS_DTRACE_PROBE_DECL1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, void*);
a61af66fc99e Initial load
duke
parents:
diff changeset
5022 DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5023 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5024 DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5025 , HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5026 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5027
a61af66fc99e Initial load
duke
parents:
diff changeset
5028 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5029 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5030 HS_DTRACE_PROBE1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, args_);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5031 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5032 HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5033 args_);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5034 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5035 JDK1_1InitArgs *args = (JDK1_1InitArgs *)args_;
a61af66fc99e Initial load
duke
parents:
diff changeset
5036 jint ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5037 DT_RETURN_MARK(GetDefaultJavaVMInitArgs, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
5038
a61af66fc99e Initial load
duke
parents:
diff changeset
5039 if (Threads::is_supported_jni_version(args->version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5040 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5041 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5042 // 1.1 style no longer supported in hotspot.
a61af66fc99e Initial load
duke
parents:
diff changeset
5043 // According the JNI spec, we should update args->version on return.
a61af66fc99e Initial load
duke
parents:
diff changeset
5044 // We also use the structure to communicate with launcher about default
a61af66fc99e Initial load
duke
parents:
diff changeset
5045 // stack size.
a61af66fc99e Initial load
duke
parents:
diff changeset
5046 if (args->version == JNI_VERSION_1_1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5047 args->version = JNI_VERSION_1_2;
a61af66fc99e Initial load
duke
parents:
diff changeset
5048 // javaStackSize is int in arguments structure
a61af66fc99e Initial load
duke
parents:
diff changeset
5049 assert(jlong(ThreadStackSize) * K < INT_MAX, "integer overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
5050 args->javaStackSize = (jint)(ThreadStackSize * K);
a61af66fc99e Initial load
duke
parents:
diff changeset
5051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5052 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5053 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5054
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5055 #ifndef PRODUCT
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5056
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5057 #include "gc_implementation/shared/gcTimer.hpp"
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5058 #include "gc_interface/collectedHeap.hpp"
10333
6702da6b6082 8014405: G1: PerRegionTable::fl_mem_size() calculates size of the free list using wrong element sizes
tschatzl
parents: 9060
diff changeset
5059 #if INCLUDE_ALL_GCS
6702da6b6082 8014405: G1: PerRegionTable::fl_mem_size() calculates size of the free list using wrong element sizes
tschatzl
parents: 9060
diff changeset
5060 #include "gc_implementation/g1/heapRegionRemSet.hpp"
6702da6b6082 8014405: G1: PerRegionTable::fl_mem_size() calculates size of the free list using wrong element sizes
tschatzl
parents: 9060
diff changeset
5061 #endif
20318
fa62fb12cdca 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 20262
diff changeset
5062 #include "memory/guardedMemory.hpp"
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5063 #include "utilities/quickSort.hpp"
12215
621eda7235d2 7164841: Improvements to the GC log file rotation
minqi
parents: 12111
diff changeset
5064 #include "utilities/ostream.hpp"
7171
7c15faa95ce7 8003879: Duplicate definitions in vmStructs
mikael
parents: 6985
diff changeset
5065 #if INCLUDE_VM_STRUCTS
7c15faa95ce7 8003879: Duplicate definitions in vmStructs
mikael
parents: 6985
diff changeset
5066 #include "runtime/vmStructs.hpp"
7c15faa95ce7 8003879: Duplicate definitions in vmStructs
mikael
parents: 6985
diff changeset
5067 #endif
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5068
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5069 #define run_unit_test(unit_test_function_call) \
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5070 tty->print_cr("Running test: " #unit_test_function_call); \
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5071 unit_test_function_call
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5072
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 11092
diff changeset
5073 // Forward declaration
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 11092
diff changeset
5074 void TestReservedSpace_test();
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 11092
diff changeset
5075 void TestReserveMemorySpecial_test();
12236
c4c768305a8f 8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents: 12111
diff changeset
5076 void TestVirtualSpace_test();
12306
03f493ce3a71 8025228: assert(new_entry->reserved_words() == vs_word_size) fails in nightly
brutisso
parents: 12305
diff changeset
5077 void TestMetaspaceAux_test();
12902
bdfbb1fb19ca 8026391: The Metachunk header wastes memory
stefank
parents: 12823
diff changeset
5078 void TestMetachunk_test();
12979
1d1ea10fe09f 8015255: NPG: Don't waste fragment at the end of a VirtualSpaceNode before retiring it.
mgerdin
parents: 12902
diff changeset
5079 void TestVirtualSpaceNode_test();
17898
1d01a7f3a336 8033426: Scale initial NewSize using NewRatio if not set on command line
sjohanss
parents: 17829
diff changeset
5080 void TestNewSize_test();
20262
76b588255908 8035746: Add missing Klass::oop_is_instanceClassLoader() function
stefank
parents: 20255
diff changeset
5081 void TestKlass_test();
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 20337
diff changeset
5082 void Test_linked_list();
17694
cc3f124c6eae 8035822: Unable to test minimalVM
jwilhelm
parents: 17685
diff changeset
5083 #if INCLUDE_ALL_GCS
17648
a034dc5e910b 8028391: Make the Min/MaxHeapFreeRatio flags manageable
jwilhelm
parents: 12979
diff changeset
5084 void TestOldFreeSpaceCalculation_test();
12305
a19bea467577 7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents: 12269
diff changeset
5085 void TestG1BiasedArray_test();
20255
02e61cf08ab3 8033764: Remove the usage of StarTask from BufferingOopClosure
stefank
parents: 20197
diff changeset
5086 void TestBufferingOopClosure_test();
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17704
diff changeset
5087 void TestCodeCacheRemSet_test();
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20324
diff changeset
5088 void FreeRegionList_test();
12305
a19bea467577 7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents: 12269
diff changeset
5089 #endif
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 11092
diff changeset
5090
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5091 void execute_internal_vm_tests() {
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5092 if (ExecuteInternalVMTests) {
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5093 tty->print_cr("Running internal VM tests");
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 11092
diff changeset
5094 run_unit_test(TestReservedSpace_test());
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 11092
diff changeset
5095 run_unit_test(TestReserveMemorySpecial_test());
12236
c4c768305a8f 8024638: Count and expose the amount of committed memory in the metaspaces
stefank
parents: 12111
diff changeset
5096 run_unit_test(TestVirtualSpace_test());
12306
03f493ce3a71 8025228: assert(new_entry->reserved_words() == vs_word_size) fails in nightly
brutisso
parents: 12305
diff changeset
5097 run_unit_test(TestMetaspaceAux_test());
12902
bdfbb1fb19ca 8026391: The Metachunk header wastes memory
stefank
parents: 12823
diff changeset
5098 run_unit_test(TestMetachunk_test());
12979
1d1ea10fe09f 8015255: NPG: Don't waste fragment at the end of a VirtualSpaceNode before retiring it.
mgerdin
parents: 12902
diff changeset
5099 run_unit_test(TestVirtualSpaceNode_test());
9060
cc32ccaaf47f 8003310: Enable -Wunused-function when compiling with gcc
mikael
parents: 8793
diff changeset
5100 run_unit_test(GlobalDefinitions::test_globals());
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5101 run_unit_test(GCTimerAllTest::all());
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5102 run_unit_test(arrayOopDesc::test_max_array_length());
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5103 run_unit_test(CollectedHeap::test_is_in());
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5104 run_unit_test(QuickSort::test_quick_sort());
20318
fa62fb12cdca 6311046: -Xcheck:jni should support checking of GetPrimitiveArrayCritical.
dsimms
parents: 20262
diff changeset
5105 run_unit_test(GuardedMemory::test_guarded_memory());
6162
e9140bf80b4a 7158800: Improve storage of symbol tables
coleenp
parents: 6125
diff changeset
5106 run_unit_test(AltHashing::test_alt_hash());
12215
621eda7235d2 7164841: Improvements to the GC log file rotation
minqi
parents: 12111
diff changeset
5107 run_unit_test(test_loggc_filename());
17898
1d01a7f3a336 8033426: Scale initial NewSize using NewRatio if not set on command line
sjohanss
parents: 17829
diff changeset
5108 run_unit_test(TestNewSize_test());
20262
76b588255908 8035746: Add missing Klass::oop_is_instanceClassLoader() function
stefank
parents: 20255
diff changeset
5109 run_unit_test(TestKlass_test());
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 20337
diff changeset
5110 run_unit_test(Test_linked_list());
7171
7c15faa95ce7 8003879: Duplicate definitions in vmStructs
mikael
parents: 6985
diff changeset
5111 #if INCLUDE_VM_STRUCTS
7c15faa95ce7 8003879: Duplicate definitions in vmStructs
mikael
parents: 6985
diff changeset
5112 run_unit_test(VMStructs::test());
7c15faa95ce7 8003879: Duplicate definitions in vmStructs
mikael
parents: 6985
diff changeset
5113 #endif
10333
6702da6b6082 8014405: G1: PerRegionTable::fl_mem_size() calculates size of the free list using wrong element sizes
tschatzl
parents: 9060
diff changeset
5114 #if INCLUDE_ALL_GCS
17694
cc3f124c6eae 8035822: Unable to test minimalVM
jwilhelm
parents: 17685
diff changeset
5115 run_unit_test(TestOldFreeSpaceCalculation_test());
12305
a19bea467577 7163191: G1: introduce a "heap spanning table" abstraction
tschatzl
parents: 12269
diff changeset
5116 run_unit_test(TestG1BiasedArray_test());
10333
6702da6b6082 8014405: G1: PerRegionTable::fl_mem_size() calculates size of the free list using wrong element sizes
tschatzl
parents: 9060
diff changeset
5117 run_unit_test(HeapRegionRemSet::test_prt());
20255
02e61cf08ab3 8033764: Remove the usage of StarTask from BufferingOopClosure
stefank
parents: 20197
diff changeset
5118 run_unit_test(TestBufferingOopClosure_test());
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17704
diff changeset
5119 run_unit_test(TestCodeCacheRemSet_test());
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20324
diff changeset
5120 if (UseG1GC) {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20324
diff changeset
5121 run_unit_test(FreeRegionList_test());
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20324
diff changeset
5122 }
10333
6702da6b6082 8014405: G1: PerRegionTable::fl_mem_size() calculates size of the free list using wrong element sizes
tschatzl
parents: 9060
diff changeset
5123 #endif
4070
6fd81579526f 7102044: G1: VM crashes with assert(old_end != new_end) failed: don't call this otherwise
brutisso
parents: 4006
diff changeset
5124 tty->print_cr("All internal VM tests passed");
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5125 }
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5126 }
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5127
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5128 #undef run_unit_test
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4070
diff changeset
5129
3779
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5130 #endif
04760e41b01e 7016112: CMS: crash during promotion testing
brutisso
parents: 3249
diff changeset
5131
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5132 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5133 HS_DTRACE_PROBE_DECL3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
5134 DT_RETURN_MARK_DECL(CreateJavaVM, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5135 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5136 DT_RETURN_MARK_DECL(CreateJavaVM, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5137 , HOTSPOT_JNI_CREATEJAVAVM_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5138 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5139
a61af66fc99e Initial load
duke
parents:
diff changeset
5140 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5141 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5142 HS_DTRACE_PROBE3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5143 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5144 HOTSPOT_JNI_CREATEJAVAVM_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5145 (void **) vm, penv, args);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5146 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5147
a61af66fc99e Initial load
duke
parents:
diff changeset
5148 jint result = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5149 DT_RETURN_MARK(CreateJavaVM, jint, (const jint&)result);
a61af66fc99e Initial load
duke
parents:
diff changeset
5150
1078
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5151 // We're about to use Atomic::xchg for synchronization. Some Zero
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5152 // platforms use the GCC builtin __sync_lock_test_and_set for this,
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5153 // 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
5154 // on all architectures. So we check it works before relying on it.
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5155 #if defined(ZERO) && defined(ASSERT)
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5156 {
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5157 jint a = 0xcafebabe;
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5158 jint b = Atomic::xchg(0xdeadbeef, &a);
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5159 void *c = &a;
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5160 void *d = Atomic::xchg_ptr(&b, &c);
1132
896da934748c 6913869: Zero assert fix
twisti
parents: 1078
diff changeset
5161 assert(a == (jint) 0xdeadbeef && b == (jint) 0xcafebabe, "Atomic::xchg() works");
1078
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5162 assert(c == &b && d == &a, "Atomic::xchg_ptr() works");
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5163 }
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5164 #endif // ZERO && ASSERT
8e7adf982378 6896043: first round of zero fixes
twisti
parents: 1034
diff changeset
5165
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5166 // At the moment it's only possible to have one Java VM,
a61af66fc99e Initial load
duke
parents:
diff changeset
5167 // since some of the runtime state is in global variables.
a61af66fc99e Initial load
duke
parents:
diff changeset
5168
a61af66fc99e Initial load
duke
parents:
diff changeset
5169 // We cannot use our mutex locks here, since they only work on
a61af66fc99e Initial load
duke
parents:
diff changeset
5170 // Threads. We do an atomic compare and exchange to ensure only
a61af66fc99e Initial load
duke
parents:
diff changeset
5171 // one thread can call this method at a time
a61af66fc99e Initial load
duke
parents:
diff changeset
5172
a61af66fc99e Initial load
duke
parents:
diff changeset
5173 // We use Atomic::xchg rather than Atomic::add/dec since on some platforms
a61af66fc99e Initial load
duke
parents:
diff changeset
5174 // the add/dec implementations are dependent on whether we are running
a61af66fc99e Initial load
duke
parents:
diff changeset
5175 // on a multiprocessor, and at this stage of initialization the os::is_MP
a61af66fc99e Initial load
duke
parents:
diff changeset
5176 // function used to determine this will always return false. Atomic::xchg
a61af66fc99e Initial load
duke
parents:
diff changeset
5177 // does not have this problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
5178 if (Atomic::xchg(1, &vm_created) == 1) {
11089
f323bbb0e6c1 8019833: Wrong JNI error code for preexisting JVM
coleenp
parents: 11059
diff changeset
5179 return JNI_EEXIST; // already created, or create attempt in progress
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5181 if (Atomic::xchg(0, &safe_to_recreate_vm) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5182 return JNI_ERR; // someone tried and failed and retry not allowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
5183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5184
a61af66fc99e Initial load
duke
parents:
diff changeset
5185 assert(vm_created == 1, "vm_created is true during the creation");
a61af66fc99e Initial load
duke
parents:
diff changeset
5186
a61af66fc99e Initial load
duke
parents:
diff changeset
5187 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
5188 * Certain errors during initialization are recoverable and do not
a61af66fc99e Initial load
duke
parents:
diff changeset
5189 * prevent this method from being called again at a later time
a61af66fc99e Initial load
duke
parents:
diff changeset
5190 * (perhaps with different arguments). However, at a certain
a61af66fc99e Initial load
duke
parents:
diff changeset
5191 * point during initialization if an error occurs we cannot allow
a61af66fc99e Initial load
duke
parents:
diff changeset
5192 * this function to be called again (or it will crash). In those
a61af66fc99e Initial load
duke
parents:
diff changeset
5193 * situations, the 'canTryAgain' flag is set to false, which atomically
a61af66fc99e Initial load
duke
parents:
diff changeset
5194 * sets safe_to_recreate_vm to 1, such that any new call to
a61af66fc99e Initial load
duke
parents:
diff changeset
5195 * JNI_CreateJavaVM will immediately fail using the above logic.
a61af66fc99e Initial load
duke
parents:
diff changeset
5196 */
a61af66fc99e Initial load
duke
parents:
diff changeset
5197 bool can_try_again = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
5198
a61af66fc99e Initial load
duke
parents:
diff changeset
5199 result = Threads::create_vm((JavaVMInitArgs*) args, &can_try_again);
a61af66fc99e Initial load
duke
parents:
diff changeset
5200 if (result == JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5201 JavaThread *thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
5202 /* thread is thread_in_vm here */
a61af66fc99e Initial load
duke
parents:
diff changeset
5203 *vm = (JavaVM *)(&main_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
5204 *(JNIEnv**)penv = thread->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
5205
a61af66fc99e Initial load
duke
parents:
diff changeset
5206 // Tracks the time application was running before GC
a61af66fc99e Initial load
duke
parents:
diff changeset
5207 RuntimeService::record_application_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
5208
a61af66fc99e Initial load
duke
parents:
diff changeset
5209 // Notify JVMTI
a61af66fc99e Initial load
duke
parents:
diff changeset
5210 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5211 JvmtiExport::post_thread_start(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
5212 }
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4708
diff changeset
5213
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5214 EventThreadStart event;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5215 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5216 event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5217 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5218 }
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4708
diff changeset
5219
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5220 #ifndef PRODUCT
17829
0118c8c7b80f 8038633: crash in VM_Version::get_processor_features() on startup
kvn
parents: 17753
diff changeset
5221 #ifndef CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5222 #define CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED(f) f()
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5223 #endif
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5224
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5225 // Check if we should compile all classes on bootclasspath
11092
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5226 if (CompileTheWorld) ClassLoader::compile_the_world();
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5227 if (ReplayCompiles) ciReplay::replay(thread);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5228
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5229 // Some platforms (like Win*) need a wrapper around these test
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5230 // functions in order to properly handle error conditions.
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5231 CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED(test_error_handler);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5232 CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED(execute_internal_vm_tests);
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5233 #endif
59b052799158 8015884: runThese crashed with SIGSEGV, hs_err has an error instead of stacktrace
dcubed
parents: 11089
diff changeset
5234
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5235 // Since this is not a JVM_ENTRY we have to set the thread state manually before leaving.
a61af66fc99e Initial load
duke
parents:
diff changeset
5236 ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
5237 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
5238 if (can_try_again) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5239 // reset safe_to_recreate_vm to 1 so that retrial would be possible
a61af66fc99e Initial load
duke
parents:
diff changeset
5240 safe_to_recreate_vm = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
5241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5242
a61af66fc99e Initial load
duke
parents:
diff changeset
5243 // Creation failed. We must reset vm_created
a61af66fc99e Initial load
duke
parents:
diff changeset
5244 *vm = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
5245 *(JNIEnv**)penv = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
5246 // reset vm_created last to avoid race condition. Use OrderAccess to
a61af66fc99e Initial load
duke
parents:
diff changeset
5247 // control both compiler and architectural-based reordering.
a61af66fc99e Initial load
duke
parents:
diff changeset
5248 OrderAccess::release_store(&vm_created, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
5249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5250
a61af66fc99e Initial load
duke
parents:
diff changeset
5251 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
5252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5253
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5254 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5255 HS_DTRACE_PROBE_DECL3(hotspot_jni, GetCreatedJavaVMs__entry, \
a61af66fc99e Initial load
duke
parents:
diff changeset
5256 JavaVM**, jsize, jsize*);
a61af66fc99e Initial load
duke
parents:
diff changeset
5257 HS_DTRACE_PROBE_DECL1(hotspot_jni, GetCreatedJavaVMs__return, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5258 #endif /* !USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5259
a61af66fc99e Initial load
duke
parents:
diff changeset
5260 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetCreatedJavaVMs(JavaVM **vm_buf, jsize bufLen, jsize *numVMs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5261 // See bug 4367188, the wrapper can sometimes cause VM crashes
a61af66fc99e Initial load
duke
parents:
diff changeset
5262 // JNIWrapper("GetCreatedJavaVMs");
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5263 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5264 HS_DTRACE_PROBE3(hotspot_jni, GetCreatedJavaVMs__entry, \
a61af66fc99e Initial load
duke
parents:
diff changeset
5265 vm_buf, bufLen, numVMs);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5266 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5267 HOTSPOT_JNI_GETCREATEDJAVAVMS_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5268 (void **) vm_buf, bufLen, (uintptr_t *) numVMs);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5269 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5270 if (vm_created) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5271 if (numVMs != NULL) *numVMs = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
5272 if (bufLen > 0) *vm_buf = (JavaVM *)(&main_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
5273 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
5274 if (numVMs != NULL) *numVMs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
5275 }
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5276 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5277 HS_DTRACE_PROBE1(hotspot_jni, GetCreatedJavaVMs__return, JNI_OK);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5278 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5279 HOTSPOT_JNI_GETCREATEDJAVAVMS_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5280 JNI_OK);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5281 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5282 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5284
a61af66fc99e Initial load
duke
parents:
diff changeset
5285 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
5286
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5287 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5288 DT_RETURN_MARK_DECL(DestroyJavaVM, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5289 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5290 DT_RETURN_MARK_DECL(DestroyJavaVM, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5291 , HOTSPOT_JNI_DESTROYJAVAVM_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5292 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5293
a61af66fc99e Initial load
duke
parents:
diff changeset
5294 jint JNICALL jni_DestroyJavaVM(JavaVM *vm) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5295 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5296 DTRACE_PROBE1(hotspot_jni, DestroyJavaVM__entry, vm);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5297 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5298 HOTSPOT_JNI_DESTROYJAVAVM_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5299 vm);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5300 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5301 jint res = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5302 DT_RETURN_MARK(DestroyJavaVM, jint, (const jint&)res);
a61af66fc99e Initial load
duke
parents:
diff changeset
5303
a61af66fc99e Initial load
duke
parents:
diff changeset
5304 if (!vm_created) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5305 res = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5306 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
5307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5308
a61af66fc99e Initial load
duke
parents:
diff changeset
5309 JNIWrapper("DestroyJavaVM");
a61af66fc99e Initial load
duke
parents:
diff changeset
5310 JNIEnv *env;
a61af66fc99e Initial load
duke
parents:
diff changeset
5311 JavaVMAttachArgs destroyargs;
a61af66fc99e Initial load
duke
parents:
diff changeset
5312 destroyargs.version = CurrentVersion;
a61af66fc99e Initial load
duke
parents:
diff changeset
5313 destroyargs.name = (char *)"DestroyJavaVM";
a61af66fc99e Initial load
duke
parents:
diff changeset
5314 destroyargs.group = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
5315 res = vm->AttachCurrentThread((void **)&env, (void *)&destroyargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
5316 if (res != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5317 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
5318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5319
a61af66fc99e Initial load
duke
parents:
diff changeset
5320 // Since this is not a JVM_ENTRY we have to set the thread state manually before entering.
a61af66fc99e Initial load
duke
parents:
diff changeset
5321 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
5322 ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
5323 if (Threads::destroy_vm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5324 // Should not change thread state, VM is gone
a61af66fc99e Initial load
duke
parents:
diff changeset
5325 vm_created = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
5326 res = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5327 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
5328 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
5329 ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
5330 res = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5331 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
5332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5334
a61af66fc99e Initial load
duke
parents:
diff changeset
5335
a61af66fc99e Initial load
duke
parents:
diff changeset
5336 static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool daemon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5337 JavaVMAttachArgs *args = (JavaVMAttachArgs *) _args;
a61af66fc99e Initial load
duke
parents:
diff changeset
5338
a61af66fc99e Initial load
duke
parents:
diff changeset
5339 // Check below commented out from JDK1.2fcs as well
a61af66fc99e Initial load
duke
parents:
diff changeset
5340 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
5341 if (args && (args->version != JNI_VERSION_1_1 || args->version != JNI_VERSION_1_2)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5342 return JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
5343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5344 */
a61af66fc99e Initial load
duke
parents:
diff changeset
5345
a61af66fc99e Initial load
duke
parents:
diff changeset
5346 Thread* t = ThreadLocalStorage::get_thread_slow();
a61af66fc99e Initial load
duke
parents:
diff changeset
5347 if (t != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5348 // If the thread has been attached this operation is a no-op
a61af66fc99e Initial load
duke
parents:
diff changeset
5349 *(JNIEnv**)penv = ((JavaThread*) t)->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
5350 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5352
a61af66fc99e Initial load
duke
parents:
diff changeset
5353 // Create a thread and mark it as attaching so it will be skipped by the
a61af66fc99e Initial load
duke
parents:
diff changeset
5354 // ThreadsListEnumerator - see CR 6404306
a61af66fc99e Initial load
duke
parents:
diff changeset
5355 JavaThread* thread = new JavaThread(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
5356
a61af66fc99e Initial load
duke
parents:
diff changeset
5357 // Set correct safepoint info. The thread is going to call into Java when
a61af66fc99e Initial load
duke
parents:
diff changeset
5358 // initializing the Java level thread object. Hence, the correct state must
a61af66fc99e Initial load
duke
parents:
diff changeset
5359 // be set in order for the Safepoint code to deal with it correctly.
a61af66fc99e Initial load
duke
parents:
diff changeset
5360 thread->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
5361 // Must do this before initialize_thread_local_storage
a61af66fc99e Initial load
duke
parents:
diff changeset
5362 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
5363
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5364 thread->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
5365
a61af66fc99e Initial load
duke
parents:
diff changeset
5366 if (!os::create_attached_thread(thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5367 delete thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
5368 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5369 }
1290
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1142
diff changeset
5370 // Enable stack overflow checks
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1142
diff changeset
5371 thread->create_stack_guard_pages();
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1142
diff changeset
5372
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5373 thread->initialize_tlab();
a61af66fc99e Initial load
duke
parents:
diff changeset
5374
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
5375 thread->cache_global_variables();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
5376
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5377 // Crucial that we do not have a safepoint check for this thread, since it has
a61af66fc99e Initial load
duke
parents:
diff changeset
5378 // not been added to the Thread list yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
5379 { Threads_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
5380 // This must be inside this lock in order to get FullGCALot to work properly, i.e., to
a61af66fc99e Initial load
duke
parents:
diff changeset
5381 // avoid this thread trying to do a GC before it is added to the thread-list
a61af66fc99e Initial load
duke
parents:
diff changeset
5382 thread->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
5383 Threads::add(thread, daemon);
a61af66fc99e Initial load
duke
parents:
diff changeset
5384 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
5385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5386 // Create thread group and name info from attach arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
5387 oop group = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
5388 char* thread_name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
5389 if (args != NULL && Threads::is_supported_jni_version(args->version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5390 group = JNIHandles::resolve(args->group);
a61af66fc99e Initial load
duke
parents:
diff changeset
5391 thread_name = args->name; // may be NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
5392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5393 if (group == NULL) group = Universe::main_thread_group();
a61af66fc99e Initial load
duke
parents:
diff changeset
5394
a61af66fc99e Initial load
duke
parents:
diff changeset
5395 // Create Java level thread object and attach it to this thread
a61af66fc99e Initial load
duke
parents:
diff changeset
5396 bool attach_failed = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
5397 {
a61af66fc99e Initial load
duke
parents:
diff changeset
5398 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5399 HandleMark hm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
5400 Handle thread_group(THREAD, group);
a61af66fc99e Initial load
duke
parents:
diff changeset
5401 thread->allocate_threadObj(thread_group, thread_name, daemon, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
5402 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5403 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
5404 // cleanup outside the handle mark.
a61af66fc99e Initial load
duke
parents:
diff changeset
5405 attach_failed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
5406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5408
a61af66fc99e Initial load
duke
parents:
diff changeset
5409 if (attach_failed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5410 // Added missing cleanup
a61af66fc99e Initial load
duke
parents:
diff changeset
5411 thread->cleanup_failed_attach_current_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
5412 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5414
a61af66fc99e Initial load
duke
parents:
diff changeset
5415 // mark the thread as no longer attaching
a61af66fc99e Initial load
duke
parents:
diff changeset
5416 // this uses a fence to push the change through so we don't have
a61af66fc99e Initial load
duke
parents:
diff changeset
5417 // to regrab the threads_lock
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5418 thread->set_done_attaching_via_jni();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5419
a61af66fc99e Initial load
duke
parents:
diff changeset
5420 // Set java thread status.
a61af66fc99e Initial load
duke
parents:
diff changeset
5421 java_lang_Thread::set_thread_status(thread->threadObj(),
a61af66fc99e Initial load
duke
parents:
diff changeset
5422 java_lang_Thread::RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
5423
a61af66fc99e Initial load
duke
parents:
diff changeset
5424 // Notify the debugger
a61af66fc99e Initial load
duke
parents:
diff changeset
5425 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5426 JvmtiExport::post_thread_start(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
5427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5428
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5429 EventThreadStart event;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5430 if (event.should_commit()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5431 event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5432 event.commit();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10333
diff changeset
5433 }
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4708
diff changeset
5434
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5435 *(JNIEnv**)penv = thread->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
5436
a61af66fc99e Initial load
duke
parents:
diff changeset
5437 // Now leaving the VM, so change thread_state. This is normally automatically taken care
a61af66fc99e Initial load
duke
parents:
diff changeset
5438 // 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
5439 // using ThreadStateTransition::transition, we do a callback to the safepoint code if
a61af66fc99e Initial load
duke
parents:
diff changeset
5440 // needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
5441
a61af66fc99e Initial load
duke
parents:
diff changeset
5442 ThreadStateTransition::transition_and_fence(thread, _thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
5443
a61af66fc99e Initial load
duke
parents:
diff changeset
5444 // Perform any platform dependent FPU setup
a61af66fc99e Initial load
duke
parents:
diff changeset
5445 os::setup_fpu();
a61af66fc99e Initial load
duke
parents:
diff changeset
5446
a61af66fc99e Initial load
duke
parents:
diff changeset
5447 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5449
a61af66fc99e Initial load
duke
parents:
diff changeset
5450
a61af66fc99e Initial load
duke
parents:
diff changeset
5451 jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void *_args) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5452 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5453 DTRACE_PROBE3(hotspot_jni, AttachCurrentThread__entry, vm, penv, _args);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5454 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5455 HOTSPOT_JNI_ATTACHCURRENTTHREAD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5456 vm, penv, _args);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5457 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5458 if (!vm_created) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5459 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5460 DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, JNI_ERR);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5461 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5462 HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5463 (uint32_t) JNI_ERR);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5464 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5465 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5467
a61af66fc99e Initial load
duke
parents:
diff changeset
5468 JNIWrapper("AttachCurrentThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
5469 jint ret = attach_current_thread(vm, penv, _args, false);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5470 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5471 DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5472 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5473 HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5474 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5475 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5476 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5478
a61af66fc99e Initial load
duke
parents:
diff changeset
5479
a61af66fc99e Initial load
duke
parents:
diff changeset
5480 jint JNICALL jni_DetachCurrentThread(JavaVM *vm) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5481 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5482 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__entry, vm);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5483 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5484 HOTSPOT_JNI_DETACHCURRENTTHREAD_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5485 vm);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5486 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5487 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
5488
a61af66fc99e Initial load
duke
parents:
diff changeset
5489 JNIWrapper("DetachCurrentThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
5490
a61af66fc99e Initial load
duke
parents:
diff changeset
5491 // If the thread has been deattacted the operations is a no-op
a61af66fc99e Initial load
duke
parents:
diff changeset
5492 if (ThreadLocalStorage::thread() == NULL) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5493 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5494 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5495 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5496 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5497 JNI_OK);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5498 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5499 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5501
a61af66fc99e Initial load
duke
parents:
diff changeset
5502 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
5503 if (thread->has_last_Java_frame()) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5504 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5505 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_ERR);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5506 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5507 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5508 (uint32_t) JNI_ERR);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5509 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5510 // Can't detach a thread that's running java, that can't work.
a61af66fc99e Initial load
duke
parents:
diff changeset
5511 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5513
a61af66fc99e Initial load
duke
parents:
diff changeset
5514 // Safepoint support. Have to do call-back to safepoint code, if in the
a61af66fc99e Initial load
duke
parents:
diff changeset
5515 // middel of a safepoint operation
a61af66fc99e Initial load
duke
parents:
diff changeset
5516 ThreadStateTransition::transition_from_native(thread, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
5517
a61af66fc99e Initial load
duke
parents:
diff changeset
5518 // XXX: Note that JavaThread::exit() call below removes the guards on the
a61af66fc99e Initial load
duke
parents:
diff changeset
5519 // stack pages set up via enable_stack_{red,yellow}_zone() calls
a61af66fc99e Initial load
duke
parents:
diff changeset
5520 // above in jni_AttachCurrentThread. Unfortunately, while the setting
a61af66fc99e Initial load
duke
parents:
diff changeset
5521 // of the guards is visible in jni_AttachCurrentThread above,
a61af66fc99e Initial load
duke
parents:
diff changeset
5522 // the removal of the guards is buried below in JavaThread::exit()
a61af66fc99e Initial load
duke
parents:
diff changeset
5523 // here. The abstraction should be more symmetrically either exposed
a61af66fc99e Initial load
duke
parents:
diff changeset
5524 // or hidden (e.g. it could probably be hidden in the same
a61af66fc99e Initial load
duke
parents:
diff changeset
5525 // (platform-dependent) methods where we do alternate stack
a61af66fc99e Initial load
duke
parents:
diff changeset
5526 // maintenance work?)
a61af66fc99e Initial load
duke
parents:
diff changeset
5527 thread->exit(false, JavaThread::jni_detach);
a61af66fc99e Initial load
duke
parents:
diff changeset
5528 delete thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
5529
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5530 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5531 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5532 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5533 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5534 JNI_OK);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5535 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5536 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5538
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5539 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5540 DT_RETURN_MARK_DECL(GetEnv, jint);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5541 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5542 DT_RETURN_MARK_DECL(GetEnv, jint
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5543 , HOTSPOT_JNI_GETENV_RETURN(_ret_ref));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5544 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5545
a61af66fc99e Initial load
duke
parents:
diff changeset
5546 jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5547 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5548 DTRACE_PROBE3(hotspot_jni, GetEnv__entry, vm, penv, version);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5549 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5550 HOTSPOT_JNI_GETENV_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5551 vm, penv, version);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5552 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5553 jint ret = JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5554 DT_RETURN_MARK(GetEnv, jint, (const jint&)ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
5555
a61af66fc99e Initial load
duke
parents:
diff changeset
5556 if (!vm_created) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5557 *penv = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
5558 ret = JNI_EDETACHED;
a61af66fc99e Initial load
duke
parents:
diff changeset
5559 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5561
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 4708
diff changeset
5562 if (JniExportedInterface::GetExportedInterface(vm, penv, version, &ret)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5563 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5565
a61af66fc99e Initial load
duke
parents:
diff changeset
5566 #ifndef JVMPI_VERSION_1
a61af66fc99e Initial load
duke
parents:
diff changeset
5567 // need these in order to be polite about older agents
a61af66fc99e Initial load
duke
parents:
diff changeset
5568 #define JVMPI_VERSION_1 ((jint)0x10000001)
a61af66fc99e Initial load
duke
parents:
diff changeset
5569 #define JVMPI_VERSION_1_1 ((jint)0x10000002)
a61af66fc99e Initial load
duke
parents:
diff changeset
5570 #define JVMPI_VERSION_1_2 ((jint)0x10000003)
a61af66fc99e Initial load
duke
parents:
diff changeset
5571 #endif // !JVMPI_VERSION_1
a61af66fc99e Initial load
duke
parents:
diff changeset
5572
a61af66fc99e Initial load
duke
parents:
diff changeset
5573 Thread* thread = ThreadLocalStorage::thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
5574 if (thread != NULL && thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5575 if (Threads::is_supported_jni_version_including_1_1(version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5576 *(JNIEnv**)penv = ((JavaThread*) thread)->jni_environment();
a61af66fc99e Initial load
duke
parents:
diff changeset
5577 ret = JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
5578 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5579
a61af66fc99e Initial load
duke
parents:
diff changeset
5580 } else if (version == JVMPI_VERSION_1 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
5581 version == JVMPI_VERSION_1_1 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
5582 version == JVMPI_VERSION_1_2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5583 tty->print_cr("ERROR: JVMPI, an experimental interface, is no longer supported.");
a61af66fc99e Initial load
duke
parents:
diff changeset
5584 tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
a61af66fc99e Initial load
duke
parents:
diff changeset
5585 ret = JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
5586 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5587 } else if (JvmtiExport::is_jvmdi_version(version)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
5588 tty->print_cr("FATAL ERROR: JVMDI is no longer supported.");
a61af66fc99e Initial load
duke
parents:
diff changeset
5589 tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
a61af66fc99e Initial load
duke
parents:
diff changeset
5590 ret = JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
5591 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5592 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
5593 *penv = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
5594 ret = JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
5595 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5597 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
5598 *penv = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
5599 ret = JNI_EDETACHED;
a61af66fc99e Initial load
duke
parents:
diff changeset
5600 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5603
a61af66fc99e Initial load
duke
parents:
diff changeset
5604
a61af66fc99e Initial load
duke
parents:
diff changeset
5605 jint JNICALL jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *_args) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5606 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5607 DTRACE_PROBE3(hotspot_jni, AttachCurrentThreadAsDaemon__entry, vm, penv, _args);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5608 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5609 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_ENTRY(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5610 vm, penv, _args);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5611 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5612 if (!vm_created) {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5613 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5614 DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, JNI_ERR);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5615 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5616 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5617 (uint32_t) JNI_ERR);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5618 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5619 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
5620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5621
a61af66fc99e Initial load
duke
parents:
diff changeset
5622 JNIWrapper("AttachCurrentThreadAsDaemon");
a61af66fc99e Initial load
duke
parents:
diff changeset
5623 jint ret = attach_current_thread(vm, penv, _args, true);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5624 #ifndef USDT2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5625 DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, ret);
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5626 #else /* USDT2 */
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5627 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN(
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5628 ret);
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
5629 #endif /* USDT2 */
0
a61af66fc99e Initial load
duke
parents:
diff changeset
5630 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
5631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
5632
a61af66fc99e Initial load
duke
parents:
diff changeset
5633
a61af66fc99e Initial load
duke
parents:
diff changeset
5634 } // End extern "C"
a61af66fc99e Initial load
duke
parents:
diff changeset
5635
a61af66fc99e Initial load
duke
parents:
diff changeset
5636 const struct JNIInvokeInterface_ jni_InvokeInterface = {
a61af66fc99e Initial load
duke
parents:
diff changeset
5637 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
5638 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
5639 NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
5640
a61af66fc99e Initial load
duke
parents:
diff changeset
5641 jni_DestroyJavaVM,
a61af66fc99e Initial load
duke
parents:
diff changeset
5642 jni_AttachCurrentThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
5643 jni_DetachCurrentThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
5644 jni_GetEnv,
a61af66fc99e Initial load
duke
parents:
diff changeset
5645 jni_AttachCurrentThreadAsDaemon
a61af66fc99e Initial load
duke
parents:
diff changeset
5646 };