annotate src/share/vm/prims/jvm.cpp @ 452:00b023ae2d78

6722113: CMS: Incorrect overflow handling during precleaning of Reference lists Summary: When we encounter marking stack overflow during precleaning of Reference lists, we were using the overflow list mechanism, which can cause problems on account of mutating the mark word of the header because of conflicts with mutator accesses and updates of that field. Instead we should use the usual mechanism for overflow handling in concurrent phases, namely dirtying of the card on which the overflowed object lies. Since precleaning effectively does a form of discovered list processing, albeit with discovery enabled, we needed to adjust some code to be correct in the face of interleaved processing and discovery. Reviewed-by: apetrusenko, jcoomes
author ysr
date Thu, 20 Nov 2008 12:27:41 -0800
parents a45484ea312d
children 2328d1d3f8cf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 116
diff changeset
2 * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_jvm.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27 #include <errno.h>
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
30 NOTE about use of any ctor or function call that can trigger a safepoint/GC:
a61af66fc99e Initial load
duke
parents:
diff changeset
31 such ctors and calls MUST NOT come between an oop declaration/init and its
a61af66fc99e Initial load
duke
parents:
diff changeset
32 usage because if objects are move this may cause various memory stomps, bus
a61af66fc99e Initial load
duke
parents:
diff changeset
33 errors and segfaults. Here is a cookbook for causing so called "naked oop
a61af66fc99e Initial load
duke
parents:
diff changeset
34 failures":
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields<etc> {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 JVMWrapper("JVM_GetClassDeclaredFields");
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Object address to be held directly in mirror & not visible to GC
a61af66fc99e Initial load
duke
parents:
diff changeset
40 oop mirror = JNIHandles::resolve_non_null(ofClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // If this ctor can hit a safepoint, moving objects around, then
a61af66fc99e Initial load
duke
parents:
diff changeset
43 ComplexConstructor foo;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // Boom! mirror may point to JUNK instead of the intended object
a61af66fc99e Initial load
duke
parents:
diff changeset
46 (some dereference of mirror)
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Here's another call that may block for GC, making mirror stale
a61af66fc99e Initial load
duke
parents:
diff changeset
49 MutexLocker ml(some_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // And here's an initializer that can result in a stale oop
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // all in one step.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 oop o = call_that_can_throw_exception(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 The solution is to keep the oop declaration BELOW the ctor or function
a61af66fc99e Initial load
duke
parents:
diff changeset
57 call that might cause a GC, do another resolve to reassign the oop, or
a61af66fc99e Initial load
duke
parents:
diff changeset
58 consider use of a Handle instead of an oop so there is immunity from object
a61af66fc99e Initial load
duke
parents:
diff changeset
59 motion. But note that the "QUICK" entries below do not have a handlemark
a61af66fc99e Initial load
duke
parents:
diff changeset
60 and thus can only support use of handles passed in.
a61af66fc99e Initial load
duke
parents:
diff changeset
61 */
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 static void trace_class_resolution_impl(klassOop to_class, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 int line_number = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 const char * source_file = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 klassOop caller = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 JavaThread* jthread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
69 if (jthread->has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 vframeStream vfst(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // scan up the stack skipping ClassLoader, AccessController and PrivilegedAction frames
a61af66fc99e Initial load
duke
parents:
diff changeset
73 symbolHandle access_controller = oopFactory::new_symbol_handle("java/security/AccessController", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 klassOop access_controller_klass = SystemDictionary::resolve_or_fail(access_controller, false, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 symbolHandle privileged_action = oopFactory::new_symbol_handle("java/security/PrivilegedAction", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 klassOop privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 methodOop last_caller = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 while (!vfst.at_end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 methodOop m = vfst.method();
a61af66fc99e Initial load
duke
parents:
diff changeset
82 if (!vfst.method()->method_holder()->klass_part()->is_subclass_of(SystemDictionary::classloader_klass())&&
a61af66fc99e Initial load
duke
parents:
diff changeset
83 !vfst.method()->method_holder()->klass_part()->is_subclass_of(access_controller_klass) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
84 !vfst.method()->method_holder()->klass_part()->is_subclass_of(privileged_action_klass)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87 last_caller = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 vfst.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // if this is called from Class.forName0 and that is called from Class.forName,
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // then print the caller of Class.forName. If this is Class.loadClass, then print
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // that caller, otherwise keep quiet since this should be picked up elsewhere.
a61af66fc99e Initial load
duke
parents:
diff changeset
93 bool found_it = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 if (!vfst.at_end() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
95 instanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
96 vfst.method()->name() == vmSymbols::forName0_name()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 vfst.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
98 if (!vfst.at_end() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
99 instanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
100 vfst.method()->name() == vmSymbols::forName_name()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 vfst.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
102 found_it = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104 } else if (last_caller != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
105 instanceKlass::cast(last_caller->method_holder())->name() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
106 vmSymbols::java_lang_ClassLoader() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
107 (last_caller->name() == vmSymbols::loadClassInternal_name() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
108 last_caller->name() == vmSymbols::loadClass_name())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 found_it = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 if (found_it && !vfst.at_end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // found the caller
a61af66fc99e Initial load
duke
parents:
diff changeset
113 caller = vfst.method()->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
114 line_number = vfst.method()->line_number_from_bci(vfst.bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
115 symbolOop s = instanceKlass::cast(vfst.method()->method_holder())->source_file_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
116 if (s != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 source_file = s->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 if (caller != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
122 if (to_class != caller) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 const char * from = Klass::cast(caller)->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
124 const char * to = Klass::cast(to_class)->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // print in a single call to reduce interleaving between threads
a61af66fc99e Initial load
duke
parents:
diff changeset
126 if (source_file != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 tty->print("RESOLVE %s %s %s:%d (explicit)\n", from, to, source_file, line_number);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 tty->print("RESOLVE %s %s (explicit)\n", from, to);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static void trace_class_resolution(klassOop to_class) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 trace_class_resolution_impl(to_class, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
138 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 CLEAR_PENDING_EXCEPTION;
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 // Wrapper to trace JVM functions
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
146 class JVMTraceWrapper : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
147 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
148 JVMTraceWrapper(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 if (TraceJVMCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 tty->print("JVM ");
a61af66fc99e Initial load
duke
parents:
diff changeset
153 tty->vprint_cr(format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 };
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 Histogram* JVMHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 volatile jint JVMHistogram_lock = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 class JVMHistogramElement : public HistogramElement {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
164 JVMHistogramElement(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 };
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 JVMHistogramElement::JVMHistogramElement(const char* elementName) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 _name = elementName;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 uintx count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 while (Atomic::cmpxchg(1, &JVMHistogram_lock, 0) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 while (OrderAccess::load_acquire(&JVMHistogram_lock) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 count +=1;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 if ( (WarnOnStalledSpinLock > 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
175 && (count % WarnOnStalledSpinLock == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 warning("JVMHistogram_lock seems to be stalled");
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 if(JVMHistogram == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
182 JVMHistogram = new Histogram("JVM Call Counts",100);
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 JVMHistogram->add_element(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
185 Atomic::dec(&JVMHistogram_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 #define JVMCountWrapper(arg) \
a61af66fc99e Initial load
duke
parents:
diff changeset
189 static JVMHistogramElement* e = new JVMHistogramElement(arg); \
a61af66fc99e Initial load
duke
parents:
diff changeset
190 if (e != NULL) e->increment_count(); // Due to bug in VC++, we need a NULL check here eventhough it should never happen!
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 #define JVMWrapper(arg1) JVMCountWrapper(arg1); JVMTraceWrapper(arg1)
a61af66fc99e Initial load
duke
parents:
diff changeset
193 #define JVMWrapper2(arg1, arg2) JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2)
a61af66fc99e Initial load
duke
parents:
diff changeset
194 #define JVMWrapper3(arg1, arg2, arg3) JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2, arg3)
a61af66fc99e Initial load
duke
parents:
diff changeset
195 #define JVMWrapper4(arg1, arg2, arg3, arg4) JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2, arg3, arg4)
a61af66fc99e Initial load
duke
parents:
diff changeset
196 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
197 #define JVMWrapper(arg1)
a61af66fc99e Initial load
duke
parents:
diff changeset
198 #define JVMWrapper2(arg1, arg2)
a61af66fc99e Initial load
duke
parents:
diff changeset
199 #define JVMWrapper3(arg1, arg2, arg3)
a61af66fc99e Initial load
duke
parents:
diff changeset
200 #define JVMWrapper4(arg1, arg2, arg3, arg4)
a61af66fc99e Initial load
duke
parents:
diff changeset
201 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // Interface version /////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 JVM_LEAF(jint, JVM_GetInterfaceVersion())
a61af66fc99e Initial load
duke
parents:
diff changeset
208 return JVM_INTERFACE_VERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
209 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // java.lang.System //////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))
a61af66fc99e Initial load
duke
parents:
diff changeset
216 JVMWrapper("JVM_CurrentTimeMillis");
a61af66fc99e Initial load
duke
parents:
diff changeset
217 return os::javaTimeMillis();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 JVM_LEAF(jlong, JVM_NanoTime(JNIEnv *env, jclass ignored))
a61af66fc99e Initial load
duke
parents:
diff changeset
221 JVMWrapper("JVM_NanoTime");
a61af66fc99e Initial load
duke
parents:
diff changeset
222 return os::javaTimeNanos();
a61af66fc99e Initial load
duke
parents:
diff changeset
223 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 JVM_ENTRY(void, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,
a61af66fc99e Initial load
duke
parents:
diff changeset
227 jobject dst, jint dst_pos, jint length))
a61af66fc99e Initial load
duke
parents:
diff changeset
228 JVMWrapper("JVM_ArrayCopy");
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Check if we have null pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
230 if (src == NULL || dst == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
231 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233 arrayOop s = arrayOop(JNIHandles::resolve_non_null(src));
a61af66fc99e Initial load
duke
parents:
diff changeset
234 arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
235 assert(s->is_oop(), "JVM_ArrayCopy: src not an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
236 assert(d->is_oop(), "JVM_ArrayCopy: dst not an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // Do copy
a61af66fc99e Initial load
duke
parents:
diff changeset
238 Klass::cast(s->klass())->copy_array(s, src_pos, d, dst_pos, length, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 static void set_property(Handle props, const char* key, const char* value, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 JavaValue r(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // public synchronized Object put(Object key, Object value);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 HandleMark hm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 Handle key_str = java_lang_String::create_from_platform_dependent_str(key, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 Handle value_str = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 JavaCalls::call_virtual(&r,
a61af66fc99e Initial load
duke
parents:
diff changeset
249 props,
a61af66fc99e Initial load
duke
parents:
diff changeset
250 KlassHandle(THREAD, SystemDictionary::properties_klass()),
a61af66fc99e Initial load
duke
parents:
diff changeset
251 vmSymbolHandles::put_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
252 vmSymbolHandles::object_object_object_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
253 key_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
254 value_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
255 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 #define PUTPROP(props, name, value) set_property((props), (name), (value), CHECK_(properties));
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 JVM_ENTRY(jobject, JVM_InitProperties(JNIEnv *env, jobject properties))
a61af66fc99e Initial load
duke
parents:
diff changeset
263 JVMWrapper("JVM_InitProperties");
a61af66fc99e Initial load
duke
parents:
diff changeset
264 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 Handle props(THREAD, JNIHandles::resolve_non_null(properties));
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // System property list includes both user set via -D option and
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // jvm system specific properties.
a61af66fc99e Initial load
duke
parents:
diff changeset
270 for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 PUTPROP(props, p->key(), p->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Convert the -XX:MaxDirectMemorySize= command line flag
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // to the sun.nio.MaxDirectMemorySize property.
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // Do this after setting user properties to prevent people
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // from setting the value with a -D option, as requested.
a61af66fc99e Initial load
duke
parents:
diff changeset
278 {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 char as_chars[256];
a61af66fc99e Initial load
duke
parents:
diff changeset
280 jio_snprintf(as_chars, sizeof(as_chars), INTX_FORMAT, MaxDirectMemorySize);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 PUTPROP(props, "sun.nio.MaxDirectMemorySize", as_chars);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // JVM monitoring and management support
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Add the sun.management.compiler property for the compiler's name
a61af66fc99e Initial load
duke
parents:
diff changeset
286 {
a61af66fc99e Initial load
duke
parents:
diff changeset
287 #undef CSIZE
a61af66fc99e Initial load
duke
parents:
diff changeset
288 #if defined(_LP64) || defined(_WIN64)
a61af66fc99e Initial load
duke
parents:
diff changeset
289 #define CSIZE "64-Bit "
a61af66fc99e Initial load
duke
parents:
diff changeset
290 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
291 #define CSIZE
a61af66fc99e Initial load
duke
parents:
diff changeset
292 #endif // 64bit
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
295 const char* compiler_name = "HotSpot " CSIZE "Tiered Compilers";
a61af66fc99e Initial load
duke
parents:
diff changeset
296 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
297 #if defined(COMPILER1)
a61af66fc99e Initial load
duke
parents:
diff changeset
298 const char* compiler_name = "HotSpot " CSIZE "Client Compiler";
a61af66fc99e Initial load
duke
parents:
diff changeset
299 #elif defined(COMPILER2)
a61af66fc99e Initial load
duke
parents:
diff changeset
300 const char* compiler_name = "HotSpot " CSIZE "Server Compiler";
a61af66fc99e Initial load
duke
parents:
diff changeset
301 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
302 const char* compiler_name = "";
a61af66fc99e Initial load
duke
parents:
diff changeset
303 #endif // compilers
a61af66fc99e Initial load
duke
parents:
diff changeset
304 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 if (*compiler_name != '\0' &&
a61af66fc99e Initial load
duke
parents:
diff changeset
307 (Arguments::mode() != Arguments::_int)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 PUTPROP(props, "sun.management.compiler", compiler_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 return properties;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // java.lang.Runtime /////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 extern volatile jint vm_created;
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 JVM_ENTRY_NO_ENV(void, JVM_Exit(jint code))
a61af66fc99e Initial load
duke
parents:
diff changeset
321 if (vm_created != 0 && (code == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // The VM is about to exit. We call back into Java to check whether finalizers should be run
a61af66fc99e Initial load
duke
parents:
diff changeset
323 Universe::run_finalizers_on_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 before_exit(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 vm_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 JVM_ENTRY_NO_ENV(void, JVM_Halt(jint code))
a61af66fc99e Initial load
duke
parents:
diff changeset
331 before_exit(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
332 vm_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 JVM_LEAF(void, JVM_OnExit(void (*func)(void)))
a61af66fc99e Initial load
duke
parents:
diff changeset
337 register_on_exit_function(func);
a61af66fc99e Initial load
duke
parents:
diff changeset
338 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 JVM_ENTRY_NO_ENV(void, JVM_GC(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
342 JVMWrapper("JVM_GC");
a61af66fc99e Initial load
duke
parents:
diff changeset
343 if (!DisableExplicitGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 Universe::heap()->collect(GCCause::_java_lang_system_gc);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 JVM_LEAF(jlong, JVM_MaxObjectInspectionAge(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
350 JVMWrapper("JVM_MaxObjectInspectionAge");
a61af66fc99e Initial load
duke
parents:
diff changeset
351 return Universe::heap()->millis_since_last_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
352 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354
a61af66fc99e Initial load
duke
parents:
diff changeset
355 JVM_LEAF(void, JVM_TraceInstructions(jboolean on))
a61af66fc99e Initial load
duke
parents:
diff changeset
356 if (PrintJVMWarnings) warning("JVM_TraceInstructions not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
357 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 JVM_LEAF(void, JVM_TraceMethodCalls(jboolean on))
a61af66fc99e Initial load
duke
parents:
diff changeset
361 if (PrintJVMWarnings) warning("JVM_TraceMethodCalls not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
362 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 static inline jlong convert_size_t_to_jlong(size_t val) {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // In the 64-bit vm, a size_t can overflow a jlong (which is signed).
a61af66fc99e Initial load
duke
parents:
diff changeset
366 NOT_LP64 (return (jlong)val;)
a61af66fc99e Initial load
duke
parents:
diff changeset
367 LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);)
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 JVM_ENTRY_NO_ENV(jlong, JVM_TotalMemory(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
371 JVMWrapper("JVM_TotalMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
372 size_t n = Universe::heap()->capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
373 return convert_size_t_to_jlong(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 JVM_ENTRY_NO_ENV(jlong, JVM_FreeMemory(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
378 JVMWrapper("JVM_FreeMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
379 CollectedHeap* ch = Universe::heap();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
380 size_t n;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
381 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
382 MutexLocker x(Heap_lock);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
383 n = ch->capacity() - ch->used();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 116
diff changeset
384 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
385 return convert_size_t_to_jlong(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
386 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
387
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 JVM_ENTRY_NO_ENV(jlong, JVM_MaxMemory(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
390 JVMWrapper("JVM_MaxMemory");
a61af66fc99e Initial load
duke
parents:
diff changeset
391 size_t n = Universe::heap()->max_capacity();
a61af66fc99e Initial load
duke
parents:
diff changeset
392 return convert_size_t_to_jlong(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
393 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 JVM_ENTRY_NO_ENV(jint, JVM_ActiveProcessorCount(void))
a61af66fc99e Initial load
duke
parents:
diff changeset
397 JVMWrapper("JVM_ActiveProcessorCount");
a61af66fc99e Initial load
duke
parents:
diff changeset
398 return os::active_processor_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // java.lang.Throwable //////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
a61af66fc99e Initial load
duke
parents:
diff changeset
407 JVMWrapper("JVM_FillInStackTrace");
a61af66fc99e Initial load
duke
parents:
diff changeset
408 Handle exception(thread, JNIHandles::resolve_non_null(receiver));
a61af66fc99e Initial load
duke
parents:
diff changeset
409 java_lang_Throwable::fill_in_stack_trace(exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
410 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 JVM_ENTRY(void, JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable))
a61af66fc99e Initial load
duke
parents:
diff changeset
414 JVMWrapper("JVM_PrintStackTrace");
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // Note: This is no longer used in Merlin, but we still support it for compatibility.
a61af66fc99e Initial load
duke
parents:
diff changeset
416 oop exception = JNIHandles::resolve_non_null(receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 oop stream = JNIHandles::resolve_non_null(printable);
a61af66fc99e Initial load
duke
parents:
diff changeset
418 java_lang_Throwable::print_stack_trace(exception, stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 JVM_ENTRY(jint, JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable))
a61af66fc99e Initial load
duke
parents:
diff changeset
423 JVMWrapper("JVM_GetStackTraceDepth");
a61af66fc99e Initial load
duke
parents:
diff changeset
424 oop exception = JNIHandles::resolve(throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
425 return java_lang_Throwable::get_stack_trace_depth(exception, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 JVM_ENTRY(jobject, JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
430 JVMWrapper("JVM_GetStackTraceElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
431 JvmtiVMObjectAllocEventCollector oam; // This ctor (throughout this module) may trigger a safepoint/GC
a61af66fc99e Initial load
duke
parents:
diff changeset
432 oop exception = JNIHandles::resolve(throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
433 oop element = java_lang_Throwable::get_stack_trace_element(exception, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 return JNIHandles::make_local(env, element);
a61af66fc99e Initial load
duke
parents:
diff changeset
435 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // java.lang.Object ///////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
442 JVMWrapper("JVM_IHashCode");
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // as implemented in the classic virtual machine; return 0 if object is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
444 return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 JVM_ENTRY(void, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))
a61af66fc99e Initial load
duke
parents:
diff changeset
449 JVMWrapper("JVM_MonitorWait");
a61af66fc99e Initial load
duke
parents:
diff changeset
450 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
a61af66fc99e Initial load
duke
parents:
diff changeset
451 assert(obj->is_instance() || obj->is_array(), "JVM_MonitorWait must apply to an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
452 JavaThreadInObjectWaitState jtiows(thread, ms != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 if (JvmtiExport::should_post_monitor_wait()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
454 JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456 ObjectSynchronizer::wait(obj, ms, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
457 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 JVM_ENTRY(void, JVM_MonitorNotify(JNIEnv* env, jobject handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
461 JVMWrapper("JVM_MonitorNotify");
a61af66fc99e Initial load
duke
parents:
diff changeset
462 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
a61af66fc99e Initial load
duke
parents:
diff changeset
463 assert(obj->is_instance() || obj->is_array(), "JVM_MonitorNotify must apply to an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
464 ObjectSynchronizer::notify(obj, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
465 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 JVM_ENTRY(void, JVM_MonitorNotifyAll(JNIEnv* env, jobject handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
469 JVMWrapper("JVM_MonitorNotifyAll");
a61af66fc99e Initial load
duke
parents:
diff changeset
470 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
a61af66fc99e Initial load
duke
parents:
diff changeset
471 assert(obj->is_instance() || obj->is_array(), "JVM_MonitorNotifyAll must apply to an object");
a61af66fc99e Initial load
duke
parents:
diff changeset
472 ObjectSynchronizer::notifyall(obj, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
473 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
477 JVMWrapper("JVM_Clone");
a61af66fc99e Initial load
duke
parents:
diff changeset
478 Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
a61af66fc99e Initial load
duke
parents:
diff changeset
479 const KlassHandle klass (THREAD, obj->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
480 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // Just checking that the cloneable flag is set correct
a61af66fc99e Initial load
duke
parents:
diff changeset
484 if (obj->is_javaArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 guarantee(klass->is_cloneable(), "all arrays are cloneable");
a61af66fc99e Initial load
duke
parents:
diff changeset
486 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 guarantee(obj->is_instance(), "should be instanceOop");
a61af66fc99e Initial load
duke
parents:
diff changeset
488 bool cloneable = klass->is_subtype_of(SystemDictionary::cloneable_klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
489 guarantee(cloneable == klass->is_cloneable(), "incorrect cloneable flag");
a61af66fc99e Initial load
duke
parents:
diff changeset
490 }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // Check if class of obj supports the Cloneable interface.
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // All arrays are considered to be cloneable (See JLS 20.1.5)
a61af66fc99e Initial load
duke
parents:
diff changeset
495 if (!klass->is_cloneable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
496 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
497 THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // Make shallow object copy
a61af66fc99e Initial load
duke
parents:
diff changeset
501 const int size = obj->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
502 oop new_obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
503 if (obj->is_javaArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 const int length = ((arrayOop)obj())->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
505 new_obj = CollectedHeap::array_allocate(klass, size, length, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 new_obj = CollectedHeap::obj_allocate(klass, size, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // 4839641 (4840070): We must do an oop-atomic copy, because if another thread
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // is modifying a reference field in the clonee, a non-oop-atomic copy might
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // be suspended in the middle of copying the pointer and end up with parts
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // of two different pointers in the field. Subsequent dereferences will crash.
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // 4846409: an oop-copy of objects with long or double fields or arrays of same
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // won't copy the longs/doubles atomically in 32-bit vm's, so we copy jlongs instead
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // of oops. We know objects are aligned on a minimum of an jlong boundary.
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // The same is true of StubRoutines::object_copy and the various oop_copy
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // variants, and of the code generated by the inline_native_clone intrinsic.
a61af66fc99e Initial load
duke
parents:
diff changeset
518 assert(MinObjAlignmentInBytes >= BytesPerLong, "objects misaligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
519 Copy::conjoint_jlongs_atomic((jlong*)obj(), (jlong*)new_obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
520 (size_t)align_object_size(size) / HeapWordsPerLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // Clear the header
a61af66fc99e Initial load
duke
parents:
diff changeset
522 new_obj->init_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // Store check (mark entire object and let gc sort it out)
a61af66fc99e Initial load
duke
parents:
diff changeset
525 BarrierSet* bs = Universe::heap()->barrier_set();
a61af66fc99e Initial load
duke
parents:
diff changeset
526 assert(bs->has_write_region_opt(), "Barrier set does not have write_region");
a61af66fc99e Initial load
duke
parents:
diff changeset
527 bs->write_region(MemRegion((HeapWord*)new_obj, size));
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // Caution: this involves a java upcall, so the clone should be
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // "gc-robust" by this stage.
a61af66fc99e Initial load
duke
parents:
diff changeset
531 if (klass->has_finalizer()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 assert(obj->is_instance(), "should be instanceOop");
a61af66fc99e Initial load
duke
parents:
diff changeset
533 new_obj = instanceKlass::register_finalizer(instanceOop(new_obj), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536 return JNIHandles::make_local(env, oop(new_obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
537 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // java.lang.Compiler ////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // The initial cuts of the HotSpot VM will not support JITs, and all existing
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // JITs would need extensive changes to work with HotSpot. The JIT-related JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // functions are all silently ignored unless JVM warnings are printed.
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 JVM_LEAF(void, JVM_InitializeCompiler (JNIEnv *env, jclass compCls))
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if (PrintJVMWarnings) warning("JVM_InitializeCompiler not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
547 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550 JVM_LEAF(jboolean, JVM_IsSilentCompiler(JNIEnv *env, jclass compCls))
a61af66fc99e Initial load
duke
parents:
diff changeset
551 if (PrintJVMWarnings) warning("JVM_IsSilentCompiler not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
552 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
553 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
554
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556 JVM_LEAF(jboolean, JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
557 if (PrintJVMWarnings) warning("JVM_CompileClass not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
558 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
559 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 JVM_LEAF(jboolean, JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname))
a61af66fc99e Initial load
duke
parents:
diff changeset
563 if (PrintJVMWarnings) warning("JVM_CompileClasses not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
564 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
565 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 JVM_LEAF(jobject, JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg))
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (PrintJVMWarnings) warning("JVM_CompilerCommand not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
570 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
571 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 JVM_LEAF(void, JVM_EnableCompiler(JNIEnv *env, jclass compCls))
a61af66fc99e Initial load
duke
parents:
diff changeset
575 if (PrintJVMWarnings) warning("JVM_EnableCompiler not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
576 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 JVM_LEAF(void, JVM_DisableCompiler(JNIEnv *env, jclass compCls))
a61af66fc99e Initial load
duke
parents:
diff changeset
580 if (PrintJVMWarnings) warning("JVM_DisableCompiler not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
581 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // Error message support //////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 JVM_LEAF(jint, JVM_GetLastErrorString(char *buf, int len))
a61af66fc99e Initial load
duke
parents:
diff changeset
588 JVMWrapper("JVM_GetLastErrorString");
a61af66fc99e Initial load
duke
parents:
diff changeset
589 return hpi::lasterror(buf, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
590 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // java.io.File ///////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 JVM_LEAF(char*, JVM_NativePath(char* path))
a61af66fc99e Initial load
duke
parents:
diff changeset
596 JVMWrapper2("JVM_NativePath (%s)", path);
a61af66fc99e Initial load
duke
parents:
diff changeset
597 return hpi::native_path(path);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Misc. class handling ///////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth))
a61af66fc99e Initial load
duke
parents:
diff changeset
605 JVMWrapper("JVM_GetCallerClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
606 klassOop k = thread->security_get_caller_class(depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
607 return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
608 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))
a61af66fc99e Initial load
duke
parents:
diff changeset
612 JVMWrapper("JVM_FindPrimitiveClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
613 oop mirror = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
614 BasicType t = name2type(utf);
a61af66fc99e Initial load
duke
parents:
diff changeset
615 if (t != T_ILLEGAL && t != T_OBJECT && t != T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
616 mirror = Universe::java_mirror(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618 if (mirror == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
619 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);
a61af66fc99e Initial load
duke
parents:
diff changeset
620 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
621 return (jclass) JNIHandles::make_local(env, mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626 JVM_ENTRY(void, JVM_ResolveClass(JNIEnv* env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
627 JVMWrapper("JVM_ResolveClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
628 if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented");
a61af66fc99e Initial load
duke
parents:
diff changeset
629 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
630
388
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
631 // Common implementation for JVM_FindClassFromBootLoader and
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
632 // JVM_FindClassFromLoader
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
633 static jclass jvm_find_class_from_class_loader(JNIEnv* env, const char* name,
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
634 jboolean init, jobject loader,
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
635 jboolean throwError, TRAPS) {
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
636 // Java libraries should ensure that name is never null...
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
637 if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) {
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
638 // It's impossible to create this class; the name cannot fit
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
639 // into the constant pool.
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
640 if (throwError) {
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
641 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
642 } else {
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
643 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
644 }
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
645 }
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
646 symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_NULL);
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
647 Handle h_loader(THREAD, JNIHandles::resolve(loader));
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
648 jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
649 Handle(), throwError, THREAD);
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
650
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
651 if (TraceClassResolution && result != NULL) {
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
652 trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
653 }
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
654 return result;
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
655 }
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
656
226
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
657 // Rationale behind JVM_FindClassFromBootLoader
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
658 // a> JVM_FindClassFromClassLoader was never exported in the export tables.
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
659 // b> because of (a) java.dll has a direct dependecy on the unexported
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
660 // private symbol "_JVM_FindClassFromClassLoader@20".
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
661 // c> the launcher cannot use the private symbol as it dynamically opens
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
662 // the entry point, so if something changes, the launcher will fail
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
663 // unexpectedly at runtime, it is safest for the launcher to dlopen a
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
664 // stable exported interface.
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
665 // d> re-exporting JVM_FindClassFromClassLoader as public, will cause its
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
666 // signature to change from _JVM_FindClassFromClassLoader@20 to
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
667 // JVM_FindClassFromClassLoader and will not be backward compatible
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
668 // with older JDKs.
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
669 // Thus a public/stable exported entry point is the right solution,
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
670 // public here means public in linker semantics, and is exported only
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
671 // to the JDK, and is not intended to be a public API.
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
672
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
673 JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
674 const char* name,
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
675 jboolean throwError))
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
676 JVMWrapper3("JVM_FindClassFromBootLoader %s throw %s", name,
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
677 throwError ? "error" : "exception");
388
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
678 return jvm_find_class_from_class_loader(env, name, JNI_FALSE,
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
679 (jobject)NULL, throwError, THREAD);
226
d5ba4f8aa38a 6714758: hotspot: provide an entry point to the BootStrap Class loader[dholmes,acorn]
ksrini
parents: 116
diff changeset
680 JVM_END
0
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682 JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
a61af66fc99e Initial load
duke
parents:
diff changeset
683 jboolean init, jobject loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
684 jboolean throwError))
a61af66fc99e Initial load
duke
parents:
diff changeset
685 JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
a61af66fc99e Initial load
duke
parents:
diff changeset
686 throwError ? "error" : "exception");
388
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
687 return jvm_find_class_from_class_loader(env, name, init, loader,
f008d3631bd1 6755845: JVM_FindClassFromBoot triggers assertions
ksrini
parents: 356
diff changeset
688 throwError, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
689 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
a61af66fc99e Initial load
duke
parents:
diff changeset
693 jboolean init, jclass from))
a61af66fc99e Initial load
duke
parents:
diff changeset
694 JVMWrapper2("JVM_FindClassFromClass %s", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
695 if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
698 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
700 symbolHandle h_name = oopFactory::new_symbol_handle(name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
701 oop from_class_oop = JNIHandles::resolve(from);
a61af66fc99e Initial load
duke
parents:
diff changeset
702 klassOop from_class = (from_class_oop == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
703 ? (klassOop)NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
704 : java_lang_Class::as_klassOop(from_class_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
705 oop class_loader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 oop protection_domain = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
707 if (from_class != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
708 class_loader = Klass::cast(from_class)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
709 protection_domain = Klass::cast(from_class)->protection_domain();
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711 Handle h_loader(THREAD, class_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
712 Handle h_prot (THREAD, protection_domain);
a61af66fc99e Initial load
duke
parents:
diff changeset
713 jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
714 h_prot, true, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
715
a61af66fc99e Initial load
duke
parents:
diff changeset
716 if (TraceClassResolution && result != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // this function is generally only used for class loading during verification.
a61af66fc99e Initial load
duke
parents:
diff changeset
718 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
719 oop from_mirror = JNIHandles::resolve_non_null(from);
a61af66fc99e Initial load
duke
parents:
diff changeset
720 klassOop from_class = java_lang_Class::as_klassOop(from_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 const char * from_name = Klass::cast(from_class)->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 oop mirror = JNIHandles::resolve_non_null(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 klassOop to_class = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
725 const char * to = Klass::cast(to_class)->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
726 tty->print("RESOLVE %s %s (verification)\n", from_name, to);
a61af66fc99e Initial load
duke
parents:
diff changeset
727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
730 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 static void is_lock_held_by_thread(Handle loader, PerfCounter* counter, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
733 if (loader.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
734 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // check whether the current caller thread holds the lock or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // If not, increment the corresponding counter
a61af66fc99e Initial load
duke
parents:
diff changeset
739 if (ObjectSynchronizer::query_lock_ownership((JavaThread*)THREAD, loader) !=
a61af66fc99e Initial load
duke
parents:
diff changeset
740 ObjectSynchronizer::owner_self) {
a61af66fc99e Initial load
duke
parents:
diff changeset
741 counter->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
742 }
a61af66fc99e Initial load
duke
parents:
diff changeset
743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // common code for JVM_DefineClass() and JVM_DefineClassWithSource()
a61af66fc99e Initial load
duke
parents:
diff changeset
746 static jclass jvm_define_class_common(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source, TRAPS) {
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 388
diff changeset
747 if (source == NULL) source = "__JVM_DefineClass__";
0
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // Since exceptions can be thrown, class initialization can take place
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // if name is NULL no check for class name in .class stream has to be made.
a61af66fc99e Initial load
duke
parents:
diff changeset
751 symbolHandle class_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 const int str_len = (int)strlen(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
754 if (str_len > symbolOopDesc::max_length()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
756 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
757 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759 class_name = oopFactory::new_symbol_handle(name, str_len, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
763 ClassFileStream st((u1*) buf, len, (char *)source);
a61af66fc99e Initial load
duke
parents:
diff changeset
764 Handle class_loader (THREAD, JNIHandles::resolve(loader));
a61af66fc99e Initial load
duke
parents:
diff changeset
765 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
766 is_lock_held_by_thread(class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
767 ClassLoader::sync_JVMDefineClassLockFreeCounter(),
a61af66fc99e Initial load
duke
parents:
diff changeset
768 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
770 Handle protection_domain (THREAD, JNIHandles::resolve(pd));
a61af66fc99e Initial load
duke
parents:
diff changeset
771 klassOop k = SystemDictionary::resolve_from_stream(class_name, class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
772 protection_domain, &st,
a61af66fc99e Initial load
duke
parents:
diff changeset
773 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 if (TraceClassResolution && k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
776 trace_class_resolution(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
a61af66fc99e Initial load
duke
parents:
diff changeset
784 JVMWrapper2("JVM_DefineClass %s", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
785
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 388
diff changeset
786 return jvm_define_class_common(env, name, loader, buf, len, pd, NULL, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
787 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source))
a61af66fc99e Initial load
duke
parents:
diff changeset
791 JVMWrapper2("JVM_DefineClassWithSource %s", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 return jvm_define_class_common(env, name, loader, buf, len, pd, source, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
794 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))
a61af66fc99e Initial load
duke
parents:
diff changeset
798 JVMWrapper("JVM_FindLoadedClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
799 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
802 Handle string = java_lang_String::internalize_classname(h_name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 const char* str = java_lang_String::as_utf8_string(string());
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // Sanity check, don't expect null
a61af66fc99e Initial load
duke
parents:
diff changeset
806 if (str == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
807
a61af66fc99e Initial load
duke
parents:
diff changeset
808 const int str_len = (int)strlen(str);
a61af66fc99e Initial load
duke
parents:
diff changeset
809 if (str_len > symbolOopDesc::max_length()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
811 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
812 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
814 symbolHandle klass_name = oopFactory::new_symbol_handle(str, str_len,CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // Security Note:
a61af66fc99e Initial load
duke
parents:
diff changeset
817 // The Java level wrapper will perform the necessary security check allowing
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // us to pass the NULL as the initiating class loader.
a61af66fc99e Initial load
duke
parents:
diff changeset
819 Handle h_loader(THREAD, JNIHandles::resolve(loader));
a61af66fc99e Initial load
duke
parents:
diff changeset
820 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
821 is_lock_held_by_thread(h_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
822 ClassLoader::sync_JVMFindLoadedClassLockFreeCounter(),
a61af66fc99e Initial load
duke
parents:
diff changeset
823 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
825
a61af66fc99e Initial load
duke
parents:
diff changeset
826 klassOop k = SystemDictionary::find_instance_or_array_klass(klass_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
827 h_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
828 Handle(),
a61af66fc99e Initial load
duke
parents:
diff changeset
829 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 return (k == NULL) ? NULL :
a61af66fc99e Initial load
duke
parents:
diff changeset
832 (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
833 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // Reflection support //////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 JVM_ENTRY(jstring, JVM_GetClassName(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
839 assert (cls != NULL, "illegal class");
a61af66fc99e Initial load
duke
parents:
diff changeset
840 JVMWrapper("JVM_GetClassName");
a61af66fc99e Initial load
duke
parents:
diff changeset
841 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
842 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
843 const char* name;
a61af66fc99e Initial load
duke
parents:
diff changeset
844 if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
845 name = type2name(java_lang_Class::primitive_type(JNIHandles::resolve(cls)));
a61af66fc99e Initial load
duke
parents:
diff changeset
846 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // Consider caching interned string in Klass
a61af66fc99e Initial load
duke
parents:
diff changeset
848 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
849 assert(k->is_klass(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
850 name = Klass::cast(k)->external_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
851 }
a61af66fc99e Initial load
duke
parents:
diff changeset
852 oop result = StringTable::intern((char*) name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
853 return (jstring) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
858 JVMWrapper("JVM_GetClassInterfaces");
a61af66fc99e Initial load
duke
parents:
diff changeset
859 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // Special handling for primitive objects
a61af66fc99e Initial load
duke
parents:
diff changeset
863 if (java_lang_Class::is_primitive(mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // Primitive objects does not have any interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
865 objArrayOop r = oopFactory::new_objArray(SystemDictionary::class_klass(), 0, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
866 return (jobjectArray) JNIHandles::make_local(env, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 KlassHandle klass(thread, java_lang_Class::as_klassOop(mirror));
a61af66fc99e Initial load
duke
parents:
diff changeset
870 // Figure size of result array
a61af66fc99e Initial load
duke
parents:
diff changeset
871 int size;
a61af66fc99e Initial load
duke
parents:
diff changeset
872 if (klass->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
873 size = instanceKlass::cast(klass())->local_interfaces()->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
874 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
875 assert(klass->oop_is_objArray() || klass->oop_is_typeArray(), "Illegal mirror klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
876 size = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 }
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // Allocate result array
a61af66fc99e Initial load
duke
parents:
diff changeset
880 objArrayOop r = oopFactory::new_objArray(SystemDictionary::class_klass(), size, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
881 objArrayHandle result (THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 // Fill in result
a61af66fc99e Initial load
duke
parents:
diff changeset
883 if (klass->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // Regular instance klass, fill in all local interfaces
a61af66fc99e Initial load
duke
parents:
diff changeset
885 for (int index = 0; index < size; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 klassOop k = klassOop(instanceKlass::cast(klass())->local_interfaces()->obj_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
887 result->obj_at_put(index, Klass::cast(k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // All arrays implement java.lang.Cloneable and java.io.Serializable
a61af66fc99e Initial load
duke
parents:
diff changeset
891 result->obj_at_put(0, Klass::cast(SystemDictionary::cloneable_klass())->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
892 result->obj_at_put(1, Klass::cast(SystemDictionary::serializable_klass())->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
894 return (jobjectArray) JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
895 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 JVM_ENTRY(jobject, JVM_GetClassLoader(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
899 JVMWrapper("JVM_GetClassLoader");
a61af66fc99e Initial load
duke
parents:
diff changeset
900 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
901 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
904 oop loader = Klass::cast(k)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
905 return JNIHandles::make_local(env, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
907
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909 JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
910 JVMWrapper("JVM_IsInterface");
a61af66fc99e Initial load
duke
parents:
diff changeset
911 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
912 if (java_lang_Class::is_primitive(mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
913 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
915 klassOop k = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
916 jboolean result = Klass::cast(k)->is_interface();
a61af66fc99e Initial load
duke
parents:
diff changeset
917 assert(!result || Klass::cast(k)->oop_is_instance(),
a61af66fc99e Initial load
duke
parents:
diff changeset
918 "all interfaces are instance types");
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // The compiler intrinsic for isInterface tests the
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // Klass::_access_flags bits in the same way.
a61af66fc99e Initial load
duke
parents:
diff changeset
921 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
922 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
923
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
926 JVMWrapper("JVM_GetClassSigners");
a61af66fc99e Initial load
duke
parents:
diff changeset
927 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
928 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
929 // There are no signers for primitive types
a61af66fc99e Initial load
duke
parents:
diff changeset
930 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
934 objArrayOop signers = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
935 if (Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
936 signers = instanceKlass::cast(k)->signers();
a61af66fc99e Initial load
duke
parents:
diff changeset
937 }
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // If there are no signers set in the class, or if the class
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // is an array, return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
941 if (signers == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // copy of the signers array
a61af66fc99e Initial load
duke
parents:
diff changeset
944 klassOop element = objArrayKlass::cast(signers->klass())->element_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
945 objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
946 for (int index = 0; index < signers->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
947 signers_copy->obj_at_put(index, signers->obj_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 // return the copy
a61af66fc99e Initial load
duke
parents:
diff changeset
951 return (jobjectArray) JNIHandles::make_local(env, signers_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
952 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
953
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955 JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers))
a61af66fc99e Initial load
duke
parents:
diff changeset
956 JVMWrapper("JVM_SetClassSigners");
a61af66fc99e Initial load
duke
parents:
diff changeset
957 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // This call is ignored for primitive types and arrays.
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // Signers are only set once, ClassLoader.java, and thus shouldn't
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // be called with an array. Only the bootstrap loader creates arrays.
a61af66fc99e Initial load
duke
parents:
diff changeset
961 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
962 if (Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
963 instanceKlass::cast(k)->set_signers(objArrayOop(JNIHandles::resolve(signers)));
a61af66fc99e Initial load
duke
parents:
diff changeset
964 }
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
967
a61af66fc99e Initial load
duke
parents:
diff changeset
968
a61af66fc99e Initial load
duke
parents:
diff changeset
969 JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
970 JVMWrapper("JVM_GetProtectionDomain");
a61af66fc99e Initial load
duke
parents:
diff changeset
971 if (JNIHandles::resolve(cls) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
972 THROW_(vmSymbols::java_lang_NullPointerException(), NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
973 }
a61af66fc99e Initial load
duke
parents:
diff changeset
974
a61af66fc99e Initial load
duke
parents:
diff changeset
975 if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
976 // Primitive types does not have a protection domain.
a61af66fc99e Initial load
duke
parents:
diff changeset
977 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
981 return (jobject) JNIHandles::make_local(env, Klass::cast(k)->protection_domain());
a61af66fc99e Initial load
duke
parents:
diff changeset
982 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984
a61af66fc99e Initial load
duke
parents:
diff changeset
985 // Obsolete since 1.2 (Class.setProtectionDomain removed), although
a61af66fc99e Initial load
duke
parents:
diff changeset
986 // still defined in core libraries as of 1.5.
a61af66fc99e Initial load
duke
parents:
diff changeset
987 JVM_ENTRY(void, JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain))
a61af66fc99e Initial load
duke
parents:
diff changeset
988 JVMWrapper("JVM_SetProtectionDomain");
a61af66fc99e Initial load
duke
parents:
diff changeset
989 if (JNIHandles::resolve(cls) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
990 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
992 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
993 // Call is ignored for primitive types
a61af66fc99e Initial load
duke
parents:
diff changeset
994 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // cls won't be an array, as this called only from ClassLoader.defineClass
a61af66fc99e Initial load
duke
parents:
diff changeset
997 if (Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
998 oop pd = JNIHandles::resolve(protection_domain);
a61af66fc99e Initial load
duke
parents:
diff changeset
999 assert(pd == NULL || pd->is_oop(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 instanceKlass::cast(k)->set_protection_domain(pd);
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1004
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 JVM_ENTRY(jobject, JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException))
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 JVMWrapper("JVM_DoPrivileged");
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 if (action == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 THROW_MSG_0(vmSymbols::java_lang_NullPointerException(), "Null action");
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1012
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 // Stack allocated list of privileged stack elements
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 PrivilegedElement pi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // Check that action object understands "Object run()"
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 Handle object (THREAD, JNIHandles::resolve(action));
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // get run() method
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 methodOop m_oop = Klass::cast(object->klass())->uncached_lookup_method(
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 vmSymbols::run_method_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 vmSymbols::void_object_signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 methodHandle m (THREAD, m_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 if (m.is_null() || !m->is_method() || !methodOop(m())->is_public() || methodOop(m())->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 THROW_MSG_0(vmSymbols::java_lang_InternalError(), "No run method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // Compute the frame initiating the do privileged operation and setup the privileged stack
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 vframeStream vfst(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 vfst.security_get_caller_frame(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 if (!vfst.at_end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 pi.initialize(&vfst, JNIHandles::resolve(context), thread->privileged_stack_top(), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 thread->set_privileged_stack_top(&pi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
a61af66fc99e Initial load
duke
parents:
diff changeset
1037
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // invoke the Object run() in the action object. We cannot use call_interface here, since the static type
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // is not really known - it is either java.security.PrivilegedAction or java.security.PrivilegedExceptionAction
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 Handle pending_exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 JavaValue result(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 JavaCallArguments args(object);
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 JavaCalls::call(&result, m, &args, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 // done with action, remove ourselves from the list
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 if (!vfst.at_end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 assert(thread->privileged_stack_top() != NULL && thread->privileged_stack_top() == &pi, "wrong top element");
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 thread->set_privileged_stack_top(thread->privileged_stack_top()->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 pending_exception = Handle(THREAD, PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 if ( pending_exception->is_a(SystemDictionary::exception_klass()) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 !pending_exception->is_a(SystemDictionary::runtime_exception_klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // Throw a java.security.PrivilegedActionException(Exception e) exception
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 JavaCallArguments args(pending_exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 THROW_ARG_0(vmSymbolHandles::java_security_PrivilegedActionException(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 vmSymbolHandles::exception_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 &args);
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1064
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 if (pending_exception.not_null()) THROW_OOP_0(pending_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 return JNIHandles::make_local(env, (oop) result.get_jobject());
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 // Returns the inherited_access_control_context field of the running thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 JVMWrapper("JVM_GetInheritedAccessControlContext");
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 class RegisterArrayForGC {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 JavaThread *_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 RegisterArrayForGC(JavaThread *thread, GrowableArray<oop>* array) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 _thread->register_array_for_gc(array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 ~RegisterArrayForGC() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 _thread->register_array_for_gc(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1090
a61af66fc99e Initial load
duke
parents:
diff changeset
1091
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 JVMWrapper("JVM_GetStackAccessControlContext");
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 if (!UsePrivilegedStack) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1095
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 GrowableArray<oop>* local_array = new GrowableArray<oop>(12);
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // count the protection domains on the execution stack. We collapse
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 // duplicate consecutive protection domains into a single one, as
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 // well as stopping when we hit a privileged frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
1103
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 // Use vframeStream to iterate through Java frames
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 vframeStream vfst(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1106
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 oop previous_protection_domain = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 Handle privileged_context(thread, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 bool is_privileged = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 oop protection_domain = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 for(; !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 // get method of frame
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 methodOop method = vfst.method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 intptr_t* frame_id = vfst.frame_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1116
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 // check the privileged frames to see if we have a match
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 if (thread->privileged_stack_top() && thread->privileged_stack_top()->frame_id() == frame_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // this frame is privileged
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 is_privileged = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 privileged_context = Handle(thread, thread->privileged_stack_top()->privileged_context());
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 protection_domain = thread->privileged_stack_top()->protection_domain();
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 protection_domain = instanceKlass::cast(method->method_holder())->protection_domain();
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1126
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 if ((previous_protection_domain != protection_domain) && (protection_domain != NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 local_array->push(protection_domain);
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 previous_protection_domain = protection_domain;
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 if (is_privileged) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1134
a61af66fc99e Initial load
duke
parents:
diff changeset
1135
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // either all the domains on the stack were system domains, or
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // we had a privileged system domain
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 if (local_array->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 if (is_privileged && privileged_context.is_null()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1140
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 oop result = java_security_AccessControlContext::create(objArrayHandle(), is_privileged, privileged_context, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 // the resource area must be registered in case of a gc
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 RegisterArrayForGC ragc(thread, local_array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 objArrayOop context = oopFactory::new_objArray(SystemDictionary::protectionDomain_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 local_array->length(), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 objArrayHandle h_context(thread, context);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 for (int index = 0; index < local_array->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 h_context->obj_at_put(index, local_array->at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 oop result = java_security_AccessControlContext::create(h_context, is_privileged, privileged_context, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1155
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1158
a61af66fc99e Initial load
duke
parents:
diff changeset
1159
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 JVM_QUICK_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 JVMWrapper("JVM_IsArrayClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 return (k != NULL) && Klass::cast(k)->oop_is_javaArray() ? true : false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1165
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 JVM_QUICK_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 JVMWrapper("JVM_IsPrimitiveClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 return (jboolean) java_lang_Class::is_primitive(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1172
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 JVM_ENTRY(jclass, JVM_GetComponentType(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 JVMWrapper("JVM_GetComponentType");
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 oop result = Reflection::array_component_type(mirror, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 return (jclass) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1180
a61af66fc99e Initial load
duke
parents:
diff changeset
1181
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 JVMWrapper("JVM_GetClassModifiers");
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 // Primitive type
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1188
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 Klass* k = Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK");
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 return k->modifier_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // Inner class reflection ///////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1197
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 const int inner_class_info_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 const int outer_class_info_index = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 // ofClass is a reference to a java_lang_Class object. The mirror object
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 // of an instanceKlass
a61af66fc99e Initial load
duke
parents:
diff changeset
1205
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 ! Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 oop result = oopFactory::new_objArray(SystemDictionary::class_klass(), 0, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 return (jobjectArray)JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 instanceKlassHandle k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1213
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 if (k->inner_classes()->length() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 // Neither an inner nor outer class
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 oop result = oopFactory::new_objArray(SystemDictionary::class_klass(), 0, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 return (jobjectArray)JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1219
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 // find inner class info
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 typeArrayHandle icls(thread, k->inner_classes());
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 constantPoolHandle cp(thread, k->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 int length = icls->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // Allocate temp. result array
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 objArrayOop r = oopFactory::new_objArray(SystemDictionary::class_klass(), length/4, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 objArrayHandle result (THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 int members = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1229
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 for(int i = 0; i < length; i += 4) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 int ioff = icls->ushort_at(i + inner_class_info_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 int ooff = icls->ushort_at(i + outer_class_info_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1233
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 if (ioff != 0 && ooff != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 // Check to see if the name matches the class we're looking for
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // before attempting to find the class.
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 if (cp->klass_name_at_matches(k, ooff)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 klassOop outer_klass = cp->klass_at(ooff, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 if (outer_klass == k()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 klassOop ik = cp->klass_at(ioff, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 instanceKlassHandle inner_klass (THREAD, ik);
a61af66fc99e Initial load
duke
parents:
diff changeset
1242
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 // Throws an exception if outer klass has not declared k as
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // an inner klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 Reflection::check_for_inner_class(k, inner_klass, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1246
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 result->obj_at_put(members, inner_klass->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 members++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1253
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 if (members != length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 // Return array of right length
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 objArrayOop res = oopFactory::new_objArray(SystemDictionary::class_klass(), members, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 for(int i = 0; i < members; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 res->obj_at_put(i, result->obj_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 return (jobjectArray)JNIHandles::make_local(env, res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1262
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 return (jobjectArray)JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1265
a61af66fc99e Initial load
duke
parents:
diff changeset
1266
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 const int inner_class_info_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 const int outer_class_info_index = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 // ofClass is a reference to a java_lang_Class object.
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 ! Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1276
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 instanceKlassHandle k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1278
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 if (k->inner_classes()->length() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 // No inner class info => no declaring class
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1283
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 typeArrayHandle i_icls(thread, k->inner_classes());
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 constantPoolHandle i_cp(thread, k->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 int i_length = i_icls->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1287
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 bool found = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 klassOop ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 instanceKlassHandle outer_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1291
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 // Find inner_klass attribute
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 for(int i = 0; i < i_length && !found; i+= 4) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 int ioff = i_icls->ushort_at(i + inner_class_info_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 int ooff = i_icls->ushort_at(i + outer_class_info_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1296
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 if (ioff != 0 && ooff != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 // Check to see if the name matches the class we're looking for
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 // before attempting to find the class.
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 if (i_cp->klass_name_at_matches(k, ioff)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 klassOop inner_klass = i_cp->klass_at(ioff, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 if (k() == inner_klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 found = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 ok = i_cp->klass_at(ooff, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 outer_klass = instanceKlassHandle(thread, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1310
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 // If no inner class attribute found for this class.
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 if (!found) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1313
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 // Throws an exception if outer klass has not declared k as an inner klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 Reflection::check_for_inner_class(outer_klass, k, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1316
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 return (jclass)JNIHandles::make_local(env, outer_klass->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1319
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 assert (cls != NULL, "illegal class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 JVMWrapper("JVM_GetClassSignature");
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 // Return null for arrays and primatives
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 if (Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 symbolHandle sym = symbolHandle(THREAD, instanceKlass::cast(k)->generic_signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 if (sym.is_null()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 return (jstring) JNIHandles::make_local(env, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1338
a61af66fc99e Initial load
duke
parents:
diff changeset
1339
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 assert (cls != NULL, "illegal class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 JVMWrapper("JVM_GetClassAnnotations");
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 // Return null for arrays and primitives
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 if (Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 return (jbyteArray) JNIHandles::make_local(env,
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 instanceKlass::cast(k)->class_annotations());
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1354
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 JVM_ENTRY(jbyteArray, JVM_GetFieldAnnotations(JNIEnv *env, jobject field))
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 assert(field != NULL, "illegal field");
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 JVMWrapper("JVM_GetFieldAnnotations");
a61af66fc99e Initial load
duke
parents:
diff changeset
1359
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 // some of this code was adapted from from jni_FromReflectedField
a61af66fc99e Initial load
duke
parents:
diff changeset
1361
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 // field is a handle to a java.lang.reflect.Field object
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 oop reflected = JNIHandles::resolve_non_null(field);
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 oop mirror = java_lang_reflect_Field::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 klassOop k = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 int slot = java_lang_reflect_Field::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 int modifiers = java_lang_reflect_Field::modifiers(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1368
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 KlassHandle kh(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 intptr_t offset = instanceKlass::cast(kh())->offset_from_fields(slot);
a61af66fc99e Initial load
duke
parents:
diff changeset
1372
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 if (modifiers & JVM_ACC_STATIC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 // for static fields we only look in the current class
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 if (!instanceKlass::cast(kh())->find_local_field_from_offset(offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 true, &fd)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 assert(false, "cannot find static field");
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 return NULL; // robustness
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 // for instance fields we start with the current class and work
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 // our way up through the superclass chain
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 if (!instanceKlass::cast(kh())->find_field_from_offset(offset, false,
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 &fd)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 assert(false, "cannot find instance field");
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 return NULL; // robustness
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 return (jbyteArray) JNIHandles::make_local(env, fd.annotations());
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1392
a61af66fc99e Initial load
duke
parents:
diff changeset
1393
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 static methodOop jvm_get_method_common(jobject method, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 // some of this code was adapted from from jni_FromReflectedMethod
a61af66fc99e Initial load
duke
parents:
diff changeset
1396
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 oop reflected = JNIHandles::resolve_non_null(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 oop mirror = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 int slot = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1400
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 if (reflected->klass() == SystemDictionary::reflect_constructor_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 mirror = java_lang_reflect_Constructor::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 slot = java_lang_reflect_Constructor::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 assert(reflected->klass() == SystemDictionary::reflect_method_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 "wrong type");
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 mirror = java_lang_reflect_Method::clazz(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 slot = java_lang_reflect_Method::slot(reflected);
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 klassOop k = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
1411
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 KlassHandle kh(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 methodOop m = instanceKlass::cast(kh())->method_with_idnum(slot);
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 if (m == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 assert(false, "cannot find method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 return NULL; // robustness
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1418
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 return m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1421
a61af66fc99e Initial load
duke
parents:
diff changeset
1422
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 JVM_ENTRY(jbyteArray, JVM_GetMethodAnnotations(JNIEnv *env, jobject method))
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 JVMWrapper("JVM_GetMethodAnnotations");
a61af66fc99e Initial load
duke
parents:
diff changeset
1425
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 // method is a handle to a java.lang.reflect.Method object
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 methodOop m = jvm_get_method_common(method, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 return (jbyteArray) JNIHandles::make_local(env, m->annotations());
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1430
a61af66fc99e Initial load
duke
parents:
diff changeset
1431
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 JVM_ENTRY(jbyteArray, JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method))
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 JVMWrapper("JVM_GetMethodDefaultAnnotationValue");
a61af66fc99e Initial load
duke
parents:
diff changeset
1434
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 // method is a handle to a java.lang.reflect.Method object
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 methodOop m = jvm_get_method_common(method, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 return (jbyteArray) JNIHandles::make_local(env, m->annotation_default());
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1439
a61af66fc99e Initial load
duke
parents:
diff changeset
1440
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 JVM_ENTRY(jbyteArray, JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method))
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 JVMWrapper("JVM_GetMethodParameterAnnotations");
a61af66fc99e Initial load
duke
parents:
diff changeset
1443
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 // method is a handle to a java.lang.reflect.Method object
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 methodOop m = jvm_get_method_common(method, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 return (jbyteArray) JNIHandles::make_local(env, m->parameter_annotations());
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
a61af66fc99e Initial load
duke
parents:
diff changeset
1449
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 // New (JDK 1.4) reflection implementation /////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1451
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly))
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 JVMWrapper("JVM_GetClassDeclaredFields");
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1456
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 // Exclude primitive types and array types
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_javaArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 // Return empty array
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 oop res = oopFactory::new_objArray(SystemDictionary::reflect_field_klass(), 0, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 return (jobjectArray) JNIHandles::make_local(env, res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1464
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 constantPoolHandle cp(THREAD, k->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
1467
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 // Ensure class is linked
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 k->link_class(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1470
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 typeArrayHandle fields(THREAD, k->fields());
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 int fields_len = fields->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1473
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 // 4496456 We need to filter out java.lang.Throwable.backtrace
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 bool skip_backtrace = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1476
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 // Allocate result
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 int num_fields;
a61af66fc99e Initial load
duke
parents:
diff changeset
1479
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 if (publicOnly) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 num_fields = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 for (int i = 0, j = 0; i < fields_len; i += instanceKlass::next_offset, j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 int mods = fields->ushort_at(i + instanceKlass::access_flags_offset) & JVM_RECOGNIZED_FIELD_MODIFIERS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 if (mods & JVM_ACC_PUBLIC) ++num_fields;
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 num_fields = fields_len / instanceKlass::next_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1488
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 if (k() == SystemDictionary::throwable_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 num_fields--;
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 skip_backtrace = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1494
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_field_klass(), num_fields, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 objArrayHandle result (THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1497
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 int out_idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 for (int i = 0; i < fields_len; i += instanceKlass::next_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 if (skip_backtrace) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // 4496456 skip java.lang.Throwable.backtrace
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 int offset = k->offset_from_fields(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 if (offset == java_lang_Throwable::get_backtrace_offset()) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1506
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 int mods = fields->ushort_at(i + instanceKlass::access_flags_offset) & JVM_RECOGNIZED_FIELD_MODIFIERS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 if (!publicOnly || (mods & JVM_ACC_PUBLIC)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 fd.initialize(k(), i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 oop field = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 result->obj_at_put(out_idx, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 ++out_idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 assert(out_idx == num_fields, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 return (jobjectArray) JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1519
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 JVMWrapper("JVM_GetClassDeclaredMethods");
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1524
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 // Exclude primitive types and array types
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 || Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_javaArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 // Return empty array
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 oop res = oopFactory::new_objArray(SystemDictionary::reflect_method_klass(), 0, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 return (jobjectArray) JNIHandles::make_local(env, res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1532
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1534
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 // Ensure class is linked
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 k->link_class(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1537
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 objArrayHandle methods (THREAD, k->methods());
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 int methods_length = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 int num_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1541
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 for (i = 0; i < methods_length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 methodHandle method(THREAD, (methodOop) methods->obj_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 if (!method->is_initializer()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 if (!publicOnly || method->is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 ++num_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1551
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 // Allocate result
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_method_klass(), num_methods, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 objArrayHandle result (THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1555
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 int out_idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 for (i = 0; i < methods_length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 methodHandle method(THREAD, (methodOop) methods->obj_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 if (!method->is_initializer()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 if (!publicOnly || method->is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 oop m = Reflection::new_method(method, UseNewReflection, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 result->obj_at_put(out_idx, m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 ++out_idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 assert(out_idx == num_methods, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 return (jobjectArray) JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1571
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly))
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 JVMWrapper("JVM_GetClassDeclaredConstructors");
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1576
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 // Exclude primitive types and array types
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 || Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_javaArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 // Return empty array
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 oop res = oopFactory::new_objArray(SystemDictionary::reflect_constructor_klass(), 0 , CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 return (jobjectArray) JNIHandles::make_local(env, res);
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1584
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1586
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 // Ensure class is linked
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 k->link_class(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1589
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 objArrayHandle methods (THREAD, k->methods());
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 int methods_length = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 int num_constructors = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1593
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 for (i = 0; i < methods_length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 methodHandle method(THREAD, (methodOop) methods->obj_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 if (method->is_initializer() && !method->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 if (!publicOnly || method->is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 ++num_constructors;
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 }
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 // Allocate result
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_constructor_klass(), num_constructors, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 objArrayHandle result(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1607
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 int out_idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 for (i = 0; i < methods_length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 methodHandle method(THREAD, (methodOop) methods->obj_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 if (method->is_initializer() && !method->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 if (!publicOnly || method->is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 oop m = Reflection::new_constructor(method, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 result->obj_at_put(out_idx, m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 ++out_idx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 assert(out_idx == num_constructors, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 return (jobjectArray) JNIHandles::make_local(env, result());
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1623
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 JVMWrapper("JVM_GetClassAccessFlags");
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 // Primitive type
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1631
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 Klass* k = Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1636
a61af66fc99e Initial load
duke
parents:
diff changeset
1637
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 // Constant pool access //////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1639
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 JVMWrapper("JVM_GetClassConstantPool");
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1644
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 // Return null for primitives and arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 if (Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 instanceKlassHandle k_h(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 Handle jcp = sun_reflect_ConstantPool::create(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 sun_reflect_ConstantPool::set_cp_oop(jcp(), k_h->constants());
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 return JNIHandles::make_local(jcp());
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1658
a61af66fc99e Initial load
duke
parents:
diff changeset
1659
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool))
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 JVMWrapper("JVM_ConstantPoolGetSize");
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 return cp->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1667
a61af66fc99e Initial load
duke
parents:
diff changeset
1668
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 static void bounds_check(constantPoolHandle cp, jint index, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 if (!cp->is_within_bounds(index)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1674
a61af66fc99e Initial load
duke
parents:
diff changeset
1675
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 JVMWrapper("JVM_ConstantPoolGetClassAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 klassOop k = cp->klass_at(index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 return (jclass) JNIHandles::make_local(k->klass_part()->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1689
a61af66fc99e Initial load
duke
parents:
diff changeset
1690
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 JVMWrapper("JVM_ConstantPoolGetClassAtIfLoaded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 if (!tag.is_klass() && !tag.is_unresolved_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 klassOop k = constantPoolOopDesc::klass_at_if_loaded(cp, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 if (k == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 return (jclass) JNIHandles::make_local(k->klass_part()->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1705
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 static jobject get_method_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 if (!tag.is_method() && !tag.is_interface_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 int klass_ref = cp->uncached_klass_ref_index_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 klassOop k_o;
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 if (force_resolution) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 k_o = cp->klass_at(klass_ref, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 if (k_o == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 instanceKlassHandle k(THREAD, k_o);
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 symbolOop name = cp->uncached_name_ref_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 symbolOop sig = cp->uncached_signature_ref_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 methodHandle m (THREAD, k->find_method(name, sig));
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 if (m.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 oop method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 if (!m->is_initializer() || m->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 method = Reflection::new_method(m, true, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 method = Reflection::new_constructor(m, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 return JNIHandles::make_local(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1734
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 JVMWrapper("JVM_ConstantPoolGetMethodAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 jobject res = get_method_at_helper(cp, index, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1745
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 JVMWrapper("JVM_ConstantPoolGetMethodAtIfLoaded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 jobject res = get_method_at_helper(cp, index, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1756
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 static jobject get_field_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 if (!tag.is_field()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 int klass_ref = cp->uncached_klass_ref_index_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 klassOop k_o;
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 if (force_resolution) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 k_o = cp->klass_at(klass_ref, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref);
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 if (k_o == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 instanceKlassHandle k(THREAD, k_o);
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 symbolOop name = cp->uncached_name_ref_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 symbolOop sig = cp->uncached_signature_ref_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 klassOop target_klass = k->find_field(name, sig, &fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 if (target_klass == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 oop field = Reflection::new_field(&fd, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 return JNIHandles::make_local(field);
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1781
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 JVMWrapper("JVM_ConstantPoolGetFieldAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 jobject res = get_field_at_helper(cp, index, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1792
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 JVMWrapper("JVM_ConstantPoolGetFieldAtIfLoaded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 jobject res = get_field_at_helper(cp, index, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1803
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 JVMWrapper("JVM_ConstantPoolGetMemberRefInfoAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 if (!tag.is_field_or_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 int klass_ref = cp->uncached_klass_ref_index_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 symbolHandle klass_name (THREAD, cp->klass_name_at(klass_ref));
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 symbolHandle member_name(THREAD, cp->uncached_name_ref_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 symbolHandle member_sig (THREAD, cp->uncached_signature_ref_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::string_klass(), 3, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 objArrayHandle dest(THREAD, dest_o);
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 dest->obj_at_put(0, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 dest->obj_at_put(1, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 dest->obj_at_put(2, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 return (jobjectArray) JNIHandles::make_local(dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1829
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 JVM_ENTRY(jint, JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 JVMWrapper("JVM_ConstantPoolGetIntAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 bounds_check(cp, index, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 if (!tag.is_int()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 return cp->int_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1842
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 JVM_ENTRY(jlong, JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 JVMWrapper("JVM_ConstantPoolGetLongAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 bounds_check(cp, index, CHECK_(0L));
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 if (!tag.is_long()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 return cp->long_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1855
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 JVM_ENTRY(jfloat, JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 JVMWrapper("JVM_ConstantPoolGetFloatAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 bounds_check(cp, index, CHECK_(0.0f));
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 if (!tag.is_float()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 return cp->float_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1868
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 JVM_ENTRY(jdouble, JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 JVMWrapper("JVM_ConstantPoolGetDoubleAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 bounds_check(cp, index, CHECK_(0.0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 if (!tag.is_double()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 return cp->double_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1881
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 JVM_ENTRY(jstring, JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 JVMWrapper("JVM_ConstantPoolGetStringAt");
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 if (!tag.is_string() && !tag.is_unresolved_string()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 oop str = cp->string_at(index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 return (jstring) JNIHandles::make_local(str);
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1895
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 JVM_ENTRY(jstring, JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 JVMWrapper("JVM_ConstantPoolGetUTF8At");
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 bounds_check(cp, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 if (!tag.is_symbol()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 symbolOop sym_o = cp->symbol_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 symbolHandle sym(THREAD, sym_o);
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 return (jstring) JNIHandles::make_local(str());
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1912
a61af66fc99e Initial load
duke
parents:
diff changeset
1913
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 // Assertion support. //////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1915
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 JVM_ENTRY(jboolean, JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 JVMWrapper("JVM_DesiredAssertionStatus");
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 assert(cls != NULL, "bad class");
a61af66fc99e Initial load
duke
parents:
diff changeset
1919
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 oop r = JNIHandles::resolve(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 if (java_lang_Class::is_primitive(r)) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1923
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 klassOop k = java_lang_Class::as_klassOop(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 assert(Klass::cast(k)->oop_is_instance(), "must be an instance klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 if (! Klass::cast(k)->oop_is_instance()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1927
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 const char* name = Klass::cast(k)->name()->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 bool system_class = Klass::cast(k)->class_loader() == NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 return JavaAssertions::enabled(name, system_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
1932
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1934
a61af66fc99e Initial load
duke
parents:
diff changeset
1935
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 // Return a new AssertionStatusDirectives object with the fields filled in with
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 // command-line assertion arguments (i.e., -ea, -da).
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 JVM_ENTRY(jobject, JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused))
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 JVMWrapper("JVM_AssertionStatusDirectives");
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 return JNIHandles::make_local(env, asd);
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1944
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 // Verification ////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1946
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 // Reflection for the verifier /////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
1948
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 // RedefineClasses support: bug 6214132 caused verification to fail.
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 // All functions from this section should call the jvmtiThreadSate function:
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 // klassOop class_to_verify_considering_redefinition(klassOop klass).
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 // The function returns a klassOop of the _scratch_class if the verifier
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 // was invoked in the middle of the class redefinition.
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 // Otherwise it returns its argument value which is the _the_class klassOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 // Please, refer to the description in the jvmtiThreadSate.hpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
1956
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 JVMWrapper("JVM_GetClassNameUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 return Klass::cast(k)->name()->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1963
a61af66fc99e Initial load
duke
parents:
diff changeset
1964
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 JVM_QUICK_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types))
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 JVMWrapper("JVM_GetClassCPTypes");
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 // types will have length zero if this is not an instanceKlass
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 // (length is determined by call to JVM_GetClassCPEntriesCount)
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 if (Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 for (int index = cp->length() - 1; index >= 0; index--) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 constantTag tag = cp->tag_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 types[index] = (tag.is_unresolved_klass()) ? JVM_CONSTANT_Class :
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 (tag.is_unresolved_string()) ? JVM_CONSTANT_String : tag.value();
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1980
a61af66fc99e Initial load
duke
parents:
diff changeset
1981
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 JVM_QUICK_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 JVMWrapper("JVM_GetClassCPEntriesCount");
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 if (!Klass::cast(k)->oop_is_instance())
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 return instanceKlass::cast(k)->constants()->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
1990
a61af66fc99e Initial load
duke
parents:
diff changeset
1991
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 JVM_QUICK_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 JVMWrapper("JVM_GetClassFieldsCount");
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 if (!Klass::cast(k)->oop_is_instance())
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 return instanceKlass::cast(k)->fields()->length() / instanceKlass::next_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2000
a61af66fc99e Initial load
duke
parents:
diff changeset
2001
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 JVMWrapper("JVM_GetClassMethodsCount");
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 if (!Klass::cast(k)->oop_is_instance())
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 return instanceKlass::cast(k)->methods()->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2010
a61af66fc99e Initial load
duke
parents:
diff changeset
2011
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 // The following methods, used for the verifier, are never called with
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 // array klasses, so a direct cast to instanceKlass is safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 // Typically, these methods are called in a loop with bounds determined
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 // by the results of JVM_GetClass{Fields,Methods}Count, which return
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 // zero for arrays.
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions))
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 JVMWrapper("JVM_GetMethodIxExceptionIndexes");
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 int length = methodOop(method)->checked_exceptions_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 if (length > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 CheckedExceptionElement* table= methodOop(method)->checked_exceptions_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 for (int i = 0; i < length; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 exceptions[i] = table[i].class_cp_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2030
a61af66fc99e Initial load
duke
parents:
diff changeset
2031
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 JVMWrapper("JVM_GetMethodIxExceptionsCount");
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 return methodOop(method)->checked_exceptions_length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2039
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 JVM_QUICK_ENTRY(void, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code))
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 JVMWrapper("JVM_GetMethodIxByteCode");
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 memcpy(code, methodOop(method)->code_base(), methodOop(method)->code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2048
a61af66fc99e Initial load
duke
parents:
diff changeset
2049
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 JVMWrapper("JVM_GetMethodIxByteCodeLength");
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 return methodOop(method)->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2057
a61af66fc99e Initial load
duke
parents:
diff changeset
2058
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry))
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 JVMWrapper("JVM_GetMethodIxExceptionTableEntry");
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 typeArrayOop extable = methodOop(method)->exception_table();
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 entry->start_pc = extable->int_at(entry_index * 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 entry->end_pc = extable->int_at(entry_index * 4 + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 entry->handler_pc = extable->int_at(entry_index * 4 + 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 entry->catchType = extable->int_at(entry_index * 4 + 3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2070
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 JVMWrapper("JVM_GetMethodIxExceptionTableLength");
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 return methodOop(method)->exception_table()->length() / 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2079
a61af66fc99e Initial load
duke
parents:
diff changeset
2080
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 JVMWrapper("JVM_GetMethodIxModifiers");
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 return methodOop(method)->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2088
a61af66fc99e Initial load
duke
parents:
diff changeset
2089
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 JVM_QUICK_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 JVMWrapper("JVM_GetFieldIxModifiers");
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 typeArrayOop fields = instanceKlass::cast(k)->fields();
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 return fields->ushort_at(field_index * instanceKlass::next_offset + instanceKlass::access_flags_offset) & JVM_RECOGNIZED_FIELD_MODIFIERS;
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2097
a61af66fc99e Initial load
duke
parents:
diff changeset
2098
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 JVMWrapper("JVM_GetMethodIxLocalsCount");
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 return methodOop(method)->max_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2106
a61af66fc99e Initial load
duke
parents:
diff changeset
2107
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 JVMWrapper("JVM_GetMethodIxArgsSize");
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 return methodOop(method)->size_of_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2115
a61af66fc99e Initial load
duke
parents:
diff changeset
2116
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 JVMWrapper("JVM_GetMethodIxMaxStack");
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 return methodOop(method)->max_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2124
a61af66fc99e Initial load
duke
parents:
diff changeset
2125
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 JVM_QUICK_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 JVMWrapper("JVM_IsConstructorIx");
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 return methodOop(method)->name() == vmSymbols::object_initializer_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2134
a61af66fc99e Initial load
duke
parents:
diff changeset
2135
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 JVM_ENTRY(const char*, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 JVMWrapper("JVM_GetMethodIxIxUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 return methodOop(method)->name()->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2143
a61af66fc99e Initial load
duke
parents:
diff changeset
2144
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 JVM_ENTRY(const char*, JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 JVMWrapper("JVM_GetMethodIxSignatureUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 return methodOop(method)->signature()->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2152
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 * All of these JVM_GetCP-xxx methods are used by the old verifier to
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 * read entries in the constant pool. Since the old verifier always
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 * works on a copy of the code, it will not see any rewriting that
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 * may possibly occur in the middle of verification. So it is important
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 * that nothing it calls tries to use the cpCache instead of the raw
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 * constant pool, so we must use cp->uncached_x methods when appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 */
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 JVM_ENTRY(const char*, JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 JVMWrapper("JVM_GetCPFieldNameUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 case JVM_CONSTANT_Fieldref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 return cp->uncached_name_ref_at(cp_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 fatal("JVM_GetCPFieldNameUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2175
a61af66fc99e Initial load
duke
parents:
diff changeset
2176
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 JVM_ENTRY(const char*, JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 JVMWrapper("JVM_GetCPMethodNameUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 case JVM_CONSTANT_InterfaceMethodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 case JVM_CONSTANT_Methodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 return cp->uncached_name_ref_at(cp_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 fatal("JVM_GetCPMethodNameUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2192
a61af66fc99e Initial load
duke
parents:
diff changeset
2193
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 JVM_ENTRY(const char*, JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 JVMWrapper("JVM_GetCPMethodSignatureUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 case JVM_CONSTANT_InterfaceMethodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 case JVM_CONSTANT_Methodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 return cp->uncached_signature_ref_at(cp_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 fatal("JVM_GetCPMethodSignatureUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2209
a61af66fc99e Initial load
duke
parents:
diff changeset
2210
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 JVM_ENTRY(const char*, JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 JVMWrapper("JVM_GetCPFieldSignatureUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 case JVM_CONSTANT_Fieldref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 return cp->uncached_signature_ref_at(cp_index)->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 fatal("JVM_GetCPFieldSignatureUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2225
a61af66fc99e Initial load
duke
parents:
diff changeset
2226
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 JVM_ENTRY(const char*, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 JVMWrapper("JVM_GetCPClassNameUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 symbolOop classname = cp->klass_name_at(cp_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 return classname->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2235
a61af66fc99e Initial load
duke
parents:
diff changeset
2236
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 JVM_ENTRY(const char*, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 JVMWrapper("JVM_GetCPFieldClassNameUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 case JVM_CONSTANT_Fieldref: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 int class_index = cp->uncached_klass_ref_index_at(cp_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 symbolOop classname = cp->klass_name_at(class_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 return classname->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 fatal("JVM_GetCPFieldClassNameUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2254
a61af66fc99e Initial load
duke
parents:
diff changeset
2255
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 JVM_ENTRY(const char*, JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 JVMWrapper("JVM_GetCPMethodClassNameUTF");
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 case JVM_CONSTANT_Methodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 case JVM_CONSTANT_InterfaceMethodref: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 int class_index = cp->uncached_klass_ref_index_at(cp_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 symbolOop classname = cp->klass_name_at(class_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 return classname->as_utf8();
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 fatal("JVM_GetCPMethodClassNameUTF: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2274
a61af66fc99e Initial load
duke
parents:
diff changeset
2275
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 JVM_QUICK_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 JVMWrapper("JVM_GetCPFieldModifiers");
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 klassOop k_called = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(called_cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 constantPoolOop cp_called = instanceKlass::cast(k_called)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 case JVM_CONSTANT_Fieldref: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 symbolOop name = cp->uncached_name_ref_at(cp_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 symbolOop signature = cp->uncached_signature_ref_at(cp_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 typeArrayOop fields = instanceKlass::cast(k_called)->fields();
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 int fields_count = fields->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 for (int i = 0; i < fields_count; i += instanceKlass::next_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 if (cp_called->symbol_at(fields->ushort_at(i + instanceKlass::name_index_offset)) == name &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 cp_called->symbol_at(fields->ushort_at(i + instanceKlass::signature_index_offset)) == signature) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 return fields->ushort_at(i + instanceKlass::access_flags_offset) & JVM_RECOGNIZED_FIELD_MODIFIERS;
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 fatal("JVM_GetCPFieldModifiers: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2304
a61af66fc99e Initial load
duke
parents:
diff changeset
2305
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 JVM_QUICK_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 JVMWrapper("JVM_GetCPMethodModifiers");
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 klassOop k_called = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(called_cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 constantPoolOop cp = instanceKlass::cast(k)->constants();
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 switch (cp->tag_at(cp_index).value()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 case JVM_CONSTANT_Methodref:
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 case JVM_CONSTANT_InterfaceMethodref: {
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 symbolOop name = cp->uncached_name_ref_at(cp_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 symbolOop signature = cp->uncached_signature_ref_at(cp_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 objArrayOop methods = instanceKlass::cast(k_called)->methods();
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 int methods_count = methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 for (int i = 0; i < methods_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 methodOop method = methodOop(methods->obj_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 if (method->name() == name && method->signature() == signature) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 fatal("JVM_GetCPMethodModifiers: illegal constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2334
a61af66fc99e Initial load
duke
parents:
diff changeset
2335
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 // Misc //////////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2337
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 JVM_LEAF(void, JVM_ReleaseUTF(const char *utf))
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2341
a61af66fc99e Initial load
duke
parents:
diff changeset
2342
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 JVM_ENTRY(jboolean, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2))
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 JVMWrapper("JVM_IsSameClassPackage");
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 oop class1_mirror = JNIHandles::resolve_non_null(class1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 oop class2_mirror = JNIHandles::resolve_non_null(class2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 klassOop klass1 = java_lang_Class::as_klassOop(class1_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 klassOop klass2 = java_lang_Class::as_klassOop(class2_mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 return (jboolean) Reflection::is_same_class_package(klass1, klass2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2351
a61af66fc99e Initial load
duke
parents:
diff changeset
2352
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 // IO functions ////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2354
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 JVM_LEAF(jint, JVM_Open(const char *fname, jint flags, jint mode))
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 JVMWrapper2("JVM_Open (%s)", fname);
a61af66fc99e Initial load
duke
parents:
diff changeset
2357
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 int result = hpi::open(fname, flags, mode);
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 if (result >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 switch(errno) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 case EEXIST:
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 return JVM_EEXIST;
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2371
a61af66fc99e Initial load
duke
parents:
diff changeset
2372
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 JVM_LEAF(jint, JVM_Close(jint fd))
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 JVMWrapper2("JVM_Close (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 return hpi::close(fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2378
a61af66fc99e Initial load
duke
parents:
diff changeset
2379
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 JVM_LEAF(jint, JVM_Read(jint fd, char *buf, jint nbytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 JVMWrapper2("JVM_Read (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2382
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 return (jint)hpi::read(fd, buf, nbytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2386
a61af66fc99e Initial load
duke
parents:
diff changeset
2387
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 JVM_LEAF(jint, JVM_Write(jint fd, char *buf, jint nbytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 JVMWrapper2("JVM_Write (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2390
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 return (jint)hpi::write(fd, buf, nbytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2394
a61af66fc99e Initial load
duke
parents:
diff changeset
2395
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 JVM_LEAF(jint, JVM_Available(jint fd, jlong *pbytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 JVMWrapper2("JVM_Available (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 return hpi::available(fd, pbytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2401
a61af66fc99e Initial load
duke
parents:
diff changeset
2402
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 JVM_LEAF(jlong, JVM_Lseek(jint fd, jlong offset, jint whence))
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 JVMWrapper4("JVM_Lseek (0x%x, %Ld, %d)", fd, offset, whence);
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 return hpi::lseek(fd, offset, whence);
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2408
a61af66fc99e Initial load
duke
parents:
diff changeset
2409
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 JVM_LEAF(jint, JVM_SetLength(jint fd, jlong length))
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 JVMWrapper3("JVM_SetLength (0x%x, %Ld)", fd, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 return hpi::ftruncate(fd, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2414
a61af66fc99e Initial load
duke
parents:
diff changeset
2415
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 JVM_LEAF(jint, JVM_Sync(jint fd))
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 JVMWrapper2("JVM_Sync (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 return hpi::fsync(fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2421
a61af66fc99e Initial load
duke
parents:
diff changeset
2422
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 // Printing support //////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
2425
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 // see bug 4399518, 4417214
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 if ((intptr_t)count <= 0) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 return vsnprintf(str, count, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2431
a61af66fc99e Initial load
duke
parents:
diff changeset
2432
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 int jio_snprintf(char *str, size_t count, const char *fmt, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 int len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 va_start(args, fmt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 len = jio_vsnprintf(str, count, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 return len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2441
a61af66fc99e Initial load
duke
parents:
diff changeset
2442
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 int jio_fprintf(FILE* f, const char *fmt, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 int len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 va_start(args, fmt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 len = jio_vfprintf(f, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 return len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2451
a61af66fc99e Initial load
duke
parents:
diff changeset
2452
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 int jio_vfprintf(FILE* f, const char *fmt, va_list args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 if (Arguments::vfprintf_hook() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 return Arguments::vfprintf_hook()(f, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 return vfprintf(f, fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2460
a61af66fc99e Initial load
duke
parents:
diff changeset
2461
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 int jio_printf(const char *fmt, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 int len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 va_list args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 va_start(args, fmt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 len = jio_vfprintf(defaultStream::output_stream(), fmt, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 va_end(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 return len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2470
a61af66fc99e Initial load
duke
parents:
diff changeset
2471
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 // HotSpot specific jio method
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 void jio_print(const char* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 // Try to make this function as atomic as possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 if (Arguments::vfprintf_hook() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 jio_fprintf(defaultStream::output_stream(), "%s", s);
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 ::write(defaultStream::output_fd(), s, (int)strlen(s));
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2481
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 } // Extern C
a61af66fc99e Initial load
duke
parents:
diff changeset
2483
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 // java.lang.Thread //////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2485
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 // In most of the JVM Thread support functions we need to be sure to lock the Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 // to prevent the target thread from exiting after we have a pointer to the C++ Thread or
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 // OSThread objects. The exception to this rule is when the target object is the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 // doing the operation, in which case we know that the thread won't exit until the
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 // operation is done (all exits being voluntary). There are a few cases where it is
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 // rather silly to do operations on yourself, like resuming yourself or asking whether
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 // you are alive. While these can still happen, they are not subject to deadlocks if
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 // the lock is held while the operation occurs (this is not the case for suspend, for
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 // instance), and are very unlikely. Because IsAlive needs to be fast and its
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 // implementation is local to this file, we always lock Threads_lock for that one.
a61af66fc99e Initial load
duke
parents:
diff changeset
2496
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 static void thread_entry(JavaThread* thread, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 HandleMark hm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 Handle obj(THREAD, thread->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 KlassHandle(THREAD, SystemDictionary::thread_klass()),
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 vmSymbolHandles::run_method_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 vmSymbolHandles::void_method_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2508
a61af66fc99e Initial load
duke
parents:
diff changeset
2509
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 JVMWrapper("JVM_StartThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 JavaThread *native_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2513
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 // We cannot hold the Threads_lock when we throw an exception,
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 // due to rank ordering issues. Example: we might need to grab the
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 // Heap_lock while we construct the exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 bool throw_illegal_thread_state = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2518
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 // We must release the Threads_lock before we can post a jvmti event
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 // in Thread::start.
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 // Ensure that the C++ Thread and OSThread structures aren't freed before
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 // we operate.
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2525
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 // Check to see if we're running a thread that's already exited or was
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 // stopped (is_stillborn) or is still active (thread is not NULL).
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 if (java_lang_Thread::is_stillborn(JNIHandles::resolve_non_null(jthread)) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread)) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 throw_illegal_thread_state = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 jlong size =
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 java_lang_Thread::stackSize(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 // Allocate the C++ Thread structure and create the native thread. The
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 // stack size retrieved from java is signed, but the constructor takes
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 // size_t (an unsigned type), so avoid passing negative values which would
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 // result in really large stacks.
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 size_t sz = size > 0 ? (size_t) size : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 native_thread = new JavaThread(&thread_entry, sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
2540
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 // At this point it may be possible that no osthread was created for the
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 // JavaThread due to lack of memory. Check for this situation and throw
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 // an exception if necessary. Eventually we may want to change this so
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 // that we only grab the lock if the thread was created successfully -
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 // then we can also do this check and throw the exception in the
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 // JavaThread constructor.
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 if (native_thread->osthread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 // Note: the current thread is not being used within "prepare".
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 native_thread->prepare(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2553
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 if (throw_illegal_thread_state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 THROW(vmSymbols::java_lang_IllegalThreadStateException());
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2557
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 assert(native_thread != NULL, "Starting null thread?");
a61af66fc99e Initial load
duke
parents:
diff changeset
2559
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 if (native_thread->osthread() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 // No one should hold a reference to the 'native_thread'.
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 delete native_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 if (JvmtiExport::should_post_resource_exhausted()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 JvmtiExport::post_resource_exhausted(
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS,
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 "unable to create new native thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 "unable to create new native thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2571
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 Thread::start(native_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2573
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2575
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 // JVM_Stop is implemented using a VM_Operation, so threads are forced to safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 // before the quasi-asynchronous exception is delivered. This is a little obtrusive,
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 // but is thought to be reliable and simple. In the case, where the receiver is the
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 // save thread as the sender, no safepoint is needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 JVM_ENTRY(void, JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable))
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 JVMWrapper("JVM_StopThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2582
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 oop java_throwable = JNIHandles::resolve(throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 if (java_throwable == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 JavaThread* receiver = java_lang_Thread::thread(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 Events::log("JVM_StopThread thread JavaThread " INTPTR_FORMAT " as oop " INTPTR_FORMAT " [exception " INTPTR_FORMAT "]", receiver, (address)java_thread, throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 // First check if thread already exited
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 if (receiver != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 // Check if exception is getting thrown at self (use oop equality, since the
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 // target object might exit)
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 if (java_thread == thread->threadObj()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 // This is a change from JDK 1.1, but JDK 1.2 will also do it:
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 // NOTE (from JDK 1.2): this is done solely to prevent stopped
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 // threads from being restarted.
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 // Fix for 4314342, 4145910, perhaps others: it now doesn't have
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 // any effect on the "liveness" of a thread; see
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 // JVM_IsThreadAlive, below.
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 if (java_throwable->is_a(SystemDictionary::threaddeath_klass())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 java_lang_Thread::set_stillborn(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 THROW_OOP(java_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 // Enques a VM_Operation to stop all threads and then deliver the exception...
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 Thread::send_async_exception(java_thread, JNIHandles::resolve(throwable));
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2611
a61af66fc99e Initial load
duke
parents:
diff changeset
2612
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 JVM_ENTRY(jboolean, JVM_IsThreadAlive(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 JVMWrapper("JVM_IsThreadAlive");
a61af66fc99e Initial load
duke
parents:
diff changeset
2615
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 oop thread_oop = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 return java_lang_Thread::is_alive(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2619
a61af66fc99e Initial load
duke
parents:
diff changeset
2620
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 JVM_ENTRY(void, JVM_SuspendThread(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 JVMWrapper("JVM_SuspendThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 JavaThread* receiver = java_lang_Thread::thread(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2625
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 if (receiver != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 // thread has run and has not exited (still on threads list)
a61af66fc99e Initial load
duke
parents:
diff changeset
2628
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 MutexLockerEx ml(receiver->SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 if (receiver->is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 // Don't allow nested external suspend requests. We can't return
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 // an error from this interface so just ignore the problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 if (receiver->is_exiting()) { // thread is in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 receiver->set_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2641
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 // java_suspend() will catch threads in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 // and will ignore them.
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 receiver->java_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2645
a61af66fc99e Initial load
duke
parents:
diff changeset
2646 // It would be nice to have the following assertion in all the
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 // time, but it is possible for a racing resume request to have
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 // resumed this thread right after we suspended it. Temporarily
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 // enable this assertion if you are chasing a different kind of
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 // bug.
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 // assert(java_lang_Thread::thread(receiver->threadObj()) == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 // receiver->is_being_ext_suspended(), "thread is not suspended");
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2656
a61af66fc99e Initial load
duke
parents:
diff changeset
2657
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 JVM_ENTRY(void, JVM_ResumeThread(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 JVMWrapper("JVM_ResumeThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate.
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 // We need to *always* get the threads lock here, since this operation cannot be allowed during
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 // a safepoint. The safepoint code relies on suspending a thread to examine its state. If other
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 // threads randomly resumes threads, then a thread might not be suspended when the safepoint code
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 // looks at it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 MutexLocker ml(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 if (thr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 // the thread has run and is not in the process of exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 thr->java_resume();
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2672
a61af66fc99e Initial load
duke
parents:
diff changeset
2673
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 JVM_ENTRY(void, JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio))
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 JVMWrapper("JVM_SetThreadPriority");
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 MutexLocker ml(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 java_lang_Thread::set_priority(java_thread, (ThreadPriority)prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 JavaThread* thr = java_lang_Thread::thread(java_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 if (thr != NULL) { // Thread not yet started; priority pushed down when it is
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 Thread::set_priority(thr, (ThreadPriority)prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2685
a61af66fc99e Initial load
duke
parents:
diff changeset
2686
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 JVMWrapper("JVM_Yield");
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 if (os::dont_yield()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 // Critical for similar threading behaviour
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 if (ConvertYieldToSleep) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 os::sleep(thread, MinSleepInterval, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 os::yield();
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2698
a61af66fc99e Initial load
duke
parents:
diff changeset
2699
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 JVMWrapper("JVM_Sleep");
a61af66fc99e Initial load
duke
parents:
diff changeset
2702
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 if (millis < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2706
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 if (Thread::is_interrupted (THREAD, true) && !HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2710
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 // Save current thread state and restore it at the end of this block.
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 // And set new thread state to SLEEPING.
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 JavaThreadSleepState jtss(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2714
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 if (millis == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 // When ConvertSleepToYield is on, this matches the classic VM implementation of
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 // JVM_Sleep. Critical for similar threading behaviour (Win32)
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 // It appears that in certain GUI contexts, it may be beneficial to do a short sleep
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 // for SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 if (ConvertSleepToYield) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 os::yield();
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 ThreadState old_state = thread->osthread()->get_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 thread->osthread()->set_state(SLEEPING);
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 os::sleep(thread, MinSleepInterval, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 thread->osthread()->set_state(old_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 ThreadState old_state = thread->osthread()->get_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 thread->osthread()->set_state(SLEEPING);
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 if (os::sleep(thread, millis, true) == OS_INTRPT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 // us while we were sleeping. We do not overwrite those.
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 if (!HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 // to properly restore the thread state. That's likely wrong.
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 thread->osthread()->set_state(old_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2743
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 JVMWrapper("JVM_CurrentThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 oop jthread = thread->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 assert (thread != NULL, "no current thread!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 return JNIHandles::make_local(env, jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2750
a61af66fc99e Initial load
duke
parents:
diff changeset
2751
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 JVM_ENTRY(jint, JVM_CountStackFrames(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 JVMWrapper("JVM_CountStackFrames");
a61af66fc99e Initial load
duke
parents:
diff changeset
2754
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2757 bool throw_illegal_thread_state = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 int count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2759
a61af66fc99e Initial load
duke
parents:
diff changeset
2760 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 // We need to re-resolve the java_thread, since a GC might have happened during the
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 // acquire of the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
2765
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 if (thr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 // do nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 } else if(! thr->is_external_suspend() || ! thr->frame_anchor()->walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 // Check whether this java thread has been suspended already. If not, throws
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 // IllegalThreadStateException. We defer to throw that exception until
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 // Threads_lock is released since loading exception class has to leave VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 // The correct way to test a thread is actually suspended is
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 // wait_for_ext_suspend_completion(), but we can't call that while holding
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 // the Threads_lock. The above tests are sufficient for our purposes
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 // provided the walkability of the stack is stable - which it isn't
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 // 100% but close enough for most practical purposes.
a61af66fc99e Initial load
duke
parents:
diff changeset
2777 throw_illegal_thread_state = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2778 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 // Count all java activation, i.e., number of vframes
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 for(vframeStream vfst(thr); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 // Native frames are not counted
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 if (!vfst.method()->is_native()) count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2786
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 if (throw_illegal_thread_state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2788 THROW_MSG_0(vmSymbols::java_lang_IllegalThreadStateException(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 "this thread is not suspended");
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2793
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 // Consider: A better way to implement JVM_Interrupt() is to acquire
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 // Threads_lock to resolve the jthread into a Thread pointer, fetch
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 // Thread->platformevent, Thread->native_thr, Thread->parker, etc.,
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 // drop Threads_lock, and the perform the unpark() and thr_kill() operations
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 // outside the critical section. Threads_lock is hot so we want to minimize
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 // the hold-time. A cleaner interface would be to decompose interrupt into
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 // two steps. The 1st phase, performed under Threads_lock, would return
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 // a closure that'd be invoked after Threads_lock was dropped.
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 // This tactic is safe as PlatformEvent and Parkers are type-stable (TSM) and
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 // admit spurious wakeups.
a61af66fc99e Initial load
duke
parents:
diff changeset
2804
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 JVMWrapper("JVM_Interrupt");
a61af66fc99e Initial load
duke
parents:
diff changeset
2807
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 // We need to re-resolve the java_thread, since a GC might have happened during the
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 // acquire of the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 if (thr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 Thread::interrupt(thr);
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2818
a61af66fc99e Initial load
duke
parents:
diff changeset
2819
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 JVM_QUICK_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted))
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 JVMWrapper("JVM_IsInterrupted");
a61af66fc99e Initial load
duke
parents:
diff changeset
2822
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 oop java_thread = JNIHandles::resolve_non_null(jthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 // We need to re-resolve the java_thread, since a GC might have happened during the
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 // acquire of the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 if (thr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 return (jboolean) Thread::is_interrupted(thr, clear_interrupted != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2835
a61af66fc99e Initial load
duke
parents:
diff changeset
2836
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 // Return true iff the current thread has locked the object passed in
a61af66fc99e Initial load
duke
parents:
diff changeset
2838
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 JVMWrapper("JVM_HoldsLock");
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 assert(THREAD->is_Java_thread(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 if (obj == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2843 THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 Handle h_obj(THREAD, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 return ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, h_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2847 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2848
a61af66fc99e Initial load
duke
parents:
diff changeset
2849
a61af66fc99e Initial load
duke
parents:
diff changeset
2850 JVM_ENTRY(void, JVM_DumpAllStacks(JNIEnv* env, jclass))
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 JVMWrapper("JVM_DumpAllStacks");
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 VM_PrintThreads op;
a61af66fc99e Initial load
duke
parents:
diff changeset
2853 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 if (JvmtiExport::should_post_data_dump()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2855 JvmtiExport::post_data_dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2858
a61af66fc99e Initial load
duke
parents:
diff changeset
2859
a61af66fc99e Initial load
duke
parents:
diff changeset
2860 // java.lang.SecurityManager ///////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
2861
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 static bool is_trusted_frame(JavaThread* jthread, vframeStream* vfst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 assert(jthread->is_Java_thread(), "must be a Java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 if (jthread->privileged_stack_top() == NULL) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2865 if (jthread->privileged_stack_top()->frame_id() == vfst->frame_id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 oop loader = jthread->privileged_stack_top()->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 if (loader == NULL) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2868 bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
2869 if (trusted) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2873
a61af66fc99e Initial load
duke
parents:
diff changeset
2874 JVM_ENTRY(jclass, JVM_CurrentLoadedClass(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 JVMWrapper("JVM_CurrentLoadedClass");
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2877
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 // if a method in a class in a trusted loader is in a doPrivileged, return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 bool trusted = is_trusted_frame(thread, &vfst);
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 if (trusted) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2882
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 methodOop m = vfst.method();
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 if (!m->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 klassOop holder = m->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 oop loader = instanceKlass::cast(holder)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 return (jclass) JNIHandles::make_local(env, Klass::cast(holder)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
2889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2894
a61af66fc99e Initial load
duke
parents:
diff changeset
2895
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 JVM_ENTRY(jobject, JVM_CurrentClassLoader(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 JVMWrapper("JVM_CurrentClassLoader");
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2899
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2901
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 // if a method in a class in a trusted loader is in a doPrivileged, return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 bool trusted = is_trusted_frame(thread, &vfst);
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 if (trusted) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2905
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 methodOop m = vfst.method();
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 if (!m->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 klassOop holder = m->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
2909 assert(holder->is_klass(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
2910 oop loader = instanceKlass::cast(holder)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 return JNIHandles::make_local(env, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2915 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2916 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2917 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2918
a61af66fc99e Initial load
duke
parents:
diff changeset
2919
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 // Utility object for collecting method holders walking down the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 class KlassLink: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 KlassHandle klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
2924 KlassLink* next;
a61af66fc99e Initial load
duke
parents:
diff changeset
2925
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 KlassLink(KlassHandle k) { klass = k; next = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2927 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2928
a61af66fc99e Initial load
duke
parents:
diff changeset
2929
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 JVMWrapper("JVM_GetClassContext");
a61af66fc99e Initial load
duke
parents:
diff changeset
2932 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 // Collect linked list of (handles to) method holders
a61af66fc99e Initial load
duke
parents:
diff changeset
2935 KlassLink* first = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2936 KlassLink* last = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2937 int depth = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2938
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 for(vframeStream vfst(thread); !vfst.at_end(); vfst.security_get_caller_frame(1)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2940 // Native frames are not returned
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 if (!vfst.method()->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2942 klassOop holder = vfst.method()->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 assert(holder->is_klass(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
2944 depth++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2945 KlassLink* l = new KlassLink(KlassHandle(thread, holder));
a61af66fc99e Initial load
duke
parents:
diff changeset
2946 if (first == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 first = last = l;
a61af66fc99e Initial load
duke
parents:
diff changeset
2948 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2949 last->next = l;
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 last = l;
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2953 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2954
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 // Create result array of type [Ljava/lang/Class;
a61af66fc99e Initial load
duke
parents:
diff changeset
2956 objArrayOop result = oopFactory::new_objArray(SystemDictionary::class_klass(), depth, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2957 // Fill in mirrors corresponding to method holders
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 int index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 while (first != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2960 result->obj_at_put(index++, Klass::cast(first->klass())->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
2961 first = first->next;
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 assert(index == depth, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
2964
a61af66fc99e Initial load
duke
parents:
diff changeset
2965 return (jobjectArray) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2967
a61af66fc99e Initial load
duke
parents:
diff changeset
2968
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name))
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 JVMWrapper("JVM_ClassDepth");
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
2973 Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2974
a61af66fc99e Initial load
duke
parents:
diff changeset
2975 const char* str = java_lang_String::as_utf8_string(class_name_str());
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 symbolHandle class_name_sym =
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 symbolHandle(THREAD, SymbolTable::probe(str, (int)strlen(str)));
a61af66fc99e Initial load
duke
parents:
diff changeset
2978 if (class_name_sym.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2979 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2981
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 int depth = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2983
a61af66fc99e Initial load
duke
parents:
diff changeset
2984 for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 if (!vfst.method()->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 klassOop holder = vfst.method()->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 assert(holder->is_klass(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 if (instanceKlass::cast(holder)->name() == class_name_sym()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 return depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 depth++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
2996
a61af66fc99e Initial load
duke
parents:
diff changeset
2997
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 JVMWrapper("JVM_ClassLoaderDepth");
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 int depth = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 // if a method in a class in a trusted loader is in a doPrivileged, return -1
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 bool trusted = is_trusted_frame(thread, &vfst);
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 if (trusted) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3006
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 methodOop m = vfst.method();
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 if (!m->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 klassOop holder = m->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 assert(holder->is_klass(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3011 oop loader = instanceKlass::cast(holder)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
3012 if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 return depth;
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 depth++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3020
a61af66fc99e Initial load
duke
parents:
diff changeset
3021
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 // java.lang.Package ////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3023
a61af66fc99e Initial load
duke
parents:
diff changeset
3024
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 JVM_ENTRY(jstring, JVM_GetSystemPackage(JNIEnv *env, jstring name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 JVMWrapper("JVM_GetSystemPackage");
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3029 char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 oop result = ClassLoader::get_system_package(str, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 return (jstring) JNIHandles::make_local(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3033
a61af66fc99e Initial load
duke
parents:
diff changeset
3034
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 JVM_ENTRY(jobjectArray, JVM_GetSystemPackages(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 JVMWrapper("JVM_GetSystemPackages");
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 return (jobjectArray) JNIHandles::make_local(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3040 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3041
a61af66fc99e Initial load
duke
parents:
diff changeset
3042
a61af66fc99e Initial load
duke
parents:
diff changeset
3043 // ObjectInputStream ///////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3044
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 bool force_verify_field_access(klassOop current_class, klassOop field_class, AccessFlags access, bool classloader_only) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3046 if (current_class == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3047 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3048 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3049 if ((current_class == field_class) || access.is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3050 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3052
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 if (access.is_protected()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3054 // See if current_class is a subclass of field_class
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 if (Klass::cast(current_class)->is_subclass_of(field_class)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3056 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3057 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3058 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3059
a61af66fc99e Initial load
duke
parents:
diff changeset
3060 return (!access.is_private() && instanceKlass::cast(current_class)->is_same_class_package(field_class));
a61af66fc99e Initial load
duke
parents:
diff changeset
3061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3062
a61af66fc99e Initial load
duke
parents:
diff changeset
3063
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 // JVM_AllocateNewObject and JVM_AllocateNewArray are unused as of 1.4
a61af66fc99e Initial load
duke
parents:
diff changeset
3065 JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 JVMWrapper("JVM_AllocateNewObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
3067 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3068 // Receiver is not used
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 oop curr_mirror = JNIHandles::resolve_non_null(currClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 oop init_mirror = JNIHandles::resolve_non_null(initClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3071
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 // Cannot instantiate primitive types
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 if (java_lang_Class::is_primitive(curr_mirror) || java_lang_Class::is_primitive(init_mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 THROW_0(vmSymbols::java_lang_InvalidClassException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3077
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 // Arrays not allowed here, must use JVM_AllocateNewArray
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 if (Klass::cast(java_lang_Class::as_klassOop(curr_mirror))->oop_is_javaArray() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 Klass::cast(java_lang_Class::as_klassOop(init_mirror))->oop_is_javaArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3081 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 THROW_0(vmSymbols::java_lang_InvalidClassException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3084
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 instanceKlassHandle curr_klass (THREAD, java_lang_Class::as_klassOop(curr_mirror));
a61af66fc99e Initial load
duke
parents:
diff changeset
3086 instanceKlassHandle init_klass (THREAD, java_lang_Class::as_klassOop(init_mirror));
a61af66fc99e Initial load
duke
parents:
diff changeset
3087
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 assert(curr_klass->is_subclass_of(init_klass()), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3089
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 // Interfaces, abstract classes, and java.lang.Class classes cannot be instantiated directly.
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 curr_klass->check_valid_for_instantiation(false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3092
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 // Make sure klass is initialized, since we are about to instantiate one of them.
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 curr_klass->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3095
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 methodHandle m (THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
3097 init_klass->find_method(vmSymbols::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 vmSymbols::void_method_signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3099 if (m.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3101 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 methodOopDesc::name_and_sig_as_C_string(Klass::cast(init_klass()),
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 vmSymbols::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3104 vmSymbols::void_method_signature()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3106
a61af66fc99e Initial load
duke
parents:
diff changeset
3107 if (curr_klass == init_klass && !m->is_public()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3108 // Calling the constructor for class 'curr_klass'.
a61af66fc99e Initial load
duke
parents:
diff changeset
3109 // Only allow calls to a public no-arg constructor.
a61af66fc99e Initial load
duke
parents:
diff changeset
3110 // This path corresponds to creating an Externalizable object.
a61af66fc99e Initial load
duke
parents:
diff changeset
3111 THROW_0(vmSymbols::java_lang_IllegalAccessException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3113
a61af66fc99e Initial load
duke
parents:
diff changeset
3114 if (!force_verify_field_access(curr_klass(), init_klass(), m->access_flags(), false)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 // subclass 'curr_klass' does not have access to no-arg constructor of 'initcb'
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 THROW_0(vmSymbols::java_lang_IllegalAccessException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3118
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 Handle obj = curr_klass->allocate_instance_handle(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 // Call constructor m. This might call a constructor higher up in the hierachy
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 JavaCalls::call_default_constructor(thread, m, obj, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3122
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 return JNIHandles::make_local(obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3125
a61af66fc99e Initial load
duke
parents:
diff changeset
3126
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 JVM_ENTRY(jobject, JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length))
a61af66fc99e Initial load
duke
parents:
diff changeset
3128 JVMWrapper("JVM_AllocateNewArray");
a61af66fc99e Initial load
duke
parents:
diff changeset
3129 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3130 oop mirror = JNIHandles::resolve_non_null(currClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3131
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 if (java_lang_Class::is_primitive(mirror)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 THROW_0(vmSymbols::java_lang_InvalidClassException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3135 klassOop k = java_lang_Class::as_klassOop(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
3136 oop result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3137
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 if (k->klass_part()->oop_is_typeArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 // typeArray
a61af66fc99e Initial load
duke
parents:
diff changeset
3140 result = typeArrayKlass::cast(k)->allocate(length, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3141 } else if (k->klass_part()->oop_is_objArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3142 // objArray
a61af66fc99e Initial load
duke
parents:
diff changeset
3143 objArrayKlassHandle oak(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
3144 oak->initialize(CHECK_NULL); // make sure class is initialized (matches Classic VM behavior)
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 result = oak->allocate(length, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3146 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3147 THROW_0(vmSymbols::java_lang_InvalidClassException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3149 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3150 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3151
a61af66fc99e Initial load
duke
parents:
diff changeset
3152
a61af66fc99e Initial load
duke
parents:
diff changeset
3153 // Return the first non-null class loader up the execution stack, or null
a61af66fc99e Initial load
duke
parents:
diff changeset
3154 // if only code from the null class loader is on the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
3155
a61af66fc99e Initial load
duke
parents:
diff changeset
3156 JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
a61af66fc99e Initial load
duke
parents:
diff changeset
3157 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3158 // UseNewReflection
a61af66fc99e Initial load
duke
parents:
diff changeset
3159 vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection
a61af66fc99e Initial load
duke
parents:
diff changeset
3160 klassOop holder = vfst.method()->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
3161 oop loader = instanceKlass::cast(holder)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
3162 if (loader != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 return JNIHandles::make_local(env, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3166 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3168
a61af66fc99e Initial load
duke
parents:
diff changeset
3169
a61af66fc99e Initial load
duke
parents:
diff changeset
3170 // Load a class relative to the most recent class on the stack with a non-null
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 // classloader.
a61af66fc99e Initial load
duke
parents:
diff changeset
3172 // This function has been deprecated and should not be considered part of the
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 // specified JVM interface.
a61af66fc99e Initial load
duke
parents:
diff changeset
3174
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 JVM_ENTRY(jclass, JVM_LoadClass0(JNIEnv *env, jobject receiver,
a61af66fc99e Initial load
duke
parents:
diff changeset
3176 jclass currClass, jstring currClassName))
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 JVMWrapper("JVM_LoadClass0");
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 // Receiver is not used
a61af66fc99e Initial load
duke
parents:
diff changeset
3179 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3180
a61af66fc99e Initial load
duke
parents:
diff changeset
3181 // Class name argument is not guaranteed to be in internal format
a61af66fc99e Initial load
duke
parents:
diff changeset
3182 Handle classname (THREAD, JNIHandles::resolve_non_null(currClassName));
a61af66fc99e Initial load
duke
parents:
diff changeset
3183 Handle string = java_lang_String::internalize_classname(classname, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3184
a61af66fc99e Initial load
duke
parents:
diff changeset
3185 const char* str = java_lang_String::as_utf8_string(string());
a61af66fc99e Initial load
duke
parents:
diff changeset
3186
a61af66fc99e Initial load
duke
parents:
diff changeset
3187 if (str == NULL || (int)strlen(str) > symbolOopDesc::max_length()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3188 // It's impossible to create this class; the name cannot fit
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 // into the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), str);
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3192
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 symbolHandle name = oopFactory::new_symbol_handle(str, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 Handle curr_klass (THREAD, JNIHandles::resolve(currClass));
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 // Find the most recent class on the stack with a non-null classloader
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 oop loader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3197 oop protection_domain = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 if (curr_klass.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 for (vframeStream vfst(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 !vfst.at_end() && loader == NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 vfst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 if (!vfst.method()->is_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 klassOop holder = vfst.method()->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 loader = instanceKlass::cast(holder)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 protection_domain = instanceKlass::cast(holder)->protection_domain();
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3209 klassOop curr_klass_oop = java_lang_Class::as_klassOop(curr_klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
3210 loader = instanceKlass::cast(curr_klass_oop)->class_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 protection_domain = instanceKlass::cast(curr_klass_oop)->protection_domain();
a61af66fc99e Initial load
duke
parents:
diff changeset
3212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 Handle h_loader(THREAD, loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 Handle h_prot (THREAD, protection_domain);
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 return find_class_from_class_loader(env, name, true, h_loader, h_prot,
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 false, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3218
a61af66fc99e Initial load
duke
parents:
diff changeset
3219
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 // Array ///////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3221
a61af66fc99e Initial load
duke
parents:
diff changeset
3222
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 // resolve array handle and check arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
3224 static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 if (arr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 THROW_0(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3228 oop a = JNIHandles::resolve_non_null(arr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 if (!a->is_javaArray() || (type_array_only && !a->is_typeArray())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array");
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 return arrayOop(a);
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3234
a61af66fc99e Initial load
duke
parents:
diff changeset
3235
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 JVM_ENTRY(jint, JVM_GetArrayLength(JNIEnv *env, jobject arr))
a61af66fc99e Initial load
duke
parents:
diff changeset
3237 JVMWrapper("JVM_GetArrayLength");
a61af66fc99e Initial load
duke
parents:
diff changeset
3238 arrayOop a = check_array(env, arr, false, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 return a->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3241
a61af66fc99e Initial load
duke
parents:
diff changeset
3242
a61af66fc99e Initial load
duke
parents:
diff changeset
3243 JVM_ENTRY(jobject, JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index))
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 JVMWrapper("JVM_Array_Get");
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 arrayOop a = check_array(env, arr, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3248 BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3249 oop box = Reflection::box(&value, type, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 return JNIHandles::make_local(env, box);
a61af66fc99e Initial load
duke
parents:
diff changeset
3251 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3252
a61af66fc99e Initial load
duke
parents:
diff changeset
3253
a61af66fc99e Initial load
duke
parents:
diff changeset
3254 JVM_ENTRY(jvalue, JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode))
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 JVMWrapper("JVM_GetPrimitiveArrayElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3257 value.i = 0; // to initialize value before getting used in CHECK
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 arrayOop a = check_array(env, arr, true, CHECK_(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 assert(a->is_typeArray(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3260 BasicType type = Reflection::array_get(&value, a, index, CHECK_(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 BasicType wide_type = (BasicType) wCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
3262 if (type != wide_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3263 Reflection::widen(&value, type, wide_type, CHECK_(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 return value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3267
a61af66fc99e Initial load
duke
parents:
diff changeset
3268
a61af66fc99e Initial load
duke
parents:
diff changeset
3269 JVM_ENTRY(void, JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val))
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 JVMWrapper("JVM_SetArrayElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 arrayOop a = check_array(env, arr, false, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 oop box = JNIHandles::resolve(val);
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 value.i = 0; // to initialize value before getting used in CHECK
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 BasicType value_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
3276 if (a->is_objArray()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3277 // Make sure we do no unbox e.g. java/lang/Integer instances when storing into an object array
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 value_type = Reflection::unbox_for_regular_object(box, &value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 value_type = Reflection::unbox_for_primitive(box, &value, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3282 Reflection::array_set(&value, a, index, value_type, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 JVM_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 JVM_ENTRY(void, JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode))
a61af66fc99e Initial load
duke
parents:
diff changeset
3287 JVMWrapper("JVM_SetPrimitiveArrayElement");
a61af66fc99e Initial load
duke
parents:
diff changeset
3288 arrayOop a = check_array(env, arr, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3289 assert(a->is_typeArray(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3290 BasicType value_type = (BasicType) vCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 Reflection::array_set(&v, a, index, value_type, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
3292 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3293
a61af66fc99e Initial load
duke
parents:
diff changeset
3294
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length))
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 JVMWrapper("JVM_NewArray");
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 oop element_mirror = JNIHandles::resolve(eltClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3299 oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3300 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3301 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3302
a61af66fc99e Initial load
duke
parents:
diff changeset
3303
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim))
a61af66fc99e Initial load
duke
parents:
diff changeset
3305 JVMWrapper("JVM_NewMultiArray");
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3307 arrayOop dim_array = check_array(env, dim, true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3308 oop element_mirror = JNIHandles::resolve(eltClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3309 assert(dim_array->is_typeArray(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3310 oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3311 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3312 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3313
a61af66fc99e Initial load
duke
parents:
diff changeset
3314
a61af66fc99e Initial load
duke
parents:
diff changeset
3315 // Networking library support ////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3316
a61af66fc99e Initial load
duke
parents:
diff changeset
3317 JVM_LEAF(jint, JVM_InitializeSocketLibrary())
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 JVMWrapper("JVM_InitializeSocketLibrary");
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 return hpi::initialize_socket_library();
a61af66fc99e Initial load
duke
parents:
diff changeset
3320 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3321
a61af66fc99e Initial load
duke
parents:
diff changeset
3322
a61af66fc99e Initial load
duke
parents:
diff changeset
3323 JVM_LEAF(jint, JVM_Socket(jint domain, jint type, jint protocol))
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 JVMWrapper("JVM_Socket");
a61af66fc99e Initial load
duke
parents:
diff changeset
3325 return hpi::socket(domain, type, protocol);
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3327
a61af66fc99e Initial load
duke
parents:
diff changeset
3328
a61af66fc99e Initial load
duke
parents:
diff changeset
3329 JVM_LEAF(jint, JVM_SocketClose(jint fd))
a61af66fc99e Initial load
duke
parents:
diff changeset
3330 JVMWrapper2("JVM_SocketClose (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3332 return hpi::socket_close(fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3333 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3334
a61af66fc99e Initial load
duke
parents:
diff changeset
3335
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 JVM_LEAF(jint, JVM_SocketShutdown(jint fd, jint howto))
a61af66fc99e Initial load
duke
parents:
diff changeset
3337 JVMWrapper2("JVM_SocketShutdown (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3338 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3339 return hpi::socket_shutdown(fd, howto);
a61af66fc99e Initial load
duke
parents:
diff changeset
3340 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3341
a61af66fc99e Initial load
duke
parents:
diff changeset
3342
a61af66fc99e Initial load
duke
parents:
diff changeset
3343 JVM_LEAF(jint, JVM_Recv(jint fd, char *buf, jint nBytes, jint flags))
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 JVMWrapper2("JVM_Recv (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 return hpi::recv(fd, buf, nBytes, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3348
a61af66fc99e Initial load
duke
parents:
diff changeset
3349
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 JVM_LEAF(jint, JVM_Send(jint fd, char *buf, jint nBytes, jint flags))
a61af66fc99e Initial load
duke
parents:
diff changeset
3351 JVMWrapper2("JVM_Send (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3353 return hpi::send(fd, buf, nBytes, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3355
a61af66fc99e Initial load
duke
parents:
diff changeset
3356
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 JVM_LEAF(jint, JVM_Timeout(int fd, long timeout))
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 JVMWrapper2("JVM_Timeout (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3359 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 return hpi::timeout(fd, timeout);
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3362
a61af66fc99e Initial load
duke
parents:
diff changeset
3363
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 JVM_LEAF(jint, JVM_Listen(jint fd, jint count))
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 JVMWrapper2("JVM_Listen (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 return hpi::listen(fd, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
3368 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3369
a61af66fc99e Initial load
duke
parents:
diff changeset
3370
a61af66fc99e Initial load
duke
parents:
diff changeset
3371 JVM_LEAF(jint, JVM_Connect(jint fd, struct sockaddr *him, jint len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3372 JVMWrapper2("JVM_Connect (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 return hpi::connect(fd, him, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3376
a61af66fc99e Initial load
duke
parents:
diff changeset
3377
a61af66fc99e Initial load
duke
parents:
diff changeset
3378 JVM_LEAF(jint, JVM_Bind(jint fd, struct sockaddr *him, jint len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 JVMWrapper2("JVM_Bind (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 return hpi::bind(fd, him, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3383
a61af66fc99e Initial load
duke
parents:
diff changeset
3384
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 JVM_LEAF(jint, JVM_Accept(jint fd, struct sockaddr *him, jint *len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 JVMWrapper2("JVM_Accept (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3387 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 return hpi::accept(fd, him, (int *)len);
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3390
a61af66fc99e Initial load
duke
parents:
diff changeset
3391
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 JVM_LEAF(jint, JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 JVMWrapper2("JVM_RecvFrom (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3395 return hpi::recvfrom(fd, buf, nBytes, flags, from, fromlen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3397
a61af66fc99e Initial load
duke
parents:
diff changeset
3398
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 JVM_LEAF(jint, JVM_GetSockName(jint fd, struct sockaddr *him, int *len))
a61af66fc99e Initial load
duke
parents:
diff changeset
3400 JVMWrapper2("JVM_GetSockName (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3402 return hpi::get_sock_name(fd, him, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3404
a61af66fc99e Initial load
duke
parents:
diff changeset
3405
a61af66fc99e Initial load
duke
parents:
diff changeset
3406 JVM_LEAF(jint, JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 JVMWrapper2("JVM_SendTo (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 return hpi::sendto(fd, buf, len, flags, to, tolen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3410 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3411
a61af66fc99e Initial load
duke
parents:
diff changeset
3412
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 JVM_LEAF(jint, JVM_SocketAvailable(jint fd, jint *pbytes))
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 JVMWrapper2("JVM_SocketAvailable (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 return hpi::socket_available(fd, pbytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
3417 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3418
a61af66fc99e Initial load
duke
parents:
diff changeset
3419
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 JVM_LEAF(jint, JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 JVMWrapper2("JVM_GetSockOpt (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3423 return hpi::get_sock_opt(fd, level, optname, optval, optlen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3424 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3425
a61af66fc99e Initial load
duke
parents:
diff changeset
3426
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 JVM_LEAF(jint, JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3428 JVMWrapper2("JVM_GetSockOpt (0x%x)", fd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3429 //%note jvm_r6
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 return hpi::set_sock_opt(fd, level, optname, optval, optlen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3432
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 JVM_LEAF(int, JVM_GetHostName(char* name, int namelen))
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 JVMWrapper("JVM_GetHostName");
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 return hpi::get_host_name(name, namelen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3437
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 #ifdef _WINDOWS
a61af66fc99e Initial load
duke
parents:
diff changeset
3439
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 JVM_LEAF(struct hostent*, JVM_GetHostByAddr(const char* name, int len, int type))
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 JVMWrapper("JVM_GetHostByAddr");
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 return hpi::get_host_by_addr(name, len, type);
a61af66fc99e Initial load
duke
parents:
diff changeset
3443 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3444
a61af66fc99e Initial load
duke
parents:
diff changeset
3445
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 JVM_LEAF(struct hostent*, JVM_GetHostByName(char* name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 JVMWrapper("JVM_GetHostByName");
a61af66fc99e Initial load
duke
parents:
diff changeset
3448 return hpi::get_host_by_name(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3450
a61af66fc99e Initial load
duke
parents:
diff changeset
3451
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 JVM_LEAF(struct protoent*, JVM_GetProtoByName(char* name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3453 JVMWrapper("JVM_GetProtoByName");
a61af66fc99e Initial load
duke
parents:
diff changeset
3454 return hpi::get_proto_by_name(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3456
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3458
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 // Library support ///////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3460
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 //%note jvm_ct
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 JVMWrapper2("JVM_LoadLibrary (%s)", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 char ebuf[1024];
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 void *load_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 ThreadToNativeFromVM ttnfvm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 load_result = hpi::dll_load(name, ebuf, sizeof ebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 if (load_result == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 char msg[1024];
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3473 // Since 'ebuf' may contain a string encoded using
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 // platform encoding scheme, we need to pass
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 // Exceptions::unsafe_to_utf8 to the new_exception method
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 // as the last argument. See bug 6367357.
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 Handle h_exception =
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 Exceptions::new_exception(thread,
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 vmSymbols::java_lang_UnsatisfiedLinkError(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3480 msg, Exceptions::unsafe_to_utf8);
a61af66fc99e Initial load
duke
parents:
diff changeset
3481
a61af66fc99e Initial load
duke
parents:
diff changeset
3482 THROW_HANDLE_0(h_exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3484 return load_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3485 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3486
a61af66fc99e Initial load
duke
parents:
diff changeset
3487
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 JVM_LEAF(void, JVM_UnloadLibrary(void* handle))
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 JVMWrapper("JVM_UnloadLibrary");
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 hpi::dll_unload(handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3492
a61af66fc99e Initial load
duke
parents:
diff changeset
3493
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 JVM_LEAF(void*, JVM_FindLibraryEntry(void* handle, const char* name))
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 JVMWrapper2("JVM_FindLibraryEntry (%s)", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 return hpi::dll_lookup(handle, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3498
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 // Floating point support ////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3500
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 JVM_LEAF(jboolean, JVM_IsNaN(jdouble a))
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 JVMWrapper("JVM_IsNaN");
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 return g_isnan(a);
a61af66fc99e Initial load
duke
parents:
diff changeset
3504 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3505
a61af66fc99e Initial load
duke
parents:
diff changeset
3506
a61af66fc99e Initial load
duke
parents:
diff changeset
3507
a61af66fc99e Initial load
duke
parents:
diff changeset
3508 // JNI version ///////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3509
a61af66fc99e Initial load
duke
parents:
diff changeset
3510 JVM_LEAF(jboolean, JVM_IsSupportedJNIVersion(jint version))
a61af66fc99e Initial load
duke
parents:
diff changeset
3511 JVMWrapper2("JVM_IsSupportedJNIVersion (%d)", version);
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 return Threads::is_supported_jni_version_including_1_1(version);
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3514
a61af66fc99e Initial load
duke
parents:
diff changeset
3515
a61af66fc99e Initial load
duke
parents:
diff changeset
3516 // String support ///////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3517
a61af66fc99e Initial load
duke
parents:
diff changeset
3518 JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
a61af66fc99e Initial load
duke
parents:
diff changeset
3519 JVMWrapper("JVM_InternString");
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 if (str == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 oop string = JNIHandles::resolve_non_null(str);
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 oop result = StringTable::intern(string, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 return (jstring) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3526
a61af66fc99e Initial load
duke
parents:
diff changeset
3527
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 // Raw monitor support //////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3529
a61af66fc99e Initial load
duke
parents:
diff changeset
3530 // The lock routine below calls lock_without_safepoint_check in order to get a raw lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3531 // without interfering with the safepoint mechanism. The routines are not JVM_LEAF because
a61af66fc99e Initial load
duke
parents:
diff changeset
3532 // they might be called by non-java threads. The JVM_LEAF installs a NoHandleMark check
a61af66fc99e Initial load
duke
parents:
diff changeset
3533 // that only works with java threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
3534
a61af66fc99e Initial load
duke
parents:
diff changeset
3535
a61af66fc99e Initial load
duke
parents:
diff changeset
3536 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3537 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 JVMWrapper("JVM_RawMonitorCreate");
a61af66fc99e Initial load
duke
parents:
diff changeset
3539 return new Mutex(Mutex::native, "JVM_RawMonitorCreate");
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3541
a61af66fc99e Initial load
duke
parents:
diff changeset
3542
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3544 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 JVMWrapper("JVM_RawMonitorDestroy");
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 delete ((Mutex*) mon);
a61af66fc99e Initial load
duke
parents:
diff changeset
3547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3548
a61af66fc99e Initial load
duke
parents:
diff changeset
3549
a61af66fc99e Initial load
duke
parents:
diff changeset
3550 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3551 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 JVMWrapper("JVM_RawMonitorEnter");
a61af66fc99e Initial load
duke
parents:
diff changeset
3553 ((Mutex*) mon)->jvm_raw_lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3556
a61af66fc99e Initial load
duke
parents:
diff changeset
3557
a61af66fc99e Initial load
duke
parents:
diff changeset
3558 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 VM_Exit::block_if_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3560 JVMWrapper("JVM_RawMonitorExit");
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 ((Mutex*) mon)->jvm_raw_unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
3562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3563
a61af66fc99e Initial load
duke
parents:
diff changeset
3564
a61af66fc99e Initial load
duke
parents:
diff changeset
3565 // Support for Serialization
a61af66fc99e Initial load
duke
parents:
diff changeset
3566
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 typedef jfloat (JNICALL *IntBitsToFloatFn )(JNIEnv* env, jclass cb, jint value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3568 typedef jdouble (JNICALL *LongBitsToDoubleFn)(JNIEnv* env, jclass cb, jlong value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3569 typedef jint (JNICALL *FloatToIntBitsFn )(JNIEnv* env, jclass cb, jfloat value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3570 typedef jlong (JNICALL *DoubleToLongBitsFn)(JNIEnv* env, jclass cb, jdouble value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3571
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 static IntBitsToFloatFn int_bits_to_float_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3573 static LongBitsToDoubleFn long_bits_to_double_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3574 static FloatToIntBitsFn float_to_int_bits_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3575 static DoubleToLongBitsFn double_to_long_bits_fn = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3576
a61af66fc99e Initial load
duke
parents:
diff changeset
3577
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 void initialize_converter_functions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 if (JDK_Version::is_gte_jdk14x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3580 // These functions only exist for compatibility with 1.3.1 and earlier
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3583
a61af66fc99e Initial load
duke
parents:
diff changeset
3584 // called from universe_post_init()
a61af66fc99e Initial load
duke
parents:
diff changeset
3585 assert(
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 int_bits_to_float_fn == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 long_bits_to_double_fn == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 float_to_int_bits_fn == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 double_to_long_bits_fn == NULL ,
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 "initialization done twice"
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3592 // initialize
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 int_bits_to_float_fn = CAST_TO_FN_PTR(IntBitsToFloatFn , NativeLookup::base_library_lookup("java/lang/Float" , "intBitsToFloat" , "(I)F"));
a61af66fc99e Initial load
duke
parents:
diff changeset
3594 long_bits_to_double_fn = CAST_TO_FN_PTR(LongBitsToDoubleFn, NativeLookup::base_library_lookup("java/lang/Double", "longBitsToDouble", "(J)D"));
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 float_to_int_bits_fn = CAST_TO_FN_PTR(FloatToIntBitsFn , NativeLookup::base_library_lookup("java/lang/Float" , "floatToIntBits" , "(F)I"));
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 double_to_long_bits_fn = CAST_TO_FN_PTR(DoubleToLongBitsFn, NativeLookup::base_library_lookup("java/lang/Double", "doubleToLongBits", "(D)J"));
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 // verify
a61af66fc99e Initial load
duke
parents:
diff changeset
3598 assert(
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 int_bits_to_float_fn != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 long_bits_to_double_fn != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 float_to_int_bits_fn != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 double_to_long_bits_fn != NULL ,
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 "initialization failed"
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3606
a61af66fc99e Initial load
duke
parents:
diff changeset
3607
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 // Serialization
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 JVM_ENTRY(void, JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 jlongArray fieldIDs, jcharArray typecodes, jbyteArray data))
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 assert(!JDK_Version::is_gte_jdk14x_version(), "should only be used in 1.3.1 and earlier");
a61af66fc99e Initial load
duke
parents:
diff changeset
3612
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 typeArrayOop tcodes = typeArrayOop(JNIHandles::resolve(typecodes));
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 typeArrayOop dbuf = typeArrayOop(JNIHandles::resolve(data));
a61af66fc99e Initial load
duke
parents:
diff changeset
3615 typeArrayOop fids = typeArrayOop(JNIHandles::resolve(fieldIDs));
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 oop o = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
3617
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 if (o == NULL || fids == NULL || dbuf == NULL || tcodes == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3621
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 jsize nfids = fids->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 if (nfids == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3624
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 if (tcodes->length() < nfids) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3626 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3628
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 jsize off = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3630 /* loop through fields, setting values */
a61af66fc99e Initial load
duke
parents:
diff changeset
3631 for (jsize i = 0; i < nfids; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 jfieldID fid = (jfieldID)(intptr_t) fids->long_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 int field_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
3634 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 // NULL is a legal value for fid, but retrieving the field offset
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 // trigger assertion in that case
a61af66fc99e Initial load
duke
parents:
diff changeset
3637 field_offset = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
a61af66fc99e Initial load
duke
parents:
diff changeset
3638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3639
a61af66fc99e Initial load
duke
parents:
diff changeset
3640 switch (tcodes->char_at(i)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 case 'Z':
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 jboolean val = (dbuf->byte_at(off) != 0) ? JNI_TRUE : JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 o->bool_field_put(field_offset, val);
a61af66fc99e Initial load
duke
parents:
diff changeset
3645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 off++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3648
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 case 'B':
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 o->byte_field_put(field_offset, dbuf->byte_at(off));
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 off++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3655
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 case 'C':
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3658 jchar val = ((dbuf->byte_at(off + 0) & 0xFF) << 8)
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 + ((dbuf->byte_at(off + 1) & 0xFF) << 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 o->char_field_put(field_offset, val);
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 off += 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
3663 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3664
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 case 'S':
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 jshort val = ((dbuf->byte_at(off + 0) & 0xFF) << 8)
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 + ((dbuf->byte_at(off + 1) & 0xFF) << 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 o->short_field_put(field_offset, val);
a61af66fc99e Initial load
duke
parents:
diff changeset
3670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 off += 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3673
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 case 'I':
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 jint ival = ((dbuf->byte_at(off + 0) & 0xFF) << 24)
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 + ((dbuf->byte_at(off + 1) & 0xFF) << 16)
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 + ((dbuf->byte_at(off + 2) & 0xFF) << 8)
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 + ((dbuf->byte_at(off + 3) & 0xFF) << 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 o->int_field_put(field_offset, ival);
a61af66fc99e Initial load
duke
parents:
diff changeset
3681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3682 off += 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3684
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 case 'F':
a61af66fc99e Initial load
duke
parents:
diff changeset
3686 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 jint ival = ((dbuf->byte_at(off + 0) & 0xFF) << 24)
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 + ((dbuf->byte_at(off + 1) & 0xFF) << 16)
a61af66fc99e Initial load
duke
parents:
diff changeset
3689 + ((dbuf->byte_at(off + 2) & 0xFF) << 8)
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 + ((dbuf->byte_at(off + 3) & 0xFF) << 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3691 jfloat fval = (*int_bits_to_float_fn)(env, NULL, ival);
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 o->float_field_put(field_offset, fval);
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3694 off += 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3696
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 case 'J':
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3699 jlong lval = (((jlong) dbuf->byte_at(off + 0) & 0xFF) << 56)
a61af66fc99e Initial load
duke
parents:
diff changeset
3700 + (((jlong) dbuf->byte_at(off + 1) & 0xFF) << 48)
a61af66fc99e Initial load
duke
parents:
diff changeset
3701 + (((jlong) dbuf->byte_at(off + 2) & 0xFF) << 40)
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 + (((jlong) dbuf->byte_at(off + 3) & 0xFF) << 32)
a61af66fc99e Initial load
duke
parents:
diff changeset
3703 + (((jlong) dbuf->byte_at(off + 4) & 0xFF) << 24)
a61af66fc99e Initial load
duke
parents:
diff changeset
3704 + (((jlong) dbuf->byte_at(off + 5) & 0xFF) << 16)
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 + (((jlong) dbuf->byte_at(off + 6) & 0xFF) << 8)
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 + (((jlong) dbuf->byte_at(off + 7) & 0xFF) << 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 o->long_field_put(field_offset, lval);
a61af66fc99e Initial load
duke
parents:
diff changeset
3708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3709 off += 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
3710 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3711
a61af66fc99e Initial load
duke
parents:
diff changeset
3712 case 'D':
a61af66fc99e Initial load
duke
parents:
diff changeset
3713 if (fid != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3714 jlong lval = (((jlong) dbuf->byte_at(off + 0) & 0xFF) << 56)
a61af66fc99e Initial load
duke
parents:
diff changeset
3715 + (((jlong) dbuf->byte_at(off + 1) & 0xFF) << 48)
a61af66fc99e Initial load
duke
parents:
diff changeset
3716 + (((jlong) dbuf->byte_at(off + 2) & 0xFF) << 40)
a61af66fc99e Initial load
duke
parents:
diff changeset
3717 + (((jlong) dbuf->byte_at(off + 3) & 0xFF) << 32)
a61af66fc99e Initial load
duke
parents:
diff changeset
3718 + (((jlong) dbuf->byte_at(off + 4) & 0xFF) << 24)
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 + (((jlong) dbuf->byte_at(off + 5) & 0xFF) << 16)
a61af66fc99e Initial load
duke
parents:
diff changeset
3720 + (((jlong) dbuf->byte_at(off + 6) & 0xFF) << 8)
a61af66fc99e Initial load
duke
parents:
diff changeset
3721 + (((jlong) dbuf->byte_at(off + 7) & 0xFF) << 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3722 jdouble dval = (*long_bits_to_double_fn)(env, NULL, lval);
a61af66fc99e Initial load
duke
parents:
diff changeset
3723 o->double_field_put(field_offset, dval);
a61af66fc99e Initial load
duke
parents:
diff changeset
3724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3725 off += 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3727
a61af66fc99e Initial load
duke
parents:
diff changeset
3728 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
3729 // Illegal typecode
a61af66fc99e Initial load
duke
parents:
diff changeset
3730 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "illegal typecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
3731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3733 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3734
a61af66fc99e Initial load
duke
parents:
diff changeset
3735
a61af66fc99e Initial load
duke
parents:
diff changeset
3736 JVM_ENTRY(void, JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
3737 jlongArray fieldIDs, jcharArray typecodes, jbyteArray data))
a61af66fc99e Initial load
duke
parents:
diff changeset
3738 assert(!JDK_Version::is_gte_jdk14x_version(), "should only be used in 1.3.1 and earlier");
a61af66fc99e Initial load
duke
parents:
diff changeset
3739
a61af66fc99e Initial load
duke
parents:
diff changeset
3740 typeArrayOop tcodes = typeArrayOop(JNIHandles::resolve(typecodes));
a61af66fc99e Initial load
duke
parents:
diff changeset
3741 typeArrayOop dbuf = typeArrayOop(JNIHandles::resolve(data));
a61af66fc99e Initial load
duke
parents:
diff changeset
3742 typeArrayOop fids = typeArrayOop(JNIHandles::resolve(fieldIDs));
a61af66fc99e Initial load
duke
parents:
diff changeset
3743 oop o = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
3744
a61af66fc99e Initial load
duke
parents:
diff changeset
3745 if (o == NULL || fids == NULL || dbuf == NULL || tcodes == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3746 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3748
a61af66fc99e Initial load
duke
parents:
diff changeset
3749 jsize nfids = fids->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
3750 if (nfids == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3751
a61af66fc99e Initial load
duke
parents:
diff changeset
3752 if (tcodes->length() < nfids) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3753 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3755
a61af66fc99e Initial load
duke
parents:
diff changeset
3756 /* loop through fields, fetching values */
a61af66fc99e Initial load
duke
parents:
diff changeset
3757 jsize off = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3758 for (jsize i = 0; i < nfids; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3759 jfieldID fid = (jfieldID)(intptr_t) fids->long_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3760 if (fid == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3761 THROW(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3763 int field_offset = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
a61af66fc99e Initial load
duke
parents:
diff changeset
3764
a61af66fc99e Initial load
duke
parents:
diff changeset
3765 switch (tcodes->char_at(i)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3766 case 'Z':
a61af66fc99e Initial load
duke
parents:
diff changeset
3767 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3768 jboolean val = o->bool_field(field_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 dbuf->byte_at_put(off++, (val != 0) ? 1 : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3770 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3771 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3772
a61af66fc99e Initial load
duke
parents:
diff changeset
3773 case 'B':
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 dbuf->byte_at_put(off++, o->byte_field(field_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
3775 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3776
a61af66fc99e Initial load
duke
parents:
diff changeset
3777 case 'C':
a61af66fc99e Initial load
duke
parents:
diff changeset
3778 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3779 jchar val = o->char_field(field_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3780 dbuf->byte_at_put(off++, (val >> 8) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3781 dbuf->byte_at_put(off++, (val >> 0) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3784
a61af66fc99e Initial load
duke
parents:
diff changeset
3785 case 'S':
a61af66fc99e Initial load
duke
parents:
diff changeset
3786 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3787 jshort val = o->short_field(field_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3788 dbuf->byte_at_put(off++, (val >> 8) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3789 dbuf->byte_at_put(off++, (val >> 0) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3791 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3792
a61af66fc99e Initial load
duke
parents:
diff changeset
3793 case 'I':
a61af66fc99e Initial load
duke
parents:
diff changeset
3794 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3795 jint val = o->int_field(field_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3796 dbuf->byte_at_put(off++, (val >> 24) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3797 dbuf->byte_at_put(off++, (val >> 16) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3798 dbuf->byte_at_put(off++, (val >> 8) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3799 dbuf->byte_at_put(off++, (val >> 0) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3801 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3802
a61af66fc99e Initial load
duke
parents:
diff changeset
3803 case 'F':
a61af66fc99e Initial load
duke
parents:
diff changeset
3804 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3805 jfloat fval = o->float_field(field_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3806 jint ival = (*float_to_int_bits_fn)(env, NULL, fval);
a61af66fc99e Initial load
duke
parents:
diff changeset
3807 dbuf->byte_at_put(off++, (ival >> 24) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 dbuf->byte_at_put(off++, (ival >> 16) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3809 dbuf->byte_at_put(off++, (ival >> 8) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3810 dbuf->byte_at_put(off++, (ival >> 0) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3812 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3813
a61af66fc99e Initial load
duke
parents:
diff changeset
3814 case 'J':
a61af66fc99e Initial load
duke
parents:
diff changeset
3815 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3816 jlong val = o->long_field(field_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3817 dbuf->byte_at_put(off++, (val >> 56) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3818 dbuf->byte_at_put(off++, (val >> 48) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3819 dbuf->byte_at_put(off++, (val >> 40) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3820 dbuf->byte_at_put(off++, (val >> 32) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3821 dbuf->byte_at_put(off++, (val >> 24) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 dbuf->byte_at_put(off++, (val >> 16) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3823 dbuf->byte_at_put(off++, (val >> 8) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3824 dbuf->byte_at_put(off++, (val >> 0) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3825 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3826 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3827
a61af66fc99e Initial load
duke
parents:
diff changeset
3828 case 'D':
a61af66fc99e Initial load
duke
parents:
diff changeset
3829 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3830 jdouble dval = o->double_field(field_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3831 jlong lval = (*double_to_long_bits_fn)(env, NULL, dval);
a61af66fc99e Initial load
duke
parents:
diff changeset
3832 dbuf->byte_at_put(off++, (lval >> 56) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3833 dbuf->byte_at_put(off++, (lval >> 48) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3834 dbuf->byte_at_put(off++, (lval >> 40) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 dbuf->byte_at_put(off++, (lval >> 32) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3836 dbuf->byte_at_put(off++, (lval >> 24) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3837 dbuf->byte_at_put(off++, (lval >> 16) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3838 dbuf->byte_at_put(off++, (lval >> 8) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3839 dbuf->byte_at_put(off++, (lval >> 0) & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
3840 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3841 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3842
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
3844 // Illegal typecode
a61af66fc99e Initial load
duke
parents:
diff changeset
3845 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "illegal typecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
3846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3848 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3849
a61af66fc99e Initial load
duke
parents:
diff changeset
3850
a61af66fc99e Initial load
duke
parents:
diff changeset
3851 // Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3852
a61af66fc99e Initial load
duke
parents:
diff changeset
3853 jclass find_class_from_class_loader(JNIEnv* env, symbolHandle name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3854 // Security Note:
a61af66fc99e Initial load
duke
parents:
diff changeset
3855 // The Java level wrapper will perform the necessary security check allowing
a61af66fc99e Initial load
duke
parents:
diff changeset
3856 // us to pass the NULL as the initiating class loader.
a61af66fc99e Initial load
duke
parents:
diff changeset
3857 klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3858 KlassHandle klass_handle(THREAD, klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3859 // Check if we should initialize the class
a61af66fc99e Initial load
duke
parents:
diff changeset
3860 if (init && klass_handle->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3861 klass_handle->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
3864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3865
a61af66fc99e Initial load
duke
parents:
diff changeset
3866
a61af66fc99e Initial load
duke
parents:
diff changeset
3867 // Internal SQE debugging support ///////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
3868
a61af66fc99e Initial load
duke
parents:
diff changeset
3869 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3870
a61af66fc99e Initial load
duke
parents:
diff changeset
3871 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
3872 JNIEXPORT jboolean JNICALL JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get);
a61af66fc99e Initial load
duke
parents:
diff changeset
3873 JNIEXPORT jboolean JNICALL JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get);
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 JNIEXPORT void JNICALL JVM_VMBreakPoint(JNIEnv *env, jobject obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
3875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3876
a61af66fc99e Initial load
duke
parents:
diff changeset
3877 JVM_LEAF(jboolean, JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get))
a61af66fc99e Initial load
duke
parents:
diff changeset
3878 JVMWrapper("JVM_AccessBoolVMFlag");
a61af66fc99e Initial load
duke
parents:
diff changeset
3879 return is_get ? CommandLineFlags::boolAt((char*) name, (bool*) value) : CommandLineFlags::boolAtPut((char*) name, (bool*) value, INTERNAL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3881
a61af66fc99e Initial load
duke
parents:
diff changeset
3882 JVM_LEAF(jboolean, JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get))
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 JVMWrapper("JVM_AccessVMIntFlag");
a61af66fc99e Initial load
duke
parents:
diff changeset
3884 intx v;
a61af66fc99e Initial load
duke
parents:
diff changeset
3885 jboolean result = is_get ? CommandLineFlags::intxAt((char*) name, &v) : CommandLineFlags::intxAtPut((char*) name, &v, INTERNAL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3886 *value = (jint)v;
a61af66fc99e Initial load
duke
parents:
diff changeset
3887 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3888 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3889
a61af66fc99e Initial load
duke
parents:
diff changeset
3890
a61af66fc99e Initial load
duke
parents:
diff changeset
3891 JVM_ENTRY(void, JVM_VMBreakPoint(JNIEnv *env, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
3892 JVMWrapper("JVM_VMBreakPoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
3893 oop the_obj = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
3894 BREAKPOINT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3895 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3896
a61af66fc99e Initial load
duke
parents:
diff changeset
3897
a61af66fc99e Initial load
duke
parents:
diff changeset
3898 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3899
a61af66fc99e Initial load
duke
parents:
diff changeset
3900
a61af66fc99e Initial load
duke
parents:
diff changeset
3901 //---------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3902 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3903 // Support for old native code-based reflection (pre-JDK 1.4)
a61af66fc99e Initial load
duke
parents:
diff changeset
3904 // Disabled by default in the product build.
a61af66fc99e Initial load
duke
parents:
diff changeset
3905 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3906 // See reflection.hpp for information on SUPPORT_OLD_REFLECTION
a61af66fc99e Initial load
duke
parents:
diff changeset
3907 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3908 //---------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3909
a61af66fc99e Initial load
duke
parents:
diff changeset
3910 #ifdef SUPPORT_OLD_REFLECTION
a61af66fc99e Initial load
duke
parents:
diff changeset
3911
a61af66fc99e Initial load
duke
parents:
diff changeset
3912 JVM_ENTRY(jobjectArray, JVM_GetClassFields(JNIEnv *env, jclass cls, jint which))
a61af66fc99e Initial load
duke
parents:
diff changeset
3913 JVMWrapper("JVM_GetClassFields");
a61af66fc99e Initial load
duke
parents:
diff changeset
3914 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3915 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
3916 objArrayOop result = Reflection::reflect_fields(mirror, which, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3917 return (jobjectArray) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3918 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3919
a61af66fc99e Initial load
duke
parents:
diff changeset
3920
a61af66fc99e Initial load
duke
parents:
diff changeset
3921 JVM_ENTRY(jobjectArray, JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which))
a61af66fc99e Initial load
duke
parents:
diff changeset
3922 JVMWrapper("JVM_GetClassMethods");
a61af66fc99e Initial load
duke
parents:
diff changeset
3923 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3924 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
3925 objArrayOop result = Reflection::reflect_methods(mirror, which, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3926 //%note jvm_r4
a61af66fc99e Initial load
duke
parents:
diff changeset
3927 return (jobjectArray) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3928 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3929
a61af66fc99e Initial load
duke
parents:
diff changeset
3930
a61af66fc99e Initial load
duke
parents:
diff changeset
3931 JVM_ENTRY(jobjectArray, JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which))
a61af66fc99e Initial load
duke
parents:
diff changeset
3932 JVMWrapper("JVM_GetClassConstructors");
a61af66fc99e Initial load
duke
parents:
diff changeset
3933 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3934 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
3935 objArrayOop result = Reflection::reflect_constructors(mirror, which, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3936 //%note jvm_r4
a61af66fc99e Initial load
duke
parents:
diff changeset
3937 return (jobjectArray) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3938 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3939
a61af66fc99e Initial load
duke
parents:
diff changeset
3940
a61af66fc99e Initial load
duke
parents:
diff changeset
3941 JVM_ENTRY(jobject, JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which))
a61af66fc99e Initial load
duke
parents:
diff changeset
3942 JVMWrapper("JVM_GetClassField");
a61af66fc99e Initial load
duke
parents:
diff changeset
3943 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3944 if (name == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3945 Handle str (THREAD, JNIHandles::resolve_non_null(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
3946
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 const char* cstr = java_lang_String::as_utf8_string(str());
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 symbolHandle field_name =
a61af66fc99e Initial load
duke
parents:
diff changeset
3949 symbolHandle(THREAD, SymbolTable::probe(cstr, (int)strlen(cstr)));
a61af66fc99e Initial load
duke
parents:
diff changeset
3950 if (field_name.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3951 THROW_0(vmSymbols::java_lang_NoSuchFieldException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3952 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3953
a61af66fc99e Initial load
duke
parents:
diff changeset
3954 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
3955 oop result = Reflection::reflect_field(mirror, field_name(), which, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3956 if (result == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3957 THROW_0(vmSymbols::java_lang_NoSuchFieldException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3959 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3960 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3961
a61af66fc99e Initial load
duke
parents:
diff changeset
3962
a61af66fc99e Initial load
duke
parents:
diff changeset
3963 JVM_ENTRY(jobject, JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which))
a61af66fc99e Initial load
duke
parents:
diff changeset
3964 JVMWrapper("JVM_GetClassMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
3965 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3966 if (name == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3967 THROW_0(vmSymbols::java_lang_NullPointerException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3969 Handle str (THREAD, JNIHandles::resolve_non_null(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
3970
a61af66fc99e Initial load
duke
parents:
diff changeset
3971 const char* cstr = java_lang_String::as_utf8_string(str());
a61af66fc99e Initial load
duke
parents:
diff changeset
3972 symbolHandle method_name =
a61af66fc99e Initial load
duke
parents:
diff changeset
3973 symbolHandle(THREAD, SymbolTable::probe(cstr, (int)strlen(cstr)));
a61af66fc99e Initial load
duke
parents:
diff changeset
3974 if (method_name.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3975 THROW_0(vmSymbols::java_lang_NoSuchMethodException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3976 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3977
a61af66fc99e Initial load
duke
parents:
diff changeset
3978 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
3979 objArrayHandle tarray (THREAD, objArrayOop(JNIHandles::resolve(types)));
a61af66fc99e Initial load
duke
parents:
diff changeset
3980 oop result = Reflection::reflect_method(mirror, method_name, tarray,
a61af66fc99e Initial load
duke
parents:
diff changeset
3981 which, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3982 if (result == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3983 THROW_0(vmSymbols::java_lang_NoSuchMethodException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3984 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3985 return JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3986 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
3987
a61af66fc99e Initial load
duke
parents:
diff changeset
3988
a61af66fc99e Initial load
duke
parents:
diff changeset
3989 JVM_ENTRY(jobject, JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which))
a61af66fc99e Initial load
duke
parents:
diff changeset
3990 JVMWrapper("JVM_GetClassConstructor");
a61af66fc99e Initial load
duke
parents:
diff changeset
3991 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
3992 oop mirror = JNIHandles::resolve_non_null(cls);
a61af66fc99e Initial load
duke
parents:
diff changeset
3993 objArrayHandle tarray (THREAD, objArrayOop(JNIHandles::resolve(types)));
a61af66fc99e Initial load
duke
parents:
diff changeset
3994 oop result = Reflection::reflect_constructor(mirror, tarray, which, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3995 if (result == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3996 THROW_0(vmSymbols::java_lang_NoSuchMethodException());
a61af66fc99e Initial load
duke
parents:
diff changeset
3997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3998 return (jobject) JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
3999 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4000
a61af66fc99e Initial load
duke
parents:
diff changeset
4001
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 // Instantiation ///////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
4003
a61af66fc99e Initial load
duke
parents:
diff changeset
4004 JVM_ENTRY(jobject, JVM_NewInstance(JNIEnv *env, jclass cls))
a61af66fc99e Initial load
duke
parents:
diff changeset
4005 JVMWrapper("JVM_NewInstance");
a61af66fc99e Initial load
duke
parents:
diff changeset
4006 Handle mirror(THREAD, JNIHandles::resolve_non_null(cls));
a61af66fc99e Initial load
duke
parents:
diff changeset
4007
a61af66fc99e Initial load
duke
parents:
diff changeset
4008 methodOop resolved_constructor = java_lang_Class::resolved_constructor(mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
4009 if (resolved_constructor == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4010 klassOop k = java_lang_Class::as_klassOop(mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
4011 // The java.lang.Class object caches a resolved constructor if all the checks
a61af66fc99e Initial load
duke
parents:
diff changeset
4012 // below were done successfully and a constructor was found.
a61af66fc99e Initial load
duke
parents:
diff changeset
4013
a61af66fc99e Initial load
duke
parents:
diff changeset
4014 // Do class based checks
a61af66fc99e Initial load
duke
parents:
diff changeset
4015 if (java_lang_Class::is_primitive(mirror())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4016 const char* msg = "";
a61af66fc99e Initial load
duke
parents:
diff changeset
4017 if (mirror == Universe::bool_mirror()) msg = "java/lang/Boolean";
a61af66fc99e Initial load
duke
parents:
diff changeset
4018 else if (mirror == Universe::char_mirror()) msg = "java/lang/Character";
a61af66fc99e Initial load
duke
parents:
diff changeset
4019 else if (mirror == Universe::float_mirror()) msg = "java/lang/Float";
a61af66fc99e Initial load
duke
parents:
diff changeset
4020 else if (mirror == Universe::double_mirror()) msg = "java/lang/Double";
a61af66fc99e Initial load
duke
parents:
diff changeset
4021 else if (mirror == Universe::byte_mirror()) msg = "java/lang/Byte";
a61af66fc99e Initial load
duke
parents:
diff changeset
4022 else if (mirror == Universe::short_mirror()) msg = "java/lang/Short";
a61af66fc99e Initial load
duke
parents:
diff changeset
4023 else if (mirror == Universe::int_mirror()) msg = "java/lang/Integer";
a61af66fc99e Initial load
duke
parents:
diff changeset
4024 else if (mirror == Universe::long_mirror()) msg = "java/lang/Long";
a61af66fc99e Initial load
duke
parents:
diff changeset
4025 THROW_MSG_0(vmSymbols::java_lang_NullPointerException(), msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
4026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4027
a61af66fc99e Initial load
duke
parents:
diff changeset
4028 // Check whether we are allowed to instantiate this class
a61af66fc99e Initial load
duke
parents:
diff changeset
4029 Klass::cast(k)->check_valid_for_instantiation(false, CHECK_NULL); // Array classes get caught here
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 instanceKlassHandle klass(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
4031 // Make sure class is initialized (also so all methods are rewritten)
a61af66fc99e Initial load
duke
parents:
diff changeset
4032 klass->initialize(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4033
a61af66fc99e Initial load
duke
parents:
diff changeset
4034 // Lookup default constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
4035 resolved_constructor = klass->find_method(vmSymbols::object_initializer_name(), vmSymbols::void_method_signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
4036 if (resolved_constructor == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4037 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4038 THROW_MSG_0(vmSymbols::java_lang_InstantiationException(), klass->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4040
a61af66fc99e Initial load
duke
parents:
diff changeset
4041 // Cache result in java.lang.Class object. Does not have to be MT safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
4042 java_lang_Class::set_resolved_constructor(mirror(), resolved_constructor);
a61af66fc99e Initial load
duke
parents:
diff changeset
4043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4044
a61af66fc99e Initial load
duke
parents:
diff changeset
4045 assert(resolved_constructor != NULL, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
4046 methodHandle constructor = methodHandle(THREAD, resolved_constructor);
a61af66fc99e Initial load
duke
parents:
diff changeset
4047
a61af66fc99e Initial load
duke
parents:
diff changeset
4048 // We have an initialized instanceKlass with a default constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
4049 instanceKlassHandle klass(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4050 assert(klass->is_initialized() || klass->is_being_initialized(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
4051
a61af66fc99e Initial load
duke
parents:
diff changeset
4052 // Do security check
a61af66fc99e Initial load
duke
parents:
diff changeset
4053 klassOop caller_klass = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4054 if (UsePrivilegedStack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4055 caller_klass = thread->security_get_caller_class(2);
a61af66fc99e Initial load
duke
parents:
diff changeset
4056
a61af66fc99e Initial load
duke
parents:
diff changeset
4057 if (!Reflection::verify_class_access(caller_klass, klass(), false) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
4058 !Reflection::verify_field_access(caller_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
4059 klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4060 klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4061 constructor->access_flags(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4062 false,
a61af66fc99e Initial load
duke
parents:
diff changeset
4063 true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4064 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4065 THROW_MSG_0(vmSymbols::java_lang_IllegalAccessException(), klass->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4068
a61af66fc99e Initial load
duke
parents:
diff changeset
4069 // Allocate object and call constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
4070 Handle receiver = klass->allocate_instance_handle(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4071 JavaCalls::call_default_constructor(thread, constructor, receiver, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4072
a61af66fc99e Initial load
duke
parents:
diff changeset
4073 jobject res = JNIHandles::make_local(env, receiver());
a61af66fc99e Initial load
duke
parents:
diff changeset
4074 if (JvmtiExport::should_post_vm_object_alloc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4075 JvmtiExport::post_vm_object_alloc(JavaThread::current(), receiver());
a61af66fc99e Initial load
duke
parents:
diff changeset
4076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4077 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
4078 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4079
a61af66fc99e Initial load
duke
parents:
diff changeset
4080
a61af66fc99e Initial load
duke
parents:
diff changeset
4081 // Field ////////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
4082
a61af66fc99e Initial load
duke
parents:
diff changeset
4083 JVM_ENTRY(jobject, JVM_GetField(JNIEnv *env, jobject field, jobject obj))
a61af66fc99e Initial load
duke
parents:
diff changeset
4084 JVMWrapper("JVM_GetField");
a61af66fc99e Initial load
duke
parents:
diff changeset
4085 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
4086 Handle field_mirror(thread, JNIHandles::resolve(field));
a61af66fc99e Initial load
duke
parents:
diff changeset
4087 Handle receiver (thread, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
4088 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
4089 Reflection::resolve_field(field_mirror, receiver, &fd, false, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4090 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
4091 BasicType type = Reflection::field_get(&value, &fd, receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
4092 oop box = Reflection::box(&value, type, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4093 return JNIHandles::make_local(env, box);
a61af66fc99e Initial load
duke
parents:
diff changeset
4094 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4095
a61af66fc99e Initial load
duke
parents:
diff changeset
4096
a61af66fc99e Initial load
duke
parents:
diff changeset
4097 JVM_ENTRY(jvalue, JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode))
a61af66fc99e Initial load
duke
parents:
diff changeset
4098 JVMWrapper("JVM_GetPrimitiveField");
a61af66fc99e Initial load
duke
parents:
diff changeset
4099 Handle field_mirror(thread, JNIHandles::resolve(field));
a61af66fc99e Initial load
duke
parents:
diff changeset
4100 Handle receiver (thread, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
4101 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
4102 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
4103 value.j = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
4104 Reflection::resolve_field(field_mirror, receiver, &fd, false, CHECK_(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
4105 BasicType type = Reflection::field_get(&value, &fd, receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
4106 BasicType wide_type = (BasicType) wCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
4107 if (type != wide_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4108 Reflection::widen(&value, type, wide_type, CHECK_(value));
a61af66fc99e Initial load
duke
parents:
diff changeset
4109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4110 return value;
a61af66fc99e Initial load
duke
parents:
diff changeset
4111 JVM_END // should really be JVM_END, but that doesn't work for union types!
a61af66fc99e Initial load
duke
parents:
diff changeset
4112
a61af66fc99e Initial load
duke
parents:
diff changeset
4113
a61af66fc99e Initial load
duke
parents:
diff changeset
4114 JVM_ENTRY(void, JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val))
a61af66fc99e Initial load
duke
parents:
diff changeset
4115 JVMWrapper("JVM_SetField");
a61af66fc99e Initial load
duke
parents:
diff changeset
4116 Handle field_mirror(thread, JNIHandles::resolve(field));
a61af66fc99e Initial load
duke
parents:
diff changeset
4117 Handle receiver (thread, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
4118 oop box = JNIHandles::resolve(val);
a61af66fc99e Initial load
duke
parents:
diff changeset
4119 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
4120 Reflection::resolve_field(field_mirror, receiver, &fd, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
4121 BasicType field_type = fd.field_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
4122 jvalue value;
a61af66fc99e Initial load
duke
parents:
diff changeset
4123 BasicType value_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
4124 if (field_type == T_OBJECT || field_type == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4125 // Make sure we do no unbox e.g. java/lang/Integer instances when storing into an object array
a61af66fc99e Initial load
duke
parents:
diff changeset
4126 value_type = Reflection::unbox_for_regular_object(box, &value);
a61af66fc99e Initial load
duke
parents:
diff changeset
4127 Reflection::field_set(&value, &fd, receiver, field_type, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
4128 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4129 value_type = Reflection::unbox_for_primitive(box, &value, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
4130 Reflection::field_set(&value, &fd, receiver, value_type, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
4131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4132 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4133
a61af66fc99e Initial load
duke
parents:
diff changeset
4134
a61af66fc99e Initial load
duke
parents:
diff changeset
4135 JVM_ENTRY(void, JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode))
a61af66fc99e Initial load
duke
parents:
diff changeset
4136 JVMWrapper("JVM_SetPrimitiveField");
a61af66fc99e Initial load
duke
parents:
diff changeset
4137 Handle field_mirror(thread, JNIHandles::resolve(field));
a61af66fc99e Initial load
duke
parents:
diff changeset
4138 Handle receiver (thread, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
4139 fieldDescriptor fd;
a61af66fc99e Initial load
duke
parents:
diff changeset
4140 Reflection::resolve_field(field_mirror, receiver, &fd, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
4141 BasicType value_type = (BasicType) vCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
4142 Reflection::field_set(&v, &fd, receiver, value_type, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
4143 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4144
a61af66fc99e Initial load
duke
parents:
diff changeset
4145
a61af66fc99e Initial load
duke
parents:
diff changeset
4146 // Method ///////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
4147
a61af66fc99e Initial load
duke
parents:
diff changeset
4148 JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0))
a61af66fc99e Initial load
duke
parents:
diff changeset
4149 JVMWrapper("JVM_InvokeMethod");
a61af66fc99e Initial load
duke
parents:
diff changeset
4150 Handle method_handle;
a61af66fc99e Initial load
duke
parents:
diff changeset
4151 if (thread->stack_available((address) &method_handle) >= JVMInvokeMethodSlack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4152 method_handle = Handle(THREAD, JNIHandles::resolve(method));
a61af66fc99e Initial load
duke
parents:
diff changeset
4153 Handle receiver(THREAD, JNIHandles::resolve(obj));
a61af66fc99e Initial load
duke
parents:
diff changeset
4154 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4155 oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4156 jobject res = JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4157 if (JvmtiExport::should_post_vm_object_alloc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4158 oop ret_type = java_lang_reflect_Method::return_type(method_handle());
a61af66fc99e Initial load
duke
parents:
diff changeset
4159 assert(ret_type != NULL, "sanity check: ret_type oop must not be NULL!");
a61af66fc99e Initial load
duke
parents:
diff changeset
4160 if (java_lang_Class::is_primitive(ret_type)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4161 // Only for primitive type vm allocates memory for java object.
a61af66fc99e Initial load
duke
parents:
diff changeset
4162 // See box() method.
a61af66fc99e Initial load
duke
parents:
diff changeset
4163 JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4166 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
4167 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4168 THROW_0(vmSymbols::java_lang_StackOverflowError());
a61af66fc99e Initial load
duke
parents:
diff changeset
4169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4170 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4171
a61af66fc99e Initial load
duke
parents:
diff changeset
4172
a61af66fc99e Initial load
duke
parents:
diff changeset
4173 JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0))
a61af66fc99e Initial load
duke
parents:
diff changeset
4174 JVMWrapper("JVM_NewInstanceFromConstructor");
a61af66fc99e Initial load
duke
parents:
diff changeset
4175 oop constructor_mirror = JNIHandles::resolve(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
4176 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4177 oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4178 jobject res = JNIHandles::make_local(env, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4179 if (JvmtiExport::should_post_vm_object_alloc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4180 JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
a61af66fc99e Initial load
duke
parents:
diff changeset
4181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4182 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
4183 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4184
a61af66fc99e Initial load
duke
parents:
diff changeset
4185 #endif /* SUPPORT_OLD_REFLECTION */
a61af66fc99e Initial load
duke
parents:
diff changeset
4186
a61af66fc99e Initial load
duke
parents:
diff changeset
4187 // Atomic ///////////////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
4188
a61af66fc99e Initial load
duke
parents:
diff changeset
4189 JVM_LEAF(jboolean, JVM_SupportsCX8())
a61af66fc99e Initial load
duke
parents:
diff changeset
4190 JVMWrapper("JVM_SupportsCX8");
a61af66fc99e Initial load
duke
parents:
diff changeset
4191 return VM_Version::supports_cx8();
a61af66fc99e Initial load
duke
parents:
diff changeset
4192 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4193
a61af66fc99e Initial load
duke
parents:
diff changeset
4194
a61af66fc99e Initial load
duke
parents:
diff changeset
4195 JVM_ENTRY(jboolean, JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal))
a61af66fc99e Initial load
duke
parents:
diff changeset
4196 JVMWrapper("JVM_CX8Field");
a61af66fc99e Initial load
duke
parents:
diff changeset
4197 jlong res;
a61af66fc99e Initial load
duke
parents:
diff changeset
4198 oop o = JNIHandles::resolve(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
4199 intptr_t fldOffs = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
a61af66fc99e Initial load
duke
parents:
diff changeset
4200 volatile jlong* addr = (volatile jlong*)((address)o + fldOffs);
a61af66fc99e Initial load
duke
parents:
diff changeset
4201
a61af66fc99e Initial load
duke
parents:
diff changeset
4202 assert(VM_Version::supports_cx8(), "cx8 not supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
4203 res = Atomic::cmpxchg(newVal, addr, oldVal);
a61af66fc99e Initial load
duke
parents:
diff changeset
4204
a61af66fc99e Initial load
duke
parents:
diff changeset
4205 return res == oldVal;
a61af66fc99e Initial load
duke
parents:
diff changeset
4206 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4207
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4208 // DTrace ///////////////////////////////////////////////////////////////////
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4209
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4210 JVM_ENTRY(jint, JVM_DTraceGetVersion(JNIEnv* env))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4211 JVMWrapper("JVM_DTraceGetVersion");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4212 return (jint)JVM_TRACING_DTRACE_VERSION;
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4213 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4214
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4215 JVM_ENTRY(jlong,JVM_DTraceActivate(
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4216 JNIEnv* env, jint version, jstring module_name, jint providers_count,
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4217 JVM_DTraceProvider* providers))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4218 JVMWrapper("JVM_DTraceActivate");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4219 return DTraceJSDT::activate(
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4220 version, module_name, providers_count, providers, CHECK_0);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4221 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4222
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4223 JVM_ENTRY(jboolean,JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4224 JVMWrapper("JVM_DTraceIsProbeEnabled");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4225 return DTraceJSDT::is_probe_enabled(method);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4226 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4227
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4228 JVM_ENTRY(void,JVM_DTraceDispose(JNIEnv* env, jlong handle))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4229 JVMWrapper("JVM_DTraceDispose");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4230 DTraceJSDT::dispose(handle);
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4231 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4232
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4233 JVM_ENTRY(jboolean,JVM_DTraceIsSupported(JNIEnv* env))
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4234 JVMWrapper("JVM_DTraceIsSupported");
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4235 return DTraceJSDT::is_supported();
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4236 JVM_END
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4237
0
a61af66fc99e Initial load
duke
parents:
diff changeset
4238 // Returns an array of all live Thread objects (VM internal JavaThreads,
a61af66fc99e Initial load
duke
parents:
diff changeset
4239 // jvmti agent threads, and JNI attaching threads are skipped)
a61af66fc99e Initial load
duke
parents:
diff changeset
4240 // See CR 6404306 regarding JNI attaching threads
a61af66fc99e Initial load
duke
parents:
diff changeset
4241 JVM_ENTRY(jobjectArray, JVM_GetAllThreads(JNIEnv *env, jclass dummy))
a61af66fc99e Initial load
duke
parents:
diff changeset
4242 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4243 ThreadsListEnumerator tle(THREAD, false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
4244 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
4245
a61af66fc99e Initial load
duke
parents:
diff changeset
4246 int num_threads = tle.num_threads();
a61af66fc99e Initial load
duke
parents:
diff changeset
4247 objArrayOop r = oopFactory::new_objArray(SystemDictionary::thread_klass(), num_threads, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4248 objArrayHandle threads_ah(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4249
a61af66fc99e Initial load
duke
parents:
diff changeset
4250 for (int i = 0; i < num_threads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4251 Handle h = tle.get_threadObj(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
4252 threads_ah->obj_at_put(i, h());
a61af66fc99e Initial load
duke
parents:
diff changeset
4253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4254
a61af66fc99e Initial load
duke
parents:
diff changeset
4255 return (jobjectArray) JNIHandles::make_local(env, threads_ah());
a61af66fc99e Initial load
duke
parents:
diff changeset
4256 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4257
a61af66fc99e Initial load
duke
parents:
diff changeset
4258
a61af66fc99e Initial load
duke
parents:
diff changeset
4259 // Support for java.lang.Thread.getStackTrace() and getAllStackTraces() methods
a61af66fc99e Initial load
duke
parents:
diff changeset
4260 // Return StackTraceElement[][], each element is the stack trace of a thread in
a61af66fc99e Initial load
duke
parents:
diff changeset
4261 // the corresponding entry in the given threads array
a61af66fc99e Initial load
duke
parents:
diff changeset
4262 JVM_ENTRY(jobjectArray, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads))
a61af66fc99e Initial load
duke
parents:
diff changeset
4263 JVMWrapper("JVM_DumpThreads");
a61af66fc99e Initial load
duke
parents:
diff changeset
4264 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
4265
a61af66fc99e Initial load
duke
parents:
diff changeset
4266 // Check if threads is null
a61af66fc99e Initial load
duke
parents:
diff changeset
4267 if (threads == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4268 THROW_(vmSymbols::java_lang_NullPointerException(), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4270
a61af66fc99e Initial load
duke
parents:
diff changeset
4271 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(threads));
a61af66fc99e Initial load
duke
parents:
diff changeset
4272 objArrayHandle ah(THREAD, a);
a61af66fc99e Initial load
duke
parents:
diff changeset
4273 int num_threads = ah->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
4274 // check if threads is non-empty array
a61af66fc99e Initial load
duke
parents:
diff changeset
4275 if (num_threads == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4276 THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4278
a61af66fc99e Initial load
duke
parents:
diff changeset
4279 // check if threads is not an array of objects of Thread class
a61af66fc99e Initial load
duke
parents:
diff changeset
4280 klassOop k = objArrayKlass::cast(ah->klass())->element_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
4281 if (k != SystemDictionary::thread_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4282 THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4284
a61af66fc99e Initial load
duke
parents:
diff changeset
4285 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
4286
a61af66fc99e Initial load
duke
parents:
diff changeset
4287 GrowableArray<instanceHandle>* thread_handle_array = new GrowableArray<instanceHandle>(num_threads);
a61af66fc99e Initial load
duke
parents:
diff changeset
4288 for (int i = 0; i < num_threads; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4289 oop thread_obj = ah->obj_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
4290 instanceHandle h(THREAD, (instanceOop) thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
4291 thread_handle_array->append(h);
a61af66fc99e Initial load
duke
parents:
diff changeset
4292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4293
a61af66fc99e Initial load
duke
parents:
diff changeset
4294 Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4295 return (jobjectArray)JNIHandles::make_local(env, stacktraces());
a61af66fc99e Initial load
duke
parents:
diff changeset
4296
a61af66fc99e Initial load
duke
parents:
diff changeset
4297 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4298
a61af66fc99e Initial load
duke
parents:
diff changeset
4299 // JVM monitoring and management support
a61af66fc99e Initial load
duke
parents:
diff changeset
4300 JVM_ENTRY_NO_ENV(void*, JVM_GetManagement(jint version))
a61af66fc99e Initial load
duke
parents:
diff changeset
4301 return Management::get_jmm_interface(version);
a61af66fc99e Initial load
duke
parents:
diff changeset
4302 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4303
a61af66fc99e Initial load
duke
parents:
diff changeset
4304 // com.sun.tools.attach.VirtualMachine agent properties support
a61af66fc99e Initial load
duke
parents:
diff changeset
4305 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4306 // Initialize the agent properties with the properties maintained in the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
4307 JVM_ENTRY(jobject, JVM_InitAgentProperties(JNIEnv *env, jobject properties))
a61af66fc99e Initial load
duke
parents:
diff changeset
4308 JVMWrapper("JVM_InitAgentProperties");
a61af66fc99e Initial load
duke
parents:
diff changeset
4309 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
4310
a61af66fc99e Initial load
duke
parents:
diff changeset
4311 Handle props(THREAD, JNIHandles::resolve_non_null(properties));
a61af66fc99e Initial load
duke
parents:
diff changeset
4312
a61af66fc99e Initial load
duke
parents:
diff changeset
4313 PUTPROP(props, "sun.java.command", Arguments::java_command());
a61af66fc99e Initial load
duke
parents:
diff changeset
4314 PUTPROP(props, "sun.jvm.flags", Arguments::jvm_flags());
a61af66fc99e Initial load
duke
parents:
diff changeset
4315 PUTPROP(props, "sun.jvm.args", Arguments::jvm_args());
a61af66fc99e Initial load
duke
parents:
diff changeset
4316 return properties;
a61af66fc99e Initial load
duke
parents:
diff changeset
4317 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4318
a61af66fc99e Initial load
duke
parents:
diff changeset
4319 JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
a61af66fc99e Initial load
duke
parents:
diff changeset
4320 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4321 JVMWrapper("JVM_GetEnclosingMethodInfo");
a61af66fc99e Initial load
duke
parents:
diff changeset
4322 JvmtiVMObjectAllocEventCollector oam;
a61af66fc99e Initial load
duke
parents:
diff changeset
4323
a61af66fc99e Initial load
duke
parents:
diff changeset
4324 if (ofClass == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4325 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4327 Handle mirror(THREAD, JNIHandles::resolve_non_null(ofClass));
a61af66fc99e Initial load
duke
parents:
diff changeset
4328 // Special handling for primitive objects
a61af66fc99e Initial load
duke
parents:
diff changeset
4329 if (java_lang_Class::is_primitive(mirror())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4330 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4332 klassOop k = java_lang_Class::as_klassOop(mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
4333 if (!Klass::cast(k)->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4334 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4336 instanceKlassHandle ik_h(THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
4337 int encl_method_class_idx = ik_h->enclosing_method_class_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
4338 if (encl_method_class_idx == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4339 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4341 objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::object_klass(), 3, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4342 objArrayHandle dest(THREAD, dest_o);
a61af66fc99e Initial load
duke
parents:
diff changeset
4343 klassOop enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4344 dest->obj_at_put(0, Klass::cast(enc_k)->java_mirror());
a61af66fc99e Initial load
duke
parents:
diff changeset
4345 int encl_method_method_idx = ik_h->enclosing_method_method_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
4346 if (encl_method_method_idx != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4347 symbolOop sym_o = ik_h->constants()->symbol_at(
a61af66fc99e Initial load
duke
parents:
diff changeset
4348 extract_low_short_from_int(
a61af66fc99e Initial load
duke
parents:
diff changeset
4349 ik_h->constants()->name_and_type_at(encl_method_method_idx)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4350 symbolHandle sym(THREAD, sym_o);
a61af66fc99e Initial load
duke
parents:
diff changeset
4351 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4352 dest->obj_at_put(1, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
4353 sym_o = ik_h->constants()->symbol_at(
a61af66fc99e Initial load
duke
parents:
diff changeset
4354 extract_high_short_from_int(
a61af66fc99e Initial load
duke
parents:
diff changeset
4355 ik_h->constants()->name_and_type_at(encl_method_method_idx)));
a61af66fc99e Initial load
duke
parents:
diff changeset
4356 sym = symbolHandle(THREAD, sym_o);
a61af66fc99e Initial load
duke
parents:
diff changeset
4357 str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4358 dest->obj_at_put(2, str());
a61af66fc99e Initial load
duke
parents:
diff changeset
4359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4360 return (jobjectArray) JNIHandles::make_local(dest());
a61af66fc99e Initial load
duke
parents:
diff changeset
4361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4362 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4363
a61af66fc99e Initial load
duke
parents:
diff changeset
4364 JVM_ENTRY(jintArray, JVM_GetThreadStateValues(JNIEnv* env,
a61af66fc99e Initial load
duke
parents:
diff changeset
4365 jint javaThreadState))
a61af66fc99e Initial load
duke
parents:
diff changeset
4366 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4367 // If new thread states are added in future JDK and VM versions,
a61af66fc99e Initial load
duke
parents:
diff changeset
4368 // this should check if the JDK version is compatible with thread
a61af66fc99e Initial load
duke
parents:
diff changeset
4369 // states supported by the VM. Return NULL if not compatible.
a61af66fc99e Initial load
duke
parents:
diff changeset
4370 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4371 // This function must map the VM java_lang_Thread::ThreadStatus
a61af66fc99e Initial load
duke
parents:
diff changeset
4372 // to the Java thread state that the JDK supports.
a61af66fc99e Initial load
duke
parents:
diff changeset
4373 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4374
a61af66fc99e Initial load
duke
parents:
diff changeset
4375 typeArrayHandle values_h;
a61af66fc99e Initial load
duke
parents:
diff changeset
4376 switch (javaThreadState) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4377 case JAVA_THREAD_STATE_NEW : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4378 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4379 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4380 values_h->int_at_put(0, java_lang_Thread::NEW);
a61af66fc99e Initial load
duke
parents:
diff changeset
4381 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4383 case JAVA_THREAD_STATE_RUNNABLE : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4384 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4385 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4386 values_h->int_at_put(0, java_lang_Thread::RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
4387 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4389 case JAVA_THREAD_STATE_BLOCKED : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4390 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4391 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4392 values_h->int_at_put(0, java_lang_Thread::BLOCKED_ON_MONITOR_ENTER);
a61af66fc99e Initial load
duke
parents:
diff changeset
4393 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4395 case JAVA_THREAD_STATE_WAITING : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4396 typeArrayOop r = oopFactory::new_typeArray(T_INT, 2, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4397 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4398 values_h->int_at_put(0, java_lang_Thread::IN_OBJECT_WAIT);
a61af66fc99e Initial load
duke
parents:
diff changeset
4399 values_h->int_at_put(1, java_lang_Thread::PARKED);
a61af66fc99e Initial load
duke
parents:
diff changeset
4400 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4402 case JAVA_THREAD_STATE_TIMED_WAITING : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4403 typeArrayOop r = oopFactory::new_typeArray(T_INT, 3, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4404 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4405 values_h->int_at_put(0, java_lang_Thread::SLEEPING);
a61af66fc99e Initial load
duke
parents:
diff changeset
4406 values_h->int_at_put(1, java_lang_Thread::IN_OBJECT_WAIT_TIMED);
a61af66fc99e Initial load
duke
parents:
diff changeset
4407 values_h->int_at_put(2, java_lang_Thread::PARKED_TIMED);
a61af66fc99e Initial load
duke
parents:
diff changeset
4408 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4410 case JAVA_THREAD_STATE_TERMINATED : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4411 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4412 values_h = typeArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4413 values_h->int_at_put(0, java_lang_Thread::TERMINATED);
a61af66fc99e Initial load
duke
parents:
diff changeset
4414 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4416 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
4417 // Unknown state - probably incompatible JDK version
a61af66fc99e Initial load
duke
parents:
diff changeset
4418 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4420
a61af66fc99e Initial load
duke
parents:
diff changeset
4421 return (jintArray) JNIHandles::make_local(env, values_h());
a61af66fc99e Initial load
duke
parents:
diff changeset
4422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4423 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4424
a61af66fc99e Initial load
duke
parents:
diff changeset
4425
a61af66fc99e Initial load
duke
parents:
diff changeset
4426 JVM_ENTRY(jobjectArray, JVM_GetThreadStateNames(JNIEnv* env,
a61af66fc99e Initial load
duke
parents:
diff changeset
4427 jint javaThreadState,
a61af66fc99e Initial load
duke
parents:
diff changeset
4428 jintArray values))
a61af66fc99e Initial load
duke
parents:
diff changeset
4429 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4430 // If new thread states are added in future JDK and VM versions,
a61af66fc99e Initial load
duke
parents:
diff changeset
4431 // this should check if the JDK version is compatible with thread
a61af66fc99e Initial load
duke
parents:
diff changeset
4432 // states supported by the VM. Return NULL if not compatible.
a61af66fc99e Initial load
duke
parents:
diff changeset
4433 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4434 // This function must map the VM java_lang_Thread::ThreadStatus
a61af66fc99e Initial load
duke
parents:
diff changeset
4435 // to the Java thread state that the JDK supports.
a61af66fc99e Initial load
duke
parents:
diff changeset
4436 //
a61af66fc99e Initial load
duke
parents:
diff changeset
4437
a61af66fc99e Initial load
duke
parents:
diff changeset
4438 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
4439
a61af66fc99e Initial load
duke
parents:
diff changeset
4440 // Check if threads is null
a61af66fc99e Initial load
duke
parents:
diff changeset
4441 if (values == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4442 THROW_(vmSymbols::java_lang_NullPointerException(), 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
4443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4444
a61af66fc99e Initial load
duke
parents:
diff changeset
4445 typeArrayOop v = typeArrayOop(JNIHandles::resolve_non_null(values));
a61af66fc99e Initial load
duke
parents:
diff changeset
4446 typeArrayHandle values_h(THREAD, v);
a61af66fc99e Initial load
duke
parents:
diff changeset
4447
a61af66fc99e Initial load
duke
parents:
diff changeset
4448 objArrayHandle names_h;
a61af66fc99e Initial load
duke
parents:
diff changeset
4449 switch (javaThreadState) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4450 case JAVA_THREAD_STATE_NEW : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4451 assert(values_h->length() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4452 values_h->int_at(0) == java_lang_Thread::NEW,
a61af66fc99e Initial load
duke
parents:
diff changeset
4453 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4454
a61af66fc99e Initial load
duke
parents:
diff changeset
4455 objArrayOop r = oopFactory::new_objArray(SystemDictionary::string_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4456 1, /* only 1 substate */
a61af66fc99e Initial load
duke
parents:
diff changeset
4457 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4458 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4459 Handle name = java_lang_String::create_from_str("NEW", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4460 names_h->obj_at_put(0, name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4461 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4463 case JAVA_THREAD_STATE_RUNNABLE : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4464 assert(values_h->length() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4465 values_h->int_at(0) == java_lang_Thread::RUNNABLE,
a61af66fc99e Initial load
duke
parents:
diff changeset
4466 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4467
a61af66fc99e Initial load
duke
parents:
diff changeset
4468 objArrayOop r = oopFactory::new_objArray(SystemDictionary::string_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4469 1, /* only 1 substate */
a61af66fc99e Initial load
duke
parents:
diff changeset
4470 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4471 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4472 Handle name = java_lang_String::create_from_str("RUNNABLE", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4473 names_h->obj_at_put(0, name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4474 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4475 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4476 case JAVA_THREAD_STATE_BLOCKED : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4477 assert(values_h->length() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4478 values_h->int_at(0) == java_lang_Thread::BLOCKED_ON_MONITOR_ENTER,
a61af66fc99e Initial load
duke
parents:
diff changeset
4479 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4480
a61af66fc99e Initial load
duke
parents:
diff changeset
4481 objArrayOop r = oopFactory::new_objArray(SystemDictionary::string_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4482 1, /* only 1 substate */
a61af66fc99e Initial load
duke
parents:
diff changeset
4483 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4484 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4485 Handle name = java_lang_String::create_from_str("BLOCKED", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4486 names_h->obj_at_put(0, name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4487 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4488 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4489 case JAVA_THREAD_STATE_WAITING : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4490 assert(values_h->length() == 2 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4491 values_h->int_at(0) == java_lang_Thread::IN_OBJECT_WAIT &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4492 values_h->int_at(1) == java_lang_Thread::PARKED,
a61af66fc99e Initial load
duke
parents:
diff changeset
4493 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4494 objArrayOop r = oopFactory::new_objArray(SystemDictionary::string_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4495 2, /* number of substates */
a61af66fc99e Initial load
duke
parents:
diff changeset
4496 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4497 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4498 Handle name0 = java_lang_String::create_from_str("WAITING.OBJECT_WAIT",
a61af66fc99e Initial load
duke
parents:
diff changeset
4499 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4500 Handle name1 = java_lang_String::create_from_str("WAITING.PARKED",
a61af66fc99e Initial load
duke
parents:
diff changeset
4501 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4502 names_h->obj_at_put(0, name0());
a61af66fc99e Initial load
duke
parents:
diff changeset
4503 names_h->obj_at_put(1, name1());
a61af66fc99e Initial load
duke
parents:
diff changeset
4504 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4506 case JAVA_THREAD_STATE_TIMED_WAITING : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4507 assert(values_h->length() == 3 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4508 values_h->int_at(0) == java_lang_Thread::SLEEPING &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4509 values_h->int_at(1) == java_lang_Thread::IN_OBJECT_WAIT_TIMED &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4510 values_h->int_at(2) == java_lang_Thread::PARKED_TIMED,
a61af66fc99e Initial load
duke
parents:
diff changeset
4511 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4512 objArrayOop r = oopFactory::new_objArray(SystemDictionary::string_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4513 3, /* number of substates */
a61af66fc99e Initial load
duke
parents:
diff changeset
4514 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4515 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4516 Handle name0 = java_lang_String::create_from_str("TIMED_WAITING.SLEEPING",
a61af66fc99e Initial load
duke
parents:
diff changeset
4517 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4518 Handle name1 = java_lang_String::create_from_str("TIMED_WAITING.OBJECT_WAIT",
a61af66fc99e Initial load
duke
parents:
diff changeset
4519 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4520 Handle name2 = java_lang_String::create_from_str("TIMED_WAITING.PARKED",
a61af66fc99e Initial load
duke
parents:
diff changeset
4521 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4522 names_h->obj_at_put(0, name0());
a61af66fc99e Initial load
duke
parents:
diff changeset
4523 names_h->obj_at_put(1, name1());
a61af66fc99e Initial load
duke
parents:
diff changeset
4524 names_h->obj_at_put(2, name2());
a61af66fc99e Initial load
duke
parents:
diff changeset
4525 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4527 case JAVA_THREAD_STATE_TERMINATED : {
a61af66fc99e Initial load
duke
parents:
diff changeset
4528 assert(values_h->length() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
4529 values_h->int_at(0) == java_lang_Thread::TERMINATED,
a61af66fc99e Initial load
duke
parents:
diff changeset
4530 "Invalid threadStatus value");
a61af66fc99e Initial load
duke
parents:
diff changeset
4531 objArrayOop r = oopFactory::new_objArray(SystemDictionary::string_klass(),
a61af66fc99e Initial load
duke
parents:
diff changeset
4532 1, /* only 1 substate */
a61af66fc99e Initial load
duke
parents:
diff changeset
4533 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4534 names_h = objArrayHandle(THREAD, r);
a61af66fc99e Initial load
duke
parents:
diff changeset
4535 Handle name = java_lang_String::create_from_str("TERMINATED", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
4536 names_h->obj_at_put(0, name());
a61af66fc99e Initial load
duke
parents:
diff changeset
4537 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
4538 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4539 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
4540 // Unknown state - probably incompatible JDK version
a61af66fc99e Initial load
duke
parents:
diff changeset
4541 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
4542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4543 return (jobjectArray) JNIHandles::make_local(env, names_h());
a61af66fc99e Initial load
duke
parents:
diff changeset
4544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4545 JVM_END
a61af66fc99e Initial load
duke
parents:
diff changeset
4546
a61af66fc99e Initial load
duke
parents:
diff changeset
4547 JVM_ENTRY(void, JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size))
a61af66fc99e Initial load
duke
parents:
diff changeset
4548 {
a61af66fc99e Initial load
duke
parents:
diff changeset
4549 memset(info, 0, sizeof(info_size));
a61af66fc99e Initial load
duke
parents:
diff changeset
4550
a61af66fc99e Initial load
duke
parents:
diff changeset
4551 info->jvm_version = Abstract_VM_Version::jvm_version();
a61af66fc99e Initial load
duke
parents:
diff changeset
4552 info->update_version = 0; /* 0 in HotSpot Express VM */
a61af66fc99e Initial load
duke
parents:
diff changeset
4553 info->special_update_version = 0; /* 0 in HotSpot Express VM */
a61af66fc99e Initial load
duke
parents:
diff changeset
4554
a61af66fc99e Initial load
duke
parents:
diff changeset
4555 // when we add a new capability in the jvm_version_info struct, we should also
a61af66fc99e Initial load
duke
parents:
diff changeset
4556 // consider to expose this new capability in the sun.rt.jvmCapabilities jvmstat
a61af66fc99e Initial load
duke
parents:
diff changeset
4557 // counter defined in runtimeService.cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
4558 info->is_attachable = AttachListener::is_attach_supported();
a61af66fc99e Initial load
duke
parents:
diff changeset
4559 #ifdef KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
4560 info->is_kernel_jvm = 1; // true;
a61af66fc99e Initial load
duke
parents:
diff changeset
4561 #else // KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
4562 info->is_kernel_jvm = 0; // false;
a61af66fc99e Initial load
duke
parents:
diff changeset
4563 #endif // KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
4564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4565 JVM_END
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
4566