60 _holder = Handle(_thread, klass->klass_holder()); |
60 _holder = Handle(_thread, klass->klass_holder()); |
61 } |
61 } |
62 return *this; |
62 return *this; |
63 } |
63 } |
64 |
64 |
65 void JNIHandleMark::push_jni_handle_block() { |
65 static void requireInHotSpot(const char* caller, JVMCI_TRAPS) { |
66 JavaThread* thread = JavaThread::current(); |
66 if (!JVMCIENV->is_hotspot()) { |
|
67 JVMCI_THROW_MSG(IllegalStateException, err_msg("Cannot call %s from JVMCI shared library", caller)); |
|
68 } |
|
69 } |
|
70 |
|
71 void JNIHandleMark::push_jni_handle_block(JavaThread* thread) { |
67 if (thread != NULL) { |
72 if (thread != NULL) { |
68 // Allocate a new block for JNI handles. |
73 // Allocate a new block for JNI handles. |
69 // Inlined code from jni_PushLocalFrame() |
74 // Inlined code from jni_PushLocalFrame() |
70 JNIHandleBlock* java_handles = ((JavaThread*)thread)->active_handles(); |
75 JNIHandleBlock* java_handles = thread->active_handles(); |
71 JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread); |
76 JNIHandleBlock* compile_handles = JNIHandleBlock::allocate_block(thread); |
72 assert(compile_handles != NULL && java_handles != NULL, "should not be NULL"); |
77 assert(compile_handles != NULL && java_handles != NULL, "should not be NULL"); |
73 compile_handles->set_pop_frame_link(java_handles); |
78 compile_handles->set_pop_frame_link(java_handles); |
74 thread->set_active_handles(compile_handles); |
79 thread->set_active_handles(compile_handles); |
75 } |
80 } |
76 } |
81 } |
77 |
82 |
78 void JNIHandleMark::pop_jni_handle_block() { |
83 void JNIHandleMark::pop_jni_handle_block(JavaThread* thread) { |
79 JavaThread* thread = JavaThread::current(); |
|
80 if (thread != NULL) { |
84 if (thread != NULL) { |
81 // Release our JNI handle block |
85 // Release our JNI handle block |
82 JNIHandleBlock* compile_handles = thread->active_handles(); |
86 JNIHandleBlock* compile_handles = thread->active_handles(); |
83 JNIHandleBlock* java_handles = compile_handles->pop_frame_link(); |
87 JNIHandleBlock* java_handles = compile_handles->pop_frame_link(); |
84 thread->set_active_handles(java_handles); |
88 thread->set_active_handles(java_handles); |
109 oop arg=((objArrayOop) (_args))->obj_at(_index++); |
113 oop arg=((objArrayOop) (_args))->obj_at(_index++); |
110 assert(expectedType == T_OBJECT || java_lang_boxing_object::is_instance(arg, expectedType), "arg type mismatch"); |
114 assert(expectedType == T_OBJECT || java_lang_boxing_object::is_instance(arg, expectedType), "arg type mismatch"); |
111 return Handle(Thread::current(), arg); |
115 return Handle(Thread::current(), arg); |
112 } |
116 } |
113 |
117 |
114 // Entry to native method implementation that transitions current thread to '_thread_in_vm'. |
118 // Bring the JVMCI compiler thread into the VM state. |
|
119 #define JVMCI_VM_ENTRY_MARK \ |
|
120 ThreadInVMfromNative __tiv(thread); \ |
|
121 ResetNoHandleMark rnhm; \ |
|
122 HandleMarkCleaner __hm(thread); \ |
|
123 Thread* THREAD = thread; \ |
|
124 debug_only(VMNativeEntryWrapper __vew;) |
|
125 |
|
126 // Native method block that transitions current thread to '_thread_in_vm'. |
|
127 #define C2V_BLOCK(result_type, name, signature) \ |
|
128 TRACE_CALL(result_type, jvmci_ ## name signature) \ |
|
129 JVMCI_VM_ENTRY_MARK; \ |
|
130 ResourceMark rm; \ |
|
131 JNI_JVMCIENV(thread, env); |
|
132 |
|
133 static Thread* get_current_thread() { |
|
134 return Thread::current_or_null_safe(); |
|
135 } |
|
136 |
|
137 // Entry to native method implementation that transitions |
|
138 // current thread to '_thread_in_vm'. |
115 #define C2V_VMENTRY(result_type, name, signature) \ |
139 #define C2V_VMENTRY(result_type, name, signature) \ |
116 JNIEXPORT result_type JNICALL c2v_ ## name signature { \ |
140 JNIEXPORT result_type JNICALL c2v_ ## name signature { \ |
|
141 Thread* base_thread = get_current_thread(); \ |
|
142 if (base_thread == NULL) { \ |
|
143 env->ThrowNew(JNIJVMCI::InternalError::clazz(), \ |
|
144 err_msg("Cannot call into HotSpot from JVMCI shared library without attaching current thread")); \ |
|
145 return; \ |
|
146 } \ |
|
147 assert(base_thread->is_Java_thread(), "just checking");\ |
|
148 JavaThread* thread = (JavaThread*) base_thread; \ |
117 JVMCITraceMark jtm("CompilerToVM::" #name); \ |
149 JVMCITraceMark jtm("CompilerToVM::" #name); \ |
118 TRACE_CALL(result_type, jvmci_ ## name signature) \ |
150 C2V_BLOCK(result_type, name, signature) |
119 JVMCI_VM_ENTRY_MARK; \ |
151 |
120 ResourceMark rm; \ |
152 #define C2V_VMENTRY_(result_type, name, signature, result) \ |
121 JNI_JVMCIENV(env); |
153 JNIEXPORT result_type JNICALL c2v_ ## name signature { \ |
|
154 Thread* base_thread = get_current_thread(); \ |
|
155 if (base_thread == NULL) { \ |
|
156 env->ThrowNew(JNIJVMCI::InternalError::clazz(), \ |
|
157 err_msg("Cannot call into HotSpot from JVMCI shared library without attaching current thread")); \ |
|
158 return result; \ |
|
159 } \ |
|
160 assert(base_thread->is_Java_thread(), "just checking");\ |
|
161 JavaThread* thread = (JavaThread*) base_thread; \ |
|
162 JVMCITraceMark jtm("CompilerToVM::" #name); \ |
|
163 C2V_BLOCK(result_type, name, signature) |
|
164 |
|
165 #define C2V_VMENTRY_NULL(result_type, name, signature) C2V_VMENTRY_(result_type, name, signature, NULL) |
|
166 #define C2V_VMENTRY_0(result_type, name, signature) C2V_VMENTRY_(result_type, name, signature, 0) |
|
167 |
|
168 // Entry to native method implementation that does not transition |
|
169 // current thread to '_thread_in_vm'. |
|
170 #define C2V_VMENTRY_PREFIX(result_type, name, signature) \ |
|
171 JNIEXPORT result_type JNICALL c2v_ ## name signature { \ |
|
172 Thread* base_thread = get_current_thread(); |
122 |
173 |
123 #define C2V_END } |
174 #define C2V_END } |
124 |
175 |
|
176 #define JNI_THROW(caller, name, msg) do { \ |
|
177 jint __throw_res = env->ThrowNew(JNIJVMCI::name::clazz(), msg); \ |
|
178 if (__throw_res != JNI_OK) { \ |
|
179 tty->print_cr("Throwing " #name " in " caller " returned %d", __throw_res); \ |
|
180 } \ |
|
181 return; \ |
|
182 } while (0); |
|
183 |
|
184 #define JNI_THROW_(caller, name, msg, result) do { \ |
|
185 jint __throw_res = env->ThrowNew(JNIJVMCI::name::clazz(), msg); \ |
|
186 if (__throw_res != JNI_OK) { \ |
|
187 tty->print_cr("Throwing " #name " in " caller " returned %d", __throw_res); \ |
|
188 } \ |
|
189 return result; \ |
|
190 } while (0) |
|
191 |
125 jobjectArray readConfiguration0(JNIEnv *env, JVMCI_TRAPS); |
192 jobjectArray readConfiguration0(JNIEnv *env, JVMCI_TRAPS); |
126 |
193 |
127 C2V_VMENTRY(jobjectArray, readConfiguration, (JNIEnv* env)) |
194 C2V_VMENTRY_NULL(jobjectArray, readConfiguration, (JNIEnv* env)) |
128 jobjectArray config = readConfiguration0(env, JVMCI_CHECK_NULL); |
195 jobjectArray config = readConfiguration0(env, JVMCI_CHECK_NULL); |
129 return config; |
196 return config; |
130 } |
197 } |
131 |
198 |
132 C2V_VMENTRY(jobject, getFlagValue, (JNIEnv* env, jobject c2vm, jobject name_handle)) |
199 C2V_VMENTRY_NULL(jobject, getFlagValue, (JNIEnv* env, jobject c2vm, jobject name_handle)) |
133 #define RETURN_BOXED_LONG(value) jvalue p; p.j = (jlong) (value); JVMCIObject box = JVMCIENV->create_box(T_LONG, &p, JVMCI_CHECK_NULL); return box.as_jobject(); |
200 #define RETURN_BOXED_LONG(value) jvalue p; p.j = (jlong) (value); JVMCIObject box = JVMCIENV->create_box(T_LONG, &p, JVMCI_CHECK_NULL); return box.as_jobject(); |
134 #define RETURN_BOXED_DOUBLE(value) jvalue p; p.d = (jdouble) (value); JVMCIObject box = JVMCIENV->create_box(T_DOUBLE, &p, JVMCI_CHECK_NULL); return box.as_jobject(); |
201 #define RETURN_BOXED_DOUBLE(value) jvalue p; p.d = (jdouble) (value); JVMCIObject box = JVMCIENV->create_box(T_DOUBLE, &p, JVMCI_CHECK_NULL); return box.as_jobject(); |
135 JVMCIObject name = JVMCIENV->wrap(name_handle); |
202 JVMCIObject name = JVMCIENV->wrap(name_handle); |
136 if (name.is_null()) { |
203 if (name.is_null()) { |
137 JVMCI_THROW_NULL(NullPointerException); |
204 JVMCI_THROW_NULL(NullPointerException); |
168 } |
235 } |
169 #undef RETURN_BOXED_LONG |
236 #undef RETURN_BOXED_LONG |
170 #undef RETURN_BOXED_DOUBLE |
237 #undef RETURN_BOXED_DOUBLE |
171 C2V_END |
238 C2V_END |
172 |
239 |
173 C2V_VMENTRY(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address)) |
240 C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address)) |
174 if (env != JavaThread::current()->jni_environment()) { |
241 requireInHotSpot("getObjectAtAddress", JVMCI_CHECK_NULL); |
175 JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot"); |
|
176 } |
|
177 if (oop_address == 0) { |
242 if (oop_address == 0) { |
178 JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero"); |
243 JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero"); |
179 } |
244 } |
180 oop obj = *((oopDesc**) oop_address); |
245 oop obj = *((oopDesc**) oop_address); |
181 if (obj != NULL) { |
246 if (obj != NULL) { |
182 oopDesc::verify(obj); |
247 oopDesc::verify(obj); |
183 } |
248 } |
184 return JNIHandles::make_local(obj); |
249 return JNIHandles::make_local(obj); |
185 C2V_END |
250 C2V_END |
186 |
251 |
187 C2V_VMENTRY(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method)) |
252 C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method)) |
188 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
253 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
189 |
254 |
190 int code_size = method->code_size(); |
255 int code_size = method->code_size(); |
191 jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size); |
256 jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size); |
192 |
257 |
260 JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL); |
325 JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL); |
261 JVMCIENV->copy_bytes_from(reconstituted_code, result, 0, code_size); |
326 JVMCIENV->copy_bytes_from(reconstituted_code, result, 0, code_size); |
262 return JVMCIENV->get_jbyteArray(result); |
327 return JVMCIENV->get_jbyteArray(result); |
263 C2V_END |
328 C2V_END |
264 |
329 |
265 C2V_VMENTRY(jint, getExceptionTableLength, (JNIEnv* env, jobject, jobject jvmci_method)) |
330 C2V_VMENTRY_0(jint, getExceptionTableLength, (JNIEnv* env, jobject, jobject jvmci_method)) |
266 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
331 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
267 return method->exception_table_length(); |
332 return method->exception_table_length(); |
268 C2V_END |
333 C2V_END |
269 |
334 |
270 C2V_VMENTRY(jlong, getExceptionTableStart, (JNIEnv* env, jobject, jobject jvmci_method)) |
335 C2V_VMENTRY_0(jlong, getExceptionTableStart, (JNIEnv* env, jobject, jobject jvmci_method)) |
271 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
336 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
272 if (method->exception_table_length() == 0) { |
337 if (method->exception_table_length() == 0) { |
273 return 0L; |
338 return 0L; |
274 } |
339 } |
275 return (jlong) (address) method->exception_table_start(); |
340 return (jlong) (address) method->exception_table_start(); |
276 C2V_END |
341 C2V_END |
277 |
342 |
278 C2V_VMENTRY(jobject, asResolvedJavaMethod, (JNIEnv* env, jobject, jobject executable_handle)) |
343 C2V_VMENTRY_NULL(jobject, asResolvedJavaMethod, (JNIEnv* env, jobject, jobject executable_handle)) |
279 if (env != JavaThread::current()->jni_environment()) { |
344 requireInHotSpot("asResolvedJavaMethod", JVMCI_CHECK_NULL); |
280 JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot"); |
|
281 } |
|
282 |
|
283 oop executable = JNIHandles::resolve(executable_handle); |
345 oop executable = JNIHandles::resolve(executable_handle); |
284 oop mirror = NULL; |
346 oop mirror = NULL; |
285 int slot = 0; |
347 int slot = 0; |
286 |
348 |
287 if (executable->klass() == SystemDictionary::reflect_Constructor_klass()) { |
349 if (executable->klass() == SystemDictionary::reflect_Constructor_klass()) { |
415 } |
477 } |
416 JVMCIObject implementor = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL); |
478 JVMCIObject implementor = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL); |
417 return JVMCIENV->get_jobject(implementor); |
479 return JVMCIENV->get_jobject(implementor); |
418 C2V_END |
480 C2V_END |
419 |
481 |
420 C2V_VMENTRY(jboolean, methodIsIgnoredBySecurityStackWalk,(JNIEnv* env, jobject, jobject jvmci_method)) |
482 C2V_VMENTRY_0(jboolean, methodIsIgnoredBySecurityStackWalk,(JNIEnv* env, jobject, jobject jvmci_method)) |
421 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
483 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
422 return method->is_ignored_by_security_stack_walk(); |
484 return method->is_ignored_by_security_stack_walk(); |
423 C2V_END |
485 C2V_END |
424 |
486 |
425 C2V_VMENTRY(jboolean, isCompilable,(JNIEnv* env, jobject, jobject jvmci_method)) |
487 C2V_VMENTRY_0(jboolean, isCompilable,(JNIEnv* env, jobject, jobject jvmci_method)) |
426 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
488 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
427 constantPoolHandle cp = method->constMethod()->constants(); |
489 constantPoolHandle cp = method->constMethod()->constants(); |
428 assert(!cp.is_null(), "npe"); |
490 assert(!cp.is_null(), "npe"); |
429 // don't inline method when constant pool contains a CONSTANT_Dynamic |
491 // don't inline method when constant pool contains a CONSTANT_Dynamic |
430 return !method->is_not_compilable(CompLevel_full_optimization) && !cp->has_dynamic_constant(); |
492 return !method->is_not_compilable(CompLevel_full_optimization) && !cp->has_dynamic_constant(); |
431 C2V_END |
493 C2V_END |
432 |
494 |
433 C2V_VMENTRY(jboolean, hasNeverInlineDirective,(JNIEnv* env, jobject, jobject jvmci_method)) |
495 C2V_VMENTRY_0(jboolean, hasNeverInlineDirective,(JNIEnv* env, jobject, jobject jvmci_method)) |
434 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
496 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
435 return !Inline || CompilerOracle::should_not_inline(method) || method->dont_inline(); |
497 return !Inline || CompilerOracle::should_not_inline(method) || method->dont_inline(); |
436 C2V_END |
498 C2V_END |
437 |
499 |
438 C2V_VMENTRY(jboolean, shouldInlineMethod,(JNIEnv* env, jobject, jobject jvmci_method)) |
500 C2V_VMENTRY_0(jboolean, shouldInlineMethod,(JNIEnv* env, jobject, jobject jvmci_method)) |
439 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
501 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
440 return CompilerOracle::should_inline(method) || method->force_inline(); |
502 return CompilerOracle::should_inline(method) || method->force_inline(); |
441 C2V_END |
503 C2V_END |
442 |
504 |
443 C2V_VMENTRY(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, jclass accessing_class, jboolean resolve)) |
505 C2V_VMENTRY_NULL(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, jclass accessing_class, jboolean resolve)) |
444 JVMCIObject name = JVMCIENV->wrap(jname); |
506 JVMCIObject name = JVMCIENV->wrap(jname); |
445 const char* str = JVMCIENV->as_utf8_string(name); |
507 const char* str = JVMCIENV->as_utf8_string(name); |
446 TempNewSymbol class_name = SymbolTable::new_symbol(str, CHECK_NULL); |
508 TempNewSymbol class_name = SymbolTable::new_symbol(str, CHECK_NULL); |
447 |
509 |
448 if (class_name->utf8_length() <= 1) { |
510 if (class_name->utf8_length() <= 1) { |
516 } |
578 } |
517 JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL); |
579 JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL); |
518 return JVMCIENV->get_jobject(result); |
580 return JVMCIENV->get_jobject(result); |
519 } |
581 } |
520 |
582 |
521 C2V_VMENTRY(jobject, resolveConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
583 C2V_VMENTRY_NULL(jobject, resolveConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
522 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
584 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
523 oop result = cp->resolve_constant_at(index, CHECK_NULL); |
585 oop result = cp->resolve_constant_at(index, CHECK_NULL); |
524 return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result)); |
586 return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result)); |
525 C2V_END |
587 C2V_END |
526 |
588 |
527 C2V_VMENTRY(jobject, resolvePossiblyCachedConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
589 C2V_VMENTRY_NULL(jobject, resolvePossiblyCachedConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
528 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
590 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
529 oop result = cp->resolve_possibly_cached_constant_at(index, CHECK_NULL); |
591 oop result = cp->resolve_possibly_cached_constant_at(index, CHECK_NULL); |
530 return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result)); |
592 return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result)); |
531 C2V_END |
593 C2V_END |
532 |
594 |
533 C2V_VMENTRY(jint, lookupNameAndTypeRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
595 C2V_VMENTRY_0(jint, lookupNameAndTypeRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
534 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
596 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
535 return cp->name_and_type_ref_index_at(index); |
597 return cp->name_and_type_ref_index_at(index); |
536 C2V_END |
598 C2V_END |
537 |
599 |
538 C2V_VMENTRY(jobject, lookupNameInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which)) |
600 C2V_VMENTRY_NULL(jobject, lookupNameInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which)) |
539 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
601 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
540 JVMCIObject sym = JVMCIENV->create_string(cp->name_ref_at(which), JVMCI_CHECK_NULL); |
602 JVMCIObject sym = JVMCIENV->create_string(cp->name_ref_at(which), JVMCI_CHECK_NULL); |
541 return JVMCIENV->get_jobject(sym); |
603 return JVMCIENV->get_jobject(sym); |
542 C2V_END |
604 C2V_END |
543 |
605 |
544 C2V_VMENTRY(jobject, lookupSignatureInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which)) |
606 C2V_VMENTRY_NULL(jobject, lookupSignatureInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which)) |
545 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
607 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
546 JVMCIObject sym = JVMCIENV->create_string(cp->signature_ref_at(which), JVMCI_CHECK_NULL); |
608 JVMCIObject sym = JVMCIENV->create_string(cp->signature_ref_at(which), JVMCI_CHECK_NULL); |
547 return JVMCIENV->get_jobject(sym); |
609 return JVMCIENV->get_jobject(sym); |
548 C2V_END |
610 C2V_END |
549 |
611 |
550 C2V_VMENTRY(jint, lookupKlassRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
612 C2V_VMENTRY_0(jint, lookupKlassRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
551 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
613 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
552 return cp->klass_ref_index_at(index); |
614 return cp->klass_ref_index_at(index); |
553 C2V_END |
615 C2V_END |
554 |
616 |
555 C2V_VMENTRY(jobject, resolveTypeInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
617 C2V_VMENTRY_NULL(jobject, resolveTypeInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
556 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
618 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
557 Klass* klass = cp->klass_at(index, CHECK_NULL); |
619 Klass* klass = cp->klass_at(index, CHECK_NULL); |
558 JVMCIKlassHandle resolved_klass(THREAD, klass); |
620 JVMCIKlassHandle resolved_klass(THREAD, klass); |
559 if (resolved_klass->is_instance_klass()) { |
621 if (resolved_klass->is_instance_klass()) { |
560 bool linked = InstanceKlass::cast(resolved_klass())->link_class_or_fail(CHECK_NULL); |
622 InstanceKlass::cast(resolved_klass())->link_class(CHECK_NULL); |
561 if (!linked) { |
623 if (!InstanceKlass::cast(resolved_klass())->is_linked()) { |
562 return NULL; |
624 // link_class() should not return here if there is an issue. |
|
625 JVMCI_THROW_MSG_NULL(InternalError, err_msg("Class %s must be linked", resolved_klass()->external_name())); |
563 } |
626 } |
564 } |
627 } |
565 JVMCIObject klassObject = JVMCIENV->get_jvmci_type(resolved_klass, JVMCI_CHECK_NULL); |
628 JVMCIObject klassObject = JVMCIENV->get_jvmci_type(resolved_klass, JVMCI_CHECK_NULL); |
566 return JVMCIENV->get_jobject(klassObject); |
629 return JVMCIENV->get_jobject(klassObject); |
567 C2V_END |
630 C2V_END |
568 |
631 |
569 C2V_VMENTRY(jobject, lookupKlassInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
632 C2V_VMENTRY_NULL(jobject, lookupKlassInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
570 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
633 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
571 Klass* loading_klass = cp->pool_holder(); |
634 Klass* loading_klass = cp->pool_holder(); |
572 bool is_accessible = false; |
635 bool is_accessible = false; |
573 JVMCIKlassHandle klass(THREAD, JVMCIRuntime::get_klass_by_index(cp, index, is_accessible, loading_klass)); |
636 JVMCIKlassHandle klass(THREAD, JVMCIRuntime::get_klass_by_index(cp, index, is_accessible, loading_klass)); |
574 Symbol* symbol = NULL; |
637 Symbol* symbol = NULL; |
592 result = JVMCIENV->create_string(symbol, JVMCI_CHECK_NULL); |
655 result = JVMCIENV->create_string(symbol, JVMCI_CHECK_NULL); |
593 } |
656 } |
594 return JVMCIENV->get_jobject(result); |
657 return JVMCIENV->get_jobject(result); |
595 C2V_END |
658 C2V_END |
596 |
659 |
597 C2V_VMENTRY(jobject, lookupAppendixInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
660 C2V_VMENTRY_NULL(jobject, lookupAppendixInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
598 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
661 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
599 oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index); |
662 oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index); |
600 return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(appendix_oop)); |
663 return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(appendix_oop)); |
601 C2V_END |
664 C2V_END |
602 |
665 |
603 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
666 C2V_VMENTRY_NULL(jobject, lookupMethodInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode)) |
604 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
667 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
605 InstanceKlass* pool_holder = cp->pool_holder(); |
668 InstanceKlass* pool_holder = cp->pool_holder(); |
606 Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF); |
669 Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF); |
607 methodHandle method = JVMCIRuntime::get_method_by_index(cp, index, bc, pool_holder); |
670 methodHandle method = JVMCIRuntime::get_method_by_index(cp, index, bc, pool_holder); |
608 JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL); |
671 JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL); |
609 return JVMCIENV->get_jobject(result); |
672 return JVMCIENV->get_jobject(result); |
610 C2V_END |
673 C2V_END |
611 |
674 |
612 C2V_VMENTRY(jint, constantPoolRemapInstructionOperandFromCache, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
675 C2V_VMENTRY_0(jint, constantPoolRemapInstructionOperandFromCache, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index)) |
613 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
676 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
614 return cp->remap_instruction_operand_from_cache(index); |
677 return cp->remap_instruction_operand_from_cache(index); |
615 C2V_END |
678 C2V_END |
616 |
679 |
617 C2V_VMENTRY(jobject, resolveFieldInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jobject jvmci_method, jbyte opcode, jintArray info_handle)) |
680 C2V_VMENTRY_NULL(jobject, resolveFieldInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jobject jvmci_method, jbyte opcode, jintArray info_handle)) |
618 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
681 constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool); |
619 Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF); |
682 Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF); |
620 fieldDescriptor fd; |
683 fieldDescriptor fd; |
621 LinkInfo link_info(cp, index, (jvmci_method != NULL) ? JVMCIENV->asMethod(jvmci_method) : NULL, CHECK_0); |
684 LinkInfo link_info(cp, index, (jvmci_method != NULL) ? JVMCIENV->asMethod(jvmci_method) : NULL, CHECK_0); |
622 LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_0); |
685 LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_0); |
695 |
758 |
696 JVMCIObject result = JVMCIENV->get_jvmci_method(m, JVMCI_CHECK_NULL); |
759 JVMCIObject result = JVMCIENV->get_jvmci_method(m, JVMCI_CHECK_NULL); |
697 return JVMCIENV->get_jobject(result); |
760 return JVMCIENV->get_jobject(result); |
698 C2V_END |
761 C2V_END |
699 |
762 |
700 C2V_VMENTRY(jboolean, hasFinalizableSubclass,(JNIEnv* env, jobject, jobject jvmci_type)) |
763 C2V_VMENTRY_0(jboolean, hasFinalizableSubclass,(JNIEnv* env, jobject, jobject jvmci_type)) |
701 Klass* klass = JVMCIENV->asKlass(jvmci_type); |
764 Klass* klass = JVMCIENV->asKlass(jvmci_type); |
702 assert(klass != NULL, "method must not be called for primitive types"); |
765 assert(klass != NULL, "method must not be called for primitive types"); |
703 return Dependencies::find_finalizable_subclass(klass) != NULL; |
766 return Dependencies::find_finalizable_subclass(klass) != NULL; |
704 C2V_END |
767 C2V_END |
705 |
768 |
706 C2V_VMENTRY(jobject, getClassInitializer, (JNIEnv* env, jobject, jobject jvmci_type)) |
769 C2V_VMENTRY_NULL(jobject, getClassInitializer, (JNIEnv* env, jobject, jobject jvmci_type)) |
707 Klass* klass = JVMCIENV->asKlass(jvmci_type); |
770 Klass* klass = JVMCIENV->asKlass(jvmci_type); |
708 if (!klass->is_instance_klass()) { |
771 if (!klass->is_instance_klass()) { |
709 return NULL; |
772 return NULL; |
710 } |
773 } |
711 InstanceKlass* iklass = InstanceKlass::cast(klass); |
774 InstanceKlass* iklass = InstanceKlass::cast(klass); |
712 JVMCIObject result = JVMCIENV->get_jvmci_method(iklass->class_initializer(), JVMCI_CHECK_NULL); |
775 JVMCIObject result = JVMCIENV->get_jvmci_method(iklass->class_initializer(), JVMCI_CHECK_NULL); |
713 return JVMCIENV->get_jobject(result); |
776 return JVMCIENV->get_jobject(result); |
714 C2V_END |
777 C2V_END |
715 |
778 |
716 C2V_VMENTRY(jlong, getMaxCallTargetOffset, (JNIEnv* env, jobject, jlong addr)) |
779 C2V_VMENTRY_0(jlong, getMaxCallTargetOffset, (JNIEnv* env, jobject, jlong addr)) |
717 address target_addr = (address) addr; |
780 address target_addr = (address) addr; |
718 if (target_addr != 0x0) { |
781 if (target_addr != 0x0) { |
719 int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int)); |
782 int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int)); |
720 int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int)); |
783 int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int)); |
721 return MAX2(ABS(off_low), ABS(off_high)); |
784 return MAX2(ABS(off_low), ABS(off_high)); |
907 |
970 |
908 JVMCIObject result = JVMCIENV->create_string(st.as_string(), JVMCI_CHECK_NULL); |
971 JVMCIObject result = JVMCIENV->create_string(st.as_string(), JVMCI_CHECK_NULL); |
909 return JVMCIENV->get_jobject(result); |
972 return JVMCIENV->get_jobject(result); |
910 C2V_END |
973 C2V_END |
911 |
974 |
912 C2V_VMENTRY(jobject, getStackTraceElement, (JNIEnv* env, jobject, jobject jvmci_method, int bci)) |
975 C2V_VMENTRY_NULL(jobject, getStackTraceElement, (JNIEnv* env, jobject, jobject jvmci_method, int bci)) |
913 HandleMark hm; |
976 HandleMark hm; |
914 |
977 |
915 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
978 methodHandle method = JVMCIENV->asMethod(jvmci_method); |
916 JVMCIObject element = JVMCIENV->new_StackTraceElement(method, bci, JVMCI_CHECK_NULL); |
979 JVMCIObject element = JVMCIENV->new_StackTraceElement(method, bci, JVMCI_CHECK_NULL); |
917 return JVMCIENV->get_jobject(element); |
980 return JVMCIENV->get_jobject(element); |
918 C2V_END |
981 C2V_END |
919 |
982 |
920 C2V_VMENTRY(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject args, jobject hs_nmethod)) |
983 C2V_VMENTRY_NULL(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject args, jobject hs_nmethod)) |
921 if (env != JavaThread::current()->jni_environment()) { |
984 // The incoming arguments array would have to contain JavaConstants instead of regular objects |
922 // The incoming arguments array would have to contain JavaConstants instead of regular objects |
985 // and the return value would have to be wrapped as a JavaConstant. |
923 // and the return value would have to be wrapped as a JavaConstant. |
986 requireInHotSpot("executeHotSpotNmethod", JVMCI_CHECK_NULL); |
924 JVMCI_THROW_MSG_NULL(InternalError, "Wrapping of arguments is currently unsupported"); |
|
925 } |
|
926 |
987 |
927 HandleMark hm; |
988 HandleMark hm; |
928 |
989 |
929 JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod); |
990 JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod); |
930 nmethod* nm = JVMCIENV->asNmethod(nmethod_mirror); |
991 nmethod* nm = JVMCIENV->asNmethod(nmethod_mirror); |
993 } |
1054 } |
994 |
1055 |
995 return (jlongArray) JVMCIENV->get_jobject(result); |
1056 return (jlongArray) JVMCIENV->get_jobject(result); |
996 C2V_END |
1057 C2V_END |
997 |
1058 |
998 C2V_VMENTRY(jlong, getLocalVariableTableStart, (JNIEnv* env, jobject, jobject jvmci_method)) |
1059 C2V_VMENTRY_0(jlong, getLocalVariableTableStart, (JNIEnv* env, jobject, jobject jvmci_method)) |
999 Method* method = JVMCIENV->asMethod(jvmci_method); |
1060 Method* method = JVMCIENV->asMethod(jvmci_method); |
1000 if (!method->has_localvariable_table()) { |
1061 if (!method->has_localvariable_table()) { |
1001 return 0; |
1062 return 0; |
1002 } |
1063 } |
1003 return (jlong) (address) method->localvariable_table_start(); |
1064 return (jlong) (address) method->localvariable_table_start(); |
1004 C2V_END |
1065 C2V_END |
1005 |
1066 |
1006 C2V_VMENTRY(jint, getLocalVariableTableLength, (JNIEnv* env, jobject, jobject jvmci_method)) |
1067 C2V_VMENTRY_0(jint, getLocalVariableTableLength, (JNIEnv* env, jobject, jobject jvmci_method)) |
1007 Method* method = JVMCIENV->asMethod(jvmci_method); |
1068 Method* method = JVMCIENV->asMethod(jvmci_method); |
1008 return method->localvariable_table_length(); |
1069 return method->localvariable_table_length(); |
1009 C2V_END |
1070 C2V_END |
1010 |
1071 |
1011 C2V_VMENTRY(void, reprofile, (JNIEnv* env, jobject, jobject jvmci_method)) |
1072 C2V_VMENTRY(void, reprofile, (JNIEnv* env, jobject, jobject jvmci_method)) |
1035 C2V_VMENTRY(void, invalidateHotSpotNmethod, (JNIEnv* env, jobject, jobject hs_nmethod)) |
1096 C2V_VMENTRY(void, invalidateHotSpotNmethod, (JNIEnv* env, jobject, jobject hs_nmethod)) |
1036 JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod); |
1097 JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod); |
1037 JVMCIENV->invalidate_nmethod_mirror(nmethod_mirror, JVMCI_CHECK); |
1098 JVMCIENV->invalidate_nmethod_mirror(nmethod_mirror, JVMCI_CHECK); |
1038 C2V_END |
1099 C2V_END |
1039 |
1100 |
1040 C2V_VMENTRY(jobject, readUncompressedOop, (JNIEnv* env, jobject, jlong addr)) |
1101 C2V_VMENTRY_NULL(jobject, readUncompressedOop, (JNIEnv* env, jobject, jlong addr)) |
1041 oop ret = RawAccess<>::oop_load((oop*)(address)addr); |
1102 oop ret = RawAccess<>::oop_load((oop*)(address)addr); |
1042 return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(ret)); |
1103 return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(ret)); |
1043 C2V_END |
1104 C2V_END |
1044 |
1105 |
1045 C2V_VMENTRY(jlongArray, collectCounters, (JNIEnv* env, jobject)) |
1106 C2V_VMENTRY_NULL(jlongArray, collectCounters, (JNIEnv* env, jobject)) |
|
1107 // Returns a zero length array if counters aren't enabled |
1046 JVMCIPrimitiveArray array = JVMCIENV->new_longArray(JVMCICounterSize, JVMCI_CHECK_NULL); |
1108 JVMCIPrimitiveArray array = JVMCIENV->new_longArray(JVMCICounterSize, JVMCI_CHECK_NULL); |
1047 JavaThread::collect_counters(JVMCIENV, array); |
1109 if (JVMCICounterSize > 0) { |
|
1110 jlong* temp_array = NEW_RESOURCE_ARRAY(jlong, JVMCICounterSize); |
|
1111 JavaThread::collect_counters(temp_array, JVMCICounterSize); |
|
1112 JVMCIENV->copy_longs_from(temp_array, array, 0, JVMCICounterSize); |
|
1113 } |
1048 return (jlongArray) JVMCIENV->get_jobject(array); |
1114 return (jlongArray) JVMCIENV->get_jobject(array); |
1049 C2V_END |
1115 C2V_END |
1050 |
1116 |
1051 C2V_VMENTRY(int, allocateCompileId, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci)) |
1117 C2V_VMENTRY_0(int, allocateCompileId, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci)) |
1052 HandleMark hm; |
1118 HandleMark hm; |
1053 if (jvmci_method == NULL) { |
1119 if (jvmci_method == NULL) { |
1054 JVMCI_THROW_0(NullPointerException); |
1120 JVMCI_THROW_0(NullPointerException); |
1055 } |
1121 } |
1056 Method* method = JVMCIENV->asMethod(jvmci_method); |
1122 Method* method = JVMCIENV->asMethod(jvmci_method); |
1059 } |
1125 } |
1060 return CompileBroker::assign_compile_id_unlocked(THREAD, method, entry_bci); |
1126 return CompileBroker::assign_compile_id_unlocked(THREAD, method, entry_bci); |
1061 C2V_END |
1127 C2V_END |
1062 |
1128 |
1063 |
1129 |
1064 C2V_VMENTRY(jboolean, isMature, (JNIEnv* env, jobject, jlong metaspace_method_data)) |
1130 C2V_VMENTRY_0(jboolean, isMature, (JNIEnv* env, jobject, jlong metaspace_method_data)) |
1065 MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data); |
1131 MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data); |
1066 return mdo != NULL && mdo->is_mature(); |
1132 return mdo != NULL && mdo->is_mature(); |
1067 C2V_END |
1133 C2V_END |
1068 |
1134 |
1069 C2V_VMENTRY(jboolean, hasCompiledCodeForOSR, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci, int comp_level)) |
1135 C2V_VMENTRY_0(jboolean, hasCompiledCodeForOSR, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci, int comp_level)) |
1070 Method* method = JVMCIENV->asMethod(jvmci_method); |
1136 Method* method = JVMCIENV->asMethod(jvmci_method); |
1071 return method->lookup_osr_nmethod_for(entry_bci, comp_level, true) != NULL; |
1137 return method->lookup_osr_nmethod_for(entry_bci, comp_level, true) != NULL; |
1072 C2V_END |
1138 C2V_END |
1073 |
1139 |
1074 C2V_VMENTRY(jobject, getSymbol, (JNIEnv* env, jobject, jlong symbol)) |
1140 C2V_VMENTRY_NULL(jobject, getSymbol, (JNIEnv* env, jobject, jlong symbol)) |
1075 JVMCIObject sym = JVMCIENV->create_string((Symbol*)(address)symbol, JVMCI_CHECK_NULL); |
1141 JVMCIObject sym = JVMCIENV->create_string((Symbol*)(address)symbol, JVMCI_CHECK_NULL); |
1076 return JVMCIENV->get_jobject(sym); |
1142 return JVMCIENV->get_jobject(sym); |
1077 C2V_END |
1143 C2V_END |
1078 |
1144 |
1079 bool matches(jobjectArray methods, Method* method, JVMCIEnv* JVMCIENV) { |
1145 bool matches(jobjectArray methods, Method* method, JVMCIEnv* JVMCIENV) { |
1100 |
1166 |
1101 // Invoke the method |
1167 // Invoke the method |
1102 JavaCalls::call(result, method, args, CHECK); |
1168 JavaCalls::call(result, method, args, CHECK); |
1103 } |
1169 } |
1104 |
1170 |
1105 C2V_VMENTRY(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, jobjectArray initial_methods, jobjectArray match_methods, jint initialSkip, jobject visitor_handle)) |
1171 C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, jobjectArray initial_methods, jobjectArray match_methods, jint initialSkip, jobject visitor_handle)) |
1106 |
1172 |
1107 if (!thread->has_last_Java_frame()) { |
1173 if (!thread->has_last_Java_frame()) { |
1108 return NULL; |
1174 return NULL; |
1109 } |
1175 } |
1110 Handle visitor(THREAD, JNIHandles::resolve_non_null(visitor_handle)); |
1176 Handle visitor(THREAD, JNIHandles::resolve_non_null(visitor_handle)); |
1111 |
1177 |
1112 if (env != JavaThread::current()->jni_environment()) { |
1178 requireInHotSpot("iterateFrames", JVMCI_CHECK_NULL); |
1113 JVMCI_THROW_MSG_NULL(InternalError, "getNextStackFrame is only supported for HotSpot stack walking"); |
|
1114 } |
|
1115 |
1179 |
1116 HotSpotJVMCI::HotSpotStackFrameReference::klass()->initialize(CHECK_NULL); |
1180 HotSpotJVMCI::HotSpotStackFrameReference::klass()->initialize(CHECK_NULL); |
1117 Handle frame_reference = HotSpotJVMCI::HotSpotStackFrameReference::klass()->allocate_instance_handle(CHECK_NULL); |
1181 Handle frame_reference = HotSpotJVMCI::HotSpotStackFrameReference::klass()->allocate_instance_handle(CHECK_NULL); |
1118 |
1182 |
1119 StackFrameStream fst(thread); |
1183 StackFrameStream fst(thread); |
1322 } |
1386 } |
1323 return -1; |
1387 return -1; |
1324 C2V_END |
1388 C2V_END |
1325 |
1389 |
1326 |
1390 |
1327 C2V_VMENTRY(jobject, getSignaturePolymorphicHolders, (JNIEnv* env, jobject)) |
1391 C2V_VMENTRY_NULL(jobject, getSignaturePolymorphicHolders, (JNIEnv* env, jobject)) |
1328 JVMCIObjectArray holders = JVMCIENV->new_String_array(2, JVMCI_CHECK_NULL); |
1392 JVMCIObjectArray holders = JVMCIENV->new_String_array(2, JVMCI_CHECK_NULL); |
1329 JVMCIObject mh = JVMCIENV->create_string("Ljava/lang/invoke/MethodHandle;", JVMCI_CHECK_NULL); |
1393 JVMCIObject mh = JVMCIENV->create_string("Ljava/lang/invoke/MethodHandle;", JVMCI_CHECK_NULL); |
1330 JVMCIObject vh = JVMCIENV->create_string("Ljava/lang/invoke/VarHandle;", JVMCI_CHECK_NULL); |
1394 JVMCIObject vh = JVMCIENV->create_string("Ljava/lang/invoke/VarHandle;", JVMCI_CHECK_NULL); |
1331 JVMCIENV->put_object_at(holders, 0, mh); |
1395 JVMCIENV->put_object_at(holders, 0, mh); |
1332 JVMCIENV->put_object_at(holders, 1, vh); |
1396 JVMCIENV->put_object_at(holders, 1, vh); |
1333 return JVMCIENV->get_jobject(holders); |
1397 return JVMCIENV->get_jobject(holders); |
1334 C2V_END |
1398 C2V_END |
1335 |
1399 |
1336 C2V_VMENTRY(jboolean, shouldDebugNonSafepoints, (JNIEnv* env, jobject)) |
1400 C2V_VMENTRY_0(jboolean, shouldDebugNonSafepoints, (JNIEnv* env, jobject)) |
1337 //see compute_recording_non_safepoints in debugInfroRec.cpp |
1401 //see compute_recording_non_safepoints in debugInfroRec.cpp |
1338 if (JvmtiExport::should_post_compiled_method_load() && FLAG_IS_DEFAULT(DebugNonSafepoints)) { |
1402 if (JvmtiExport::should_post_compiled_method_load() && FLAG_IS_DEFAULT(DebugNonSafepoints)) { |
1339 return true; |
1403 return true; |
1340 } |
1404 } |
1341 return DebugNonSafepoints; |
1405 return DebugNonSafepoints; |
1463 } |
1525 } |
1464 } |
1526 } |
1465 HotSpotJVMCI::HotSpotStackFrameReference::set_objectsMaterialized(JVMCIENV, hs_frame, JNI_TRUE); |
1527 HotSpotJVMCI::HotSpotStackFrameReference::set_objectsMaterialized(JVMCIENV, hs_frame, JNI_TRUE); |
1466 C2V_END |
1528 C2V_END |
1467 |
1529 |
1468 C2V_VMENTRY(void, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length)) |
1530 // Creates a scope where the current thread is attached and detached |
|
1531 // from HotSpot if it wasn't already attached when entering the scope. |
|
1532 extern "C" void jio_printf(const char *fmt, ...); |
|
1533 class AttachDetach : public StackObj { |
|
1534 public: |
|
1535 bool _attached; |
|
1536 AttachDetach(JNIEnv* env, Thread* current_thread) { |
|
1537 if (current_thread == NULL) { |
|
1538 extern struct JavaVM_ main_vm; |
|
1539 JNIEnv* hotspotEnv; |
|
1540 jint res = main_vm.AttachCurrentThread((void**)&hotspotEnv, NULL); |
|
1541 _attached = res == JNI_OK; |
|
1542 static volatile int report_attach_error = 0; |
|
1543 if (res != JNI_OK && report_attach_error == 0 && Atomic::cmpxchg(1, &report_attach_error, 0) == 0) { |
|
1544 // Only report an attach error once |
|
1545 jio_printf("Warning: attaching current thread to VM failed with %d (future attach errors are suppressed)\n", res); |
|
1546 } |
|
1547 } else { |
|
1548 _attached = false; |
|
1549 } |
|
1550 } |
|
1551 ~AttachDetach() { |
|
1552 if (_attached && get_current_thread() != NULL) { |
|
1553 extern struct JavaVM_ main_vm; |
|
1554 jint res = main_vm.DetachCurrentThread(); |
|
1555 static volatile int report_detach_error = 0; |
|
1556 if (res != JNI_OK && report_detach_error == 0 && Atomic::cmpxchg(1, &report_detach_error, 0) == 0) { |
|
1557 // Only report an attach error once |
|
1558 jio_printf("Warning: detaching current thread from VM failed with %d (future attach errors are suppressed)\n", res); |
|
1559 } |
|
1560 } |
|
1561 } |
|
1562 }; |
|
1563 |
|
1564 C2V_VMENTRY_PREFIX(jint, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length, bool flush, bool can_throw)) |
|
1565 AttachDetach ad(env, base_thread); |
|
1566 bool use_tty = true; |
|
1567 if (base_thread == NULL) { |
|
1568 if (!ad._attached) { |
|
1569 // Can only use tty if the current thread is attached |
|
1570 return 0; |
|
1571 } |
|
1572 base_thread = get_current_thread(); |
|
1573 } |
|
1574 JVMCITraceMark jtm("writeDebugOutput"); |
|
1575 assert(base_thread->is_Java_thread(), "just checking"); |
|
1576 JavaThread* thread = (JavaThread*) base_thread; |
|
1577 C2V_BLOCK(void, writeDebugOutput, (JNIEnv* env, jobject, jbyteArray bytes, jint offset, jint length)) |
1469 if (bytes == NULL) { |
1578 if (bytes == NULL) { |
1470 JVMCI_THROW(NullPointerException); |
1579 if (can_throw) { |
|
1580 JVMCI_THROW_0(NullPointerException); |
|
1581 } |
|
1582 return -1; |
1471 } |
1583 } |
1472 JVMCIPrimitiveArray array = JVMCIENV->wrap(bytes); |
1584 JVMCIPrimitiveArray array = JVMCIENV->wrap(bytes); |
1473 |
1585 |
1474 // Check if offset and length are non negative. |
1586 // Check if offset and length are non negative. |
1475 if (offset < 0 || length < 0) { |
1587 if (offset < 0 || length < 0) { |
1476 JVMCI_THROW(ArrayIndexOutOfBoundsException); |
1588 if (can_throw) { |
|
1589 JVMCI_THROW_0(ArrayIndexOutOfBoundsException); |
|
1590 } |
|
1591 return -2; |
1477 } |
1592 } |
1478 // Check if the range is valid. |
1593 // Check if the range is valid. |
1479 int array_length = JVMCIENV->get_length(array); |
1594 int array_length = JVMCIENV->get_length(array); |
1480 if ((((unsigned int) length + (unsigned int) offset) > (unsigned int) array_length)) { |
1595 if ((((unsigned int) length + (unsigned int) offset) > (unsigned int) array_length)) { |
1481 JVMCI_THROW(ArrayIndexOutOfBoundsException); |
1596 if (can_throw) { |
|
1597 JVMCI_THROW_0(ArrayIndexOutOfBoundsException); |
|
1598 } |
|
1599 return -2; |
1482 } |
1600 } |
1483 jbyte buffer[O_BUFLEN]; |
1601 jbyte buffer[O_BUFLEN]; |
1484 while (length > 0) { |
1602 while (length > 0) { |
1485 int copy_len = MIN2(length, (jint)O_BUFLEN); |
1603 int copy_len = MIN2(length, (jint)O_BUFLEN); |
1486 JVMCIENV->copy_bytes_to(array, buffer, offset, copy_len); |
1604 JVMCIENV->copy_bytes_to(array, buffer, offset, copy_len); |
1487 tty->write((char*) buffer, copy_len); |
1605 tty->write((char*) buffer, copy_len); |
1488 length -= O_BUFLEN; |
1606 length -= O_BUFLEN; |
1489 offset += O_BUFLEN; |
1607 offset += O_BUFLEN; |
1490 } |
1608 } |
|
1609 if (flush) { |
|
1610 tty->flush(); |
|
1611 } |
|
1612 return 0; |
1491 C2V_END |
1613 C2V_END |
1492 |
1614 |
1493 C2V_VMENTRY(void, flushDebugOutput, (JNIEnv* env, jobject)) |
1615 C2V_VMENTRY(void, flushDebugOutput, (JNIEnv* env, jobject)) |
1494 tty->flush(); |
1616 tty->flush(); |
1495 C2V_END |
1617 C2V_END |
1496 |
1618 |
1497 C2V_VMENTRY(int, methodDataProfileDataSize, (JNIEnv* env, jobject, jlong metaspace_method_data, jint position)) |
1619 C2V_VMENTRY_0(int, methodDataProfileDataSize, (JNIEnv* env, jobject, jlong metaspace_method_data, jint position)) |
1498 MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data); |
1620 MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data); |
1499 ProfileData* profile_data = mdo->data_at(position); |
1621 ProfileData* profile_data = mdo->data_at(position); |
1500 if (mdo->is_valid(profile_data)) { |
1622 if (mdo->is_valid(profile_data)) { |
1501 return profile_data->size_in_bytes(); |
1623 return profile_data->size_in_bytes(); |
1502 } |
1624 } |
1523 #else |
1645 #else |
1524 JVMCI_THROW_MSG_0(InternalError, "unimplemented"); |
1646 JVMCI_THROW_MSG_0(InternalError, "unimplemented"); |
1525 #endif |
1647 #endif |
1526 C2V_END |
1648 C2V_END |
1527 |
1649 |
1528 C2V_VMENTRY(jobject, getHostClass, (JNIEnv* env, jobject, jobject jvmci_type)) |
1650 C2V_VMENTRY_NULL(jobject, getHostClass, (JNIEnv* env, jobject, jobject jvmci_type)) |
1529 InstanceKlass* k = InstanceKlass::cast(JVMCIENV->asKlass(jvmci_type)); |
1651 InstanceKlass* k = InstanceKlass::cast(JVMCIENV->asKlass(jvmci_type)); |
1530 InstanceKlass* host = k->unsafe_anonymous_host(); |
1652 InstanceKlass* host = k->unsafe_anonymous_host(); |
1531 JVMCIKlassHandle handle(THREAD, host); |
1653 JVMCIKlassHandle handle(THREAD, host); |
1532 JVMCIObject result = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL); |
1654 JVMCIObject result = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL); |
1533 return JVMCIENV->get_jobject(result); |
1655 return JVMCIENV->get_jobject(result); |
1534 C2V_END |
1656 C2V_END |
1535 |
1657 |
1536 C2V_VMENTRY(jobject, getInterfaces, (JNIEnv* env, jobject, jobject jvmci_type)) |
1658 C2V_VMENTRY_NULL(jobject, getInterfaces, (JNIEnv* env, jobject, jobject jvmci_type)) |
1537 if (jvmci_type == NULL) { |
1659 if (jvmci_type == NULL) { |
1538 JVMCI_THROW_0(NullPointerException); |
1660 JVMCI_THROW_0(NullPointerException); |
1539 } |
1661 } |
1540 |
1662 |
1541 Klass* klass = JVMCIENV->asKlass(jvmci_type); |
1663 Klass* klass = JVMCIENV->asKlass(jvmci_type); |
1646 JVMCI_THROW_MSG(IllegalArgumentException, |
1768 JVMCI_THROW_MSG(IllegalArgumentException, |
1647 err_msg("Unexpected type: %s", lambda_form->klass()->external_name())) |
1769 err_msg("Unexpected type: %s", lambda_form->klass()->external_name())) |
1648 } |
1770 } |
1649 C2V_END |
1771 C2V_END |
1650 |
1772 |
1651 C2V_VMENTRY(int, getIdentityHashCode, (JNIEnv* env, jobject, jobject object)) |
1773 C2V_VMENTRY_0(int, getIdentityHashCode, (JNIEnv* env, jobject, jobject object)) |
1652 Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0); |
1774 Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0); |
1653 return obj->identity_hash(); |
1775 return obj->identity_hash(); |
1654 C2V_END |
1776 C2V_END |
1655 |
1777 |
1656 C2V_VMENTRY(jboolean, isInternedString, (JNIEnv* env, jobject, jobject object)) |
1778 C2V_VMENTRY_0(jboolean, isInternedString, (JNIEnv* env, jobject, jobject object)) |
1657 Handle str = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0); |
1779 Handle str = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0); |
1658 if (!java_lang_String::is_instance(str())) { |
1780 if (!java_lang_String::is_instance(str())) { |
1659 return false; |
1781 return false; |
1660 } |
1782 } |
1661 int len; |
1783 int len; |
1662 jchar* name = java_lang_String::as_unicode_string(str(), len, CHECK_0); |
1784 jchar* name = java_lang_String::as_unicode_string(str(), len, CHECK_0); |
1663 return (StringTable::lookup(name, len) != NULL); |
1785 return (StringTable::lookup(name, len) != NULL); |
1664 C2V_END |
1786 C2V_END |
1665 |
1787 |
1666 |
1788 |
1667 C2V_VMENTRY(jobject, unboxPrimitive, (JNIEnv* env, jobject, jobject object)) |
1789 C2V_VMENTRY_NULL(jobject, unboxPrimitive, (JNIEnv* env, jobject, jobject object)) |
1668 if (object == NULL) { |
1790 if (object == NULL) { |
1669 JVMCI_THROW_0(NullPointerException); |
1791 JVMCI_THROW_0(NullPointerException); |
1670 } |
1792 } |
1671 Handle box = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL); |
1793 Handle box = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL); |
1672 BasicType type = java_lang_boxing_object::basic_type(box()); |
1794 BasicType type = java_lang_boxing_object::basic_type(box()); |
1846 } |
1968 } |
1847 JVMCIObject result = JVMCIENV->call_PrimitiveConstant_forTypeChar(type2char(constant_type), value, JVMCI_CHECK_NULL); |
1969 JVMCIObject result = JVMCIENV->call_PrimitiveConstant_forTypeChar(type2char(constant_type), value, JVMCI_CHECK_NULL); |
1848 return JVMCIENV->get_jobject(result); |
1970 return JVMCIENV->get_jobject(result); |
1849 C2V_END |
1971 C2V_END |
1850 |
1972 |
1851 C2V_VMENTRY(jboolean, isInstance, (JNIEnv* env, jobject, jobject holder, jobject object)) |
1973 C2V_VMENTRY_0(jboolean, isInstance, (JNIEnv* env, jobject, jobject holder, jobject object)) |
1852 if (object == NULL || holder == NULL) { |
1974 if (object == NULL || holder == NULL) { |
1853 JVMCI_THROW_0(NullPointerException); |
1975 JVMCI_THROW_0(NullPointerException); |
1854 } |
1976 } |
1855 Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0); |
1977 Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_0); |
1856 Klass* klass = JVMCIENV->asKlass(JVMCIENV->wrap(holder)); |
1978 Klass* klass = JVMCIENV->asKlass(JVMCIENV->wrap(holder)); |
1857 return obj->is_a(klass); |
1979 return obj->is_a(klass); |
1858 C2V_END |
1980 C2V_END |
1859 |
1981 |
1860 C2V_VMENTRY(jboolean, isAssignableFrom, (JNIEnv* env, jobject, jobject holder, jobject otherHolder)) |
1982 C2V_VMENTRY_0(jboolean, isAssignableFrom, (JNIEnv* env, jobject, jobject holder, jobject otherHolder)) |
1861 if (holder == NULL || otherHolder == NULL) { |
1983 if (holder == NULL || otherHolder == NULL) { |
1862 JVMCI_THROW_0(NullPointerException); |
1984 JVMCI_THROW_0(NullPointerException); |
1863 } |
1985 } |
1864 Klass* klass = JVMCIENV->asKlass(JVMCIENV->wrap(holder)); |
1986 Klass* klass = JVMCIENV->asKlass(JVMCIENV->wrap(holder)); |
1865 Klass* otherKlass = JVMCIENV->asKlass(JVMCIENV->wrap(otherHolder)); |
1987 Klass* otherKlass = JVMCIENV->asKlass(JVMCIENV->wrap(otherHolder)); |
1866 return otherKlass->is_subtype_of(klass); |
1988 return otherKlass->is_subtype_of(klass); |
1867 C2V_END |
1989 C2V_END |
1868 |
1990 |
1869 C2V_VMENTRY(jboolean, isTrustedForIntrinsics, (JNIEnv* env, jobject, jobject holder)) |
1991 C2V_VMENTRY_0(jboolean, isTrustedForIntrinsics, (JNIEnv* env, jobject, jobject holder)) |
1870 if (holder == NULL) { |
1992 if (holder == NULL) { |
1871 JVMCI_THROW_0(NullPointerException); |
1993 JVMCI_THROW_0(NullPointerException); |
1872 } |
1994 } |
1873 InstanceKlass* ik = InstanceKlass::cast(JVMCIENV->asKlass(JVMCIENV->wrap(holder))); |
1995 InstanceKlass* ik = InstanceKlass::cast(JVMCIENV->asKlass(JVMCIENV->wrap(holder))); |
1874 if (ik->class_loader_data()->is_builtin_class_loader_data()) { |
1996 if (ik->class_loader_data()->is_builtin_class_loader_data()) { |
1875 return true; |
1997 return true; |
1876 } |
1998 } |
1877 return false; |
1999 return false; |
1878 C2V_END |
2000 C2V_END |
1879 |
2001 |
1880 C2V_VMENTRY(jobject, asJavaType, (JNIEnv* env, jobject, jobject object)) |
2002 C2V_VMENTRY_NULL(jobject, asJavaType, (JNIEnv* env, jobject, jobject object)) |
1881 if (object == NULL) { |
2003 if (object == NULL) { |
1882 JVMCI_THROW_0(NullPointerException); |
2004 JVMCI_THROW_0(NullPointerException); |
1883 } |
2005 } |
1884 Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL); |
2006 Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL); |
1885 if (java_lang_Class::is_instance(obj())) { |
2007 if (java_lang_Class::is_instance(obj())) { |
1895 } |
2017 } |
1896 return NULL; |
2018 return NULL; |
1897 C2V_END |
2019 C2V_END |
1898 |
2020 |
1899 |
2021 |
1900 C2V_VMENTRY(jobject, asString, (JNIEnv* env, jobject, jobject object)) |
2022 C2V_VMENTRY_NULL(jobject, asString, (JNIEnv* env, jobject, jobject object)) |
1901 if (object == NULL) { |
2023 if (object == NULL) { |
1902 JVMCI_THROW_0(NullPointerException); |
2024 JVMCI_THROW_0(NullPointerException); |
1903 } |
2025 } |
1904 Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL); |
2026 Handle obj = JVMCIENV->asConstant(JVMCIENV->wrap(object), JVMCI_CHECK_NULL); |
1905 const char* str = java_lang_String::as_utf8_string(obj()); |
2027 const char* str = java_lang_String::as_utf8_string(obj()); |
1906 JVMCIObject result = JVMCIENV->create_string(str, JVMCI_CHECK_NULL); |
2028 JVMCIObject result = JVMCIENV->create_string(str, JVMCI_CHECK_NULL); |
1907 return JVMCIENV->get_jobject(result); |
2029 return JVMCIENV->get_jobject(result); |
1908 C2V_END |
2030 C2V_END |
1909 |
2031 |
1910 |
2032 |
1911 C2V_VMENTRY(jboolean, equals, (JNIEnv* env, jobject, jobject x, jlong xHandle, jobject y, jlong yHandle)) |
2033 C2V_VMENTRY_0(jboolean, equals, (JNIEnv* env, jobject, jobject x, jlong xHandle, jobject y, jlong yHandle)) |
1912 if (x == NULL || y == NULL) { |
2034 if (x == NULL || y == NULL) { |
1913 JVMCI_THROW_0(NullPointerException); |
2035 JVMCI_THROW_0(NullPointerException); |
1914 } |
2036 } |
1915 return JVMCIENV->resolve_handle(xHandle) == JVMCIENV->resolve_handle(yHandle); |
2037 return JVMCIENV->resolve_handle(xHandle) == JVMCIENV->resolve_handle(yHandle); |
1916 C2V_END |
2038 C2V_END |
1917 |
2039 |
1918 C2V_VMENTRY(jobject, getJavaMirror, (JNIEnv* env, jobject, jobject object)) |
2040 C2V_VMENTRY_NULL(jobject, getJavaMirror, (JNIEnv* env, jobject, jobject object)) |
1919 if (object == NULL) { |
2041 if (object == NULL) { |
1920 JVMCI_THROW_0(NullPointerException); |
2042 JVMCI_THROW_0(NullPointerException); |
1921 } |
2043 } |
1922 JVMCIObject base_object = JVMCIENV->wrap(object); |
2044 JVMCIObject base_object = JVMCIENV->wrap(object); |
1923 Handle mirror; |
2045 Handle mirror; |
1984 } |
2106 } |
1985 return NULL;; |
2107 return NULL;; |
1986 C2V_END |
2108 C2V_END |
1987 |
2109 |
1988 |
2110 |
1989 C2V_VMENTRY(jint, arrayBaseOffset, (JNIEnv* env, jobject, jobject kind)) |
2111 C2V_VMENTRY_0(jint, arrayBaseOffset, (JNIEnv* env, jobject, jobject kind)) |
1990 if (kind == NULL) { |
2112 if (kind == NULL) { |
1991 JVMCI_THROW_0(NullPointerException); |
2113 JVMCI_THROW_0(NullPointerException); |
1992 } |
2114 } |
1993 BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->wrap(kind), JVMCI_CHECK_0); |
2115 BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->wrap(kind), JVMCI_CHECK_0); |
1994 return arrayOopDesc::header_size(type) * HeapWordSize; |
2116 return arrayOopDesc::header_size(type) * HeapWordSize; |
1995 C2V_END |
2117 C2V_END |
1996 |
2118 |
1997 C2V_VMENTRY(jint, arrayIndexScale, (JNIEnv* env, jobject, jobject kind)) |
2119 C2V_VMENTRY_0(jint, arrayIndexScale, (JNIEnv* env, jobject, jobject kind)) |
1998 if (kind == NULL) { |
2120 if (kind == NULL) { |
1999 JVMCI_THROW_0(NullPointerException); |
2121 JVMCI_THROW_0(NullPointerException); |
2000 } |
2122 } |
2001 BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->wrap(kind), JVMCI_CHECK_0); |
2123 BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->wrap(kind), JVMCI_CHECK_0); |
2002 return type2aelembytes(type); |
2124 return type2aelembytes(type); |
2003 C2V_END |
2125 C2V_END |
2004 |
2126 |
2005 C2V_VMENTRY(jbyte, getByte, (JNIEnv* env, jobject, jobject x, long displacement)) |
2127 C2V_VMENTRY_0(jbyte, getByte, (JNIEnv* env, jobject, jobject x, long displacement)) |
2006 if (x == NULL) { |
2128 if (x == NULL) { |
2007 JVMCI_THROW_0(NullPointerException); |
2129 JVMCI_THROW_0(NullPointerException); |
2008 } |
2130 } |
2009 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2131 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2010 return xobj->byte_field(displacement); |
2132 return xobj->byte_field(displacement); |
2011 } |
2133 } |
2012 |
2134 |
2013 C2V_VMENTRY(jshort, getShort, (JNIEnv* env, jobject, jobject x, long displacement)) |
2135 C2V_VMENTRY_0(jshort, getShort, (JNIEnv* env, jobject, jobject x, long displacement)) |
2014 if (x == NULL) { |
2136 if (x == NULL) { |
2015 JVMCI_THROW_0(NullPointerException); |
2137 JVMCI_THROW_0(NullPointerException); |
2016 } |
2138 } |
2017 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2139 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2018 return xobj->short_field(displacement); |
2140 return xobj->short_field(displacement); |
2019 } |
2141 } |
2020 |
2142 |
2021 C2V_VMENTRY(jint, getInt, (JNIEnv* env, jobject, jobject x, long displacement)) |
2143 C2V_VMENTRY_0(jint, getInt, (JNIEnv* env, jobject, jobject x, long displacement)) |
2022 if (x == NULL) { |
2144 if (x == NULL) { |
2023 JVMCI_THROW_0(NullPointerException); |
2145 JVMCI_THROW_0(NullPointerException); |
2024 } |
2146 } |
2025 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2147 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2026 return xobj->int_field(displacement); |
2148 return xobj->int_field(displacement); |
2027 } |
2149 } |
2028 |
2150 |
2029 C2V_VMENTRY(jlong, getLong, (JNIEnv* env, jobject, jobject x, long displacement)) |
2151 C2V_VMENTRY_0(jlong, getLong, (JNIEnv* env, jobject, jobject x, long displacement)) |
2030 if (x == NULL) { |
2152 if (x == NULL) { |
2031 JVMCI_THROW_0(NullPointerException); |
2153 JVMCI_THROW_0(NullPointerException); |
2032 } |
2154 } |
2033 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2155 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2034 return xobj->long_field(displacement); |
2156 return xobj->long_field(displacement); |
2035 } |
2157 } |
2036 |
2158 |
2037 C2V_VMENTRY(jobject, getObject, (JNIEnv* env, jobject, jobject x, long displacement)) |
2159 C2V_VMENTRY_NULL(jobject, getObject, (JNIEnv* env, jobject, jobject x, long displacement)) |
2038 if (x == NULL) { |
2160 if (x == NULL) { |
2039 JVMCI_THROW_0(NullPointerException); |
2161 JVMCI_THROW_0(NullPointerException); |
2040 } |
2162 } |
2041 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2163 Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0); |
2042 oop res = xobj->obj_field(displacement); |
2164 oop res = xobj->obj_field(displacement); |
2050 assert(JVMCI::is_global_handle(handle), "Invalid delete of global JNI handle"); |
2172 assert(JVMCI::is_global_handle(handle), "Invalid delete of global JNI handle"); |
2051 *((oop*)handle) = NULL; // Mark the handle as deleted, allocate will reuse it |
2173 *((oop*)handle) = NULL; // Mark the handle as deleted, allocate will reuse it |
2052 } |
2174 } |
2053 } |
2175 } |
2054 |
2176 |
2055 C2V_VMENTRY(jlongArray, registerNativeMethods, (JNIEnv* env, jobject, jclass mirror)) |
2177 static void requireJVMCINativeLibrary(JVMCI_TRAPS) { |
2056 if (!UseJVMCINativeLibrary) { |
2178 if (!UseJVMCINativeLibrary) { |
2057 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, "JVMCI shared library is not enabled (requires -XX:+UseJVMCINativeLibrary)"); |
2179 JVMCI_THROW_MSG(UnsupportedOperationException, "JVMCI shared library is not enabled (requires -XX:+UseJVMCINativeLibrary)"); |
2058 } |
2180 } |
2059 if (!JVMCIENV->is_hotspot()) { |
2181 } |
2060 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, "Cannot call registerNativeMethods from JVMCI shared library"); |
2182 |
2061 } |
2183 static JavaVM* requireNativeLibraryJavaVM(const char* caller, JVMCI_TRAPS) { |
|
2184 JavaVM* javaVM = JVMCIEnv::get_shared_library_javavm(); |
|
2185 if (javaVM == NULL) { |
|
2186 JVMCI_THROW_MSG_NULL(IllegalStateException, err_msg("Require JVMCI shared library to be initialized in %s", caller)); |
|
2187 } |
|
2188 return javaVM; |
|
2189 } |
|
2190 |
|
2191 C2V_VMENTRY_NULL(jlongArray, registerNativeMethods, (JNIEnv* env, jobject, jclass mirror)) |
|
2192 requireJVMCINativeLibrary(JVMCI_CHECK_NULL); |
|
2193 requireInHotSpot("registerNativeMethods", JVMCI_CHECK_NULL); |
2062 void* shared_library = JVMCIEnv::get_shared_library_handle(); |
2194 void* shared_library = JVMCIEnv::get_shared_library_handle(); |
2063 if (shared_library == NULL) { |
2195 if (shared_library == NULL) { |
2064 // Ensure the JVMCI shared library runtime is initialized. |
2196 // Ensure the JVMCI shared library runtime is initialized. |
2065 JVMCIEnv __peer_jvmci_env__(false, __FILE__, __LINE__); |
2197 JVMCIEnv __peer_jvmci_env__(thread, false, __FILE__, __LINE__); |
2066 JVMCIEnv* peerEnv = &__peer_jvmci_env__; |
2198 JVMCIEnv* peerEnv = &__peer_jvmci_env__; |
2067 HandleMark hm; |
2199 HandleMark hm; |
2068 JVMCIRuntime* runtime = JVMCI::compiler_runtime(); |
2200 JVMCIRuntime* runtime = JVMCI::compiler_runtime(); |
2069 JVMCIObject receiver = runtime->get_HotSpotJVMCIRuntime(peerEnv); |
2201 JVMCIObject receiver = runtime->get_HotSpotJVMCIRuntime(peerEnv); |
2070 if (peerEnv->has_pending_exception()) { |
2202 if (peerEnv->has_pending_exception()) { |
2071 peerEnv->describe_pending_exception(true); |
2203 peerEnv->describe_pending_exception(true); |
|
2204 } |
|
2205 shared_library = JVMCIEnv::get_shared_library_handle(); |
|
2206 if (shared_library == NULL) { |
2072 JVMCI_THROW_MSG_0(InternalError, "Error initializing JVMCI runtime"); |
2207 JVMCI_THROW_MSG_0(InternalError, "Error initializing JVMCI runtime"); |
2073 } |
2208 } |
2074 shared_library = JVMCIEnv::get_shared_library_handle(); |
|
2075 } |
|
2076 |
|
2077 if (shared_library == NULL) { |
|
2078 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, "JVMCI shared library is unavailable"); |
|
2079 } |
2209 } |
2080 |
2210 |
2081 if (mirror == NULL) { |
2211 if (mirror == NULL) { |
2082 JVMCI_THROW_0(NullPointerException); |
2212 JVMCI_THROW_0(NullPointerException); |
2083 } |
2213 } |
2111 char* long_name = NativeLookup::long_jni_name(method); |
2241 char* long_name = NativeLookup::long_jni_name(method); |
2112 os::print_jni_name_prefix_on(&st, args_size); |
2242 os::print_jni_name_prefix_on(&st, args_size); |
2113 st.print_raw(pure_name); |
2243 st.print_raw(pure_name); |
2114 st.print_raw(long_name); |
2244 st.print_raw(long_name); |
2115 os::print_jni_name_suffix_on(&st, args_size); |
2245 os::print_jni_name_suffix_on(&st, args_size); |
2116 jni_name = st.as_string(); |
2246 char* jni_long_name = st.as_string(); |
2117 entry = (address) os::dll_lookup(shared_library, jni_name); |
2247 entry = (address) os::dll_lookup(shared_library, jni_long_name); |
|
2248 if (entry == NULL) { |
|
2249 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [neither %s nor %s exist in %s]", |
|
2250 method->name_and_sig_as_C_string(), |
|
2251 jni_name, jni_long_name, JVMCIEnv::get_shared_library_path())); |
|
2252 } |
2118 } |
2253 } |
2119 if (entry == NULL) { |
2254 |
2120 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, method->name_and_sig_as_C_string()); |
|
2121 } |
|
2122 if (method->has_native_function() && entry != method->native_function()) { |
2255 if (method->has_native_function() && entry != method->native_function()) { |
2123 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("Cannot overwrite existing native implementation for %s", |
2256 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [cannot re-link from " PTR_FORMAT " to " PTR_FORMAT "]", |
2124 method->name_and_sig_as_C_string())); |
2257 method->name_and_sig_as_C_string(), p2i(method->native_function()), p2i(entry))); |
2125 } |
2258 } |
2126 method->set_native_function(entry, Method::native_bind_event_is_interesting); |
2259 method->set_native_function(entry, Method::native_bind_event_is_interesting); |
2127 if (PrintJNIResolving) { |
2260 if (PrintJNIResolving) { |
2128 tty->print_cr("[Dynamic-linking native method %s.%s ... JNI]", |
2261 tty->print_cr("[Dynamic-linking native method %s.%s ... JNI]", |
2129 method->method_holder()->external_name(), |
2262 method->method_holder()->external_name(), |
2139 JVMCIENV->put_long_at(result, 2, (jlong) (address) javaVM->functions->reserved1); |
2272 JVMCIENV->put_long_at(result, 2, (jlong) (address) javaVM->functions->reserved1); |
2140 JVMCIENV->put_long_at(result, 3, (jlong) (address) javaVM->functions->reserved2); |
2273 JVMCIENV->put_long_at(result, 3, (jlong) (address) javaVM->functions->reserved2); |
2141 return (jlongArray) JVMCIENV->get_jobject(result); |
2274 return (jlongArray) JVMCIENV->get_jobject(result); |
2142 } |
2275 } |
2143 |
2276 |
2144 C2V_VMENTRY(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle)) |
2277 C2V_VMENTRY_PREFIX(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject c2vm)) |
|
2278 if (base_thread == NULL) { |
|
2279 // Called from unattached JVMCI shared library thread |
|
2280 return false; |
|
2281 } |
|
2282 JVMCITraceMark jtm("isCurrentThreadAttached"); |
|
2283 assert(base_thread->is_Java_thread(), "just checking"); |
|
2284 JavaThread* thread = (JavaThread*) base_thread; |
|
2285 if (thread->jni_environment() == env) { |
|
2286 C2V_BLOCK(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject)) |
|
2287 requireJVMCINativeLibrary(JVMCI_CHECK_0); |
|
2288 JavaVM* javaVM = requireNativeLibraryJavaVM("isCurrentThreadAttached", JVMCI_CHECK_0); |
|
2289 JNIEnv* peerEnv; |
|
2290 return javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) == JNI_OK; |
|
2291 } |
|
2292 return true; |
|
2293 C2V_END |
|
2294 |
|
2295 C2V_VMENTRY_PREFIX(jboolean, attachCurrentThread, (JNIEnv* env, jobject c2vm, jboolean as_daemon)) |
|
2296 if (base_thread == NULL) { |
|
2297 // Called from unattached JVMCI shared library thread |
|
2298 extern struct JavaVM_ main_vm; |
|
2299 JNIEnv* hotspotEnv; |
|
2300 jint res = as_daemon ? main_vm.AttachCurrentThreadAsDaemon((void**)&hotspotEnv, NULL) : |
|
2301 main_vm.AttachCurrentThread((void**)&hotspotEnv, NULL); |
|
2302 if (res != JNI_OK) { |
|
2303 JNI_THROW_("attachCurrentThread", InternalError, err_msg("Trying to attach thread returned %d", res), false); |
|
2304 } |
|
2305 return true; |
|
2306 } |
|
2307 JVMCITraceMark jtm("attachCurrentThread"); |
|
2308 assert(base_thread->is_Java_thread(), "just checking");\ |
|
2309 JavaThread* thread = (JavaThread*) base_thread; |
|
2310 if (thread->jni_environment() == env) { |
|
2311 // Called from HotSpot |
|
2312 C2V_BLOCK(jboolean, attachCurrentThread, (JNIEnv* env, jobject, jboolean)) |
|
2313 requireJVMCINativeLibrary(JVMCI_CHECK_0); |
|
2314 JavaVM* javaVM = requireNativeLibraryJavaVM("attachCurrentThread", JVMCI_CHECK_0); |
|
2315 JavaVMAttachArgs attach_args; |
|
2316 attach_args.version = JNI_VERSION_1_2; |
|
2317 attach_args.name = thread->name(); |
|
2318 attach_args.group = NULL; |
|
2319 JNIEnv* peerEnv; |
|
2320 if (javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) == JNI_OK) { |
|
2321 return false; |
|
2322 } |
|
2323 jint res = as_daemon ? javaVM->AttachCurrentThreadAsDaemon((void**)&peerEnv, &attach_args) : |
|
2324 javaVM->AttachCurrentThread((void**)&peerEnv, &attach_args); |
|
2325 if (res == JNI_OK) { |
|
2326 guarantee(peerEnv != NULL, "must be"); |
|
2327 return true; |
|
2328 } |
|
2329 JVMCI_THROW_MSG_0(InternalError, err_msg("Error %d while attaching %s", res, attach_args.name)); |
|
2330 } |
|
2331 // Called from JVMCI shared library |
|
2332 return false; |
|
2333 C2V_END |
|
2334 |
|
2335 C2V_VMENTRY_PREFIX(void, detachCurrentThread, (JNIEnv* env, jobject c2vm)) |
|
2336 if (base_thread == NULL) { |
|
2337 // Called from unattached JVMCI shared library thread |
|
2338 JNI_THROW("detachCurrentThread", IllegalStateException, err_msg("Cannot detach non-attached thread")); |
|
2339 } |
|
2340 JVMCITraceMark jtm("detachCurrentThread"); |
|
2341 assert(base_thread->is_Java_thread(), "just checking");\ |
|
2342 JavaThread* thread = (JavaThread*) base_thread; |
|
2343 if (thread->jni_environment() == env) { |
|
2344 // Called from HotSpot |
|
2345 C2V_BLOCK(void, detachCurrentThread, (JNIEnv* env, jobject)) |
|
2346 requireJVMCINativeLibrary(JVMCI_CHECK); |
|
2347 requireInHotSpot("detachCurrentThread", JVMCI_CHECK); |
|
2348 JavaVM* javaVM = requireNativeLibraryJavaVM("detachCurrentThread", JVMCI_CHECK); |
|
2349 JNIEnv* peerEnv; |
|
2350 if (javaVM->GetEnv((void**)&peerEnv, JNI_VERSION_1_2) != JNI_OK) { |
|
2351 JVMCI_THROW_MSG(IllegalStateException, err_msg("Cannot detach non-attached thread: %s", thread->name())); |
|
2352 } |
|
2353 jint res = javaVM->DetachCurrentThread(); |
|
2354 if (res != JNI_OK) { |
|
2355 JVMCI_THROW_MSG(InternalError, err_msg("Error %d while attaching %s", res, thread->name())); |
|
2356 } |
|
2357 } else { |
|
2358 // Called from attached JVMCI shared library thread |
|
2359 extern struct JavaVM_ main_vm; |
|
2360 jint res = main_vm.DetachCurrentThread(); |
|
2361 if (res != JNI_OK) { |
|
2362 JNI_THROW("detachCurrentThread", InternalError, err_msg("Cannot detach non-attached thread")); |
|
2363 } |
|
2364 } |
|
2365 C2V_END |
|
2366 |
|
2367 C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle)) |
|
2368 requireJVMCINativeLibrary(JVMCI_CHECK_0); |
2145 if (obj_handle == NULL) { |
2369 if (obj_handle == NULL) { |
2146 return 0L; |
2370 return 0L; |
2147 } |
2371 } |
2148 JVMCIEnv __peer_jvmci_env__(!JVMCIENV->is_hotspot(), __FILE__, __LINE__); |
2372 JVMCIEnv __peer_jvmci_env__(thread, !JVMCIENV->is_hotspot(), __FILE__, __LINE__); |
2149 JVMCIEnv* peerEnv = &__peer_jvmci_env__; |
2373 JVMCIEnv* peerEnv = &__peer_jvmci_env__; |
2150 JVMCIEnv* thisEnv = JVMCIENV; |
2374 JVMCIEnv* thisEnv = JVMCIENV; |
2151 |
2375 |
2152 JVMCIObject obj = thisEnv->wrap(obj_handle); |
2376 JVMCIObject obj = thisEnv->wrap(obj_handle); |
2153 JVMCIObject result; |
2377 JVMCIObject result; |
2244 JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL); |
2469 JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL); |
2245 JVMCIENV->copy_bytes_from((jbyte*) cb->code_begin(), result, 0, code_size); |
2470 JVMCIENV->copy_bytes_from((jbyte*) cb->code_begin(), result, 0, code_size); |
2246 return JVMCIENV->get_jbyteArray(result); |
2471 return JVMCIENV->get_jbyteArray(result); |
2247 } |
2472 } |
2248 |
2473 |
2249 C2V_VMENTRY(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method)) |
2474 C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method)) |
2250 if (env != JavaThread::current()->jni_environment()) { |
2475 requireInHotSpot("asReflectionExecutable", JVMCI_CHECK_NULL); |
2251 JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot"); |
|
2252 } |
|
2253 methodHandle m = JVMCIENV->asMethod(jvmci_method); |
2476 methodHandle m = JVMCIENV->asMethod(jvmci_method); |
2254 oop executable; |
2477 oop executable; |
2255 if (m->is_initializer()) { |
2478 if (m->is_initializer()) { |
2256 if (m->is_static_initializer()) { |
2479 if (m->is_static_initializer()) { |
2257 JVMCI_THROW_MSG_NULL(IllegalArgumentException, |
2480 JVMCI_THROW_MSG_NULL(IllegalArgumentException, |
2262 executable = Reflection::new_method(m, false, CHECK_NULL); |
2485 executable = Reflection::new_method(m, false, CHECK_NULL); |
2263 } |
2486 } |
2264 return JNIHandles::make_local(THREAD, executable); |
2487 return JNIHandles::make_local(THREAD, executable); |
2265 } |
2488 } |
2266 |
2489 |
2267 C2V_VMENTRY(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index)) |
2490 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index)) |
2268 if (env != JavaThread::current()->jni_environment()) { |
2491 requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL); |
2269 JVMCI_THROW_MSG_NULL(InternalError, "Only supported when running in HotSpot"); |
|
2270 } |
|
2271 Klass* klass = JVMCIENV->asKlass(jvmci_type); |
2492 Klass* klass = JVMCIENV->asKlass(jvmci_type); |
2272 if (!klass->is_instance_klass()) { |
2493 if (!klass->is_instance_klass()) { |
2273 JVMCI_THROW_MSG_NULL(IllegalArgumentException, |
2494 JVMCI_THROW_MSG_NULL(IllegalArgumentException, |
2274 err_msg("Expected non-primitive type, got %s", klass->external_name())); |
2495 err_msg("Expected non-primitive type, got %s", klass->external_name())); |
2275 } |
2496 } |
2329 |
2550 |
2330 C2V_VMENTRY(void, releaseFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address)) |
2551 C2V_VMENTRY(void, releaseFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address)) |
2331 FailedSpeculation::free_failed_speculations((FailedSpeculation**)(address) failed_speculations_address); |
2552 FailedSpeculation::free_failed_speculations((FailedSpeculation**)(address) failed_speculations_address); |
2332 } |
2553 } |
2333 |
2554 |
2334 C2V_VMENTRY(bool, addFailedSpeculation, (JNIEnv* env, jobject, jlong failed_speculations_address, jbyteArray speculation_obj)) |
2555 C2V_VMENTRY_0(bool, addFailedSpeculation, (JNIEnv* env, jobject, jlong failed_speculations_address, jbyteArray speculation_obj)) |
2335 JVMCIPrimitiveArray speculation_handle = JVMCIENV->wrap(speculation_obj); |
2556 JVMCIPrimitiveArray speculation_handle = JVMCIENV->wrap(speculation_obj); |
2336 int speculation_len = JVMCIENV->get_length(speculation_handle); |
2557 int speculation_len = JVMCIENV->get_length(speculation_handle); |
2337 char* speculation = NEW_RESOURCE_ARRAY(char, speculation_len); |
2558 char* speculation = NEW_RESOURCE_ARRAY(char, speculation_len); |
2338 JVMCIENV->copy_bytes_to(speculation_handle, (jbyte*) speculation, 0, speculation_len); |
2559 JVMCIENV->copy_bytes_to(speculation_handle, (jbyte*) speculation, 0, speculation_len); |
2339 return FailedSpeculation::add_failed_speculation(NULL, (FailedSpeculation**)(address) failed_speculations_address, (address) speculation, speculation_len); |
2560 return FailedSpeculation::add_failed_speculation(NULL, (FailedSpeculation**)(address) failed_speculations_address, (address) speculation, speculation_len); |
2429 {CC "hasCompiledCodeForOSR", CC "(" HS_RESOLVED_METHOD "II)Z", FN_PTR(hasCompiledCodeForOSR)}, |
2650 {CC "hasCompiledCodeForOSR", CC "(" HS_RESOLVED_METHOD "II)Z", FN_PTR(hasCompiledCodeForOSR)}, |
2430 {CC "getSymbol", CC "(J)" STRING, FN_PTR(getSymbol)}, |
2651 {CC "getSymbol", CC "(J)" STRING, FN_PTR(getSymbol)}, |
2431 {CC "iterateFrames", CC "([" RESOLVED_METHOD "[" RESOLVED_METHOD "I" INSPECTED_FRAME_VISITOR ")" OBJECT, FN_PTR(iterateFrames)}, |
2652 {CC "iterateFrames", CC "([" RESOLVED_METHOD "[" RESOLVED_METHOD "I" INSPECTED_FRAME_VISITOR ")" OBJECT, FN_PTR(iterateFrames)}, |
2432 {CC "materializeVirtualObjects", CC "(" HS_STACK_FRAME_REF "Z)V", FN_PTR(materializeVirtualObjects)}, |
2653 {CC "materializeVirtualObjects", CC "(" HS_STACK_FRAME_REF "Z)V", FN_PTR(materializeVirtualObjects)}, |
2433 {CC "shouldDebugNonSafepoints", CC "()Z", FN_PTR(shouldDebugNonSafepoints)}, |
2654 {CC "shouldDebugNonSafepoints", CC "()Z", FN_PTR(shouldDebugNonSafepoints)}, |
2434 {CC "writeDebugOutput", CC "([BII)V", FN_PTR(writeDebugOutput)}, |
2655 {CC "writeDebugOutput", CC "([BIIZZ)I", FN_PTR(writeDebugOutput)}, |
2435 {CC "flushDebugOutput", CC "()V", FN_PTR(flushDebugOutput)}, |
2656 {CC "flushDebugOutput", CC "()V", FN_PTR(flushDebugOutput)}, |
2436 {CC "methodDataProfileDataSize", CC "(JI)I", FN_PTR(methodDataProfileDataSize)}, |
2657 {CC "methodDataProfileDataSize", CC "(JI)I", FN_PTR(methodDataProfileDataSize)}, |
2437 {CC "getFingerprint", CC "(J)J", FN_PTR(getFingerprint)}, |
2658 {CC "getFingerprint", CC "(J)J", FN_PTR(getFingerprint)}, |
2438 {CC "getHostClass", CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_KLASS, FN_PTR(getHostClass)}, |
2659 {CC "getHostClass", CC "(" HS_RESOLVED_KLASS ")" HS_RESOLVED_KLASS, FN_PTR(getHostClass)}, |
2439 {CC "interpreterFrameSize", CC "(" BYTECODE_FRAME ")I", FN_PTR(interpreterFrameSize)}, |
2660 {CC "interpreterFrameSize", CC "(" BYTECODE_FRAME ")I", FN_PTR(interpreterFrameSize)}, |
2467 {CC "getInt", CC "(" OBJECTCONSTANT "J)I", FN_PTR(getInt)}, |
2688 {CC "getInt", CC "(" OBJECTCONSTANT "J)I", FN_PTR(getInt)}, |
2468 {CC "getLong", CC "(" OBJECTCONSTANT "J)J", FN_PTR(getLong)}, |
2689 {CC "getLong", CC "(" OBJECTCONSTANT "J)J", FN_PTR(getLong)}, |
2469 {CC "getObject", CC "(" OBJECTCONSTANT "J)" OBJECTCONSTANT, FN_PTR(getObject)}, |
2690 {CC "getObject", CC "(" OBJECTCONSTANT "J)" OBJECTCONSTANT, FN_PTR(getObject)}, |
2470 {CC "deleteGlobalHandle", CC "(J)V", FN_PTR(deleteGlobalHandle)}, |
2691 {CC "deleteGlobalHandle", CC "(J)V", FN_PTR(deleteGlobalHandle)}, |
2471 {CC "registerNativeMethods", CC "(" CLASS ")[J", FN_PTR(registerNativeMethods)}, |
2692 {CC "registerNativeMethods", CC "(" CLASS ")[J", FN_PTR(registerNativeMethods)}, |
|
2693 {CC "isCurrentThreadAttached", CC "()Z", FN_PTR(isCurrentThreadAttached)}, |
|
2694 {CC "attachCurrentThread", CC "(Z)Z", FN_PTR(attachCurrentThread)}, |
|
2695 {CC "detachCurrentThread", CC "()V", FN_PTR(detachCurrentThread)}, |
2472 {CC "translate", CC "(" OBJECT ")J", FN_PTR(translate)}, |
2696 {CC "translate", CC "(" OBJECT ")J", FN_PTR(translate)}, |
2473 {CC "unhand", CC "(J)" OBJECT, FN_PTR(unhand)}, |
2697 {CC "unhand", CC "(J)" OBJECT, FN_PTR(unhand)}, |
2474 {CC "updateHotSpotNmethod", CC "(" HS_NMETHOD ")V", FN_PTR(updateHotSpotNmethod)}, |
2698 {CC "updateHotSpotNmethod", CC "(" HS_NMETHOD ")V", FN_PTR(updateHotSpotNmethod)}, |
2475 {CC "getCode", CC "(" HS_INSTALLED_CODE ")[B", FN_PTR(getCode)}, |
2699 {CC "getCode", CC "(" HS_INSTALLED_CODE ")[B", FN_PTR(getCode)}, |
2476 {CC "asReflectionExecutable", CC "(" HS_RESOLVED_METHOD ")" REFLECTION_EXECUTABLE, FN_PTR(asReflectionExecutable)}, |
2700 {CC "asReflectionExecutable", CC "(" HS_RESOLVED_METHOD ")" REFLECTION_EXECUTABLE, FN_PTR(asReflectionExecutable)}, |