48 #include "memory/universe.hpp" |
48 #include "memory/universe.hpp" |
49 #include "oops/access.inline.hpp" |
49 #include "oops/access.inline.hpp" |
50 #include "oops/arrayOop.inline.hpp" |
50 #include "oops/arrayOop.inline.hpp" |
51 #include "oops/instanceKlass.hpp" |
51 #include "oops/instanceKlass.hpp" |
52 #include "oops/instanceOop.hpp" |
52 #include "oops/instanceOop.hpp" |
53 #include "oops/markOop.hpp" |
53 #include "oops/markWord.hpp" |
54 #include "oops/method.hpp" |
54 #include "oops/method.hpp" |
55 #include "oops/objArrayKlass.hpp" |
55 #include "oops/objArrayKlass.hpp" |
56 #include "oops/objArrayOop.inline.hpp" |
56 #include "oops/objArrayOop.inline.hpp" |
57 #include "oops/oop.inline.hpp" |
57 #include "oops/oop.inline.hpp" |
58 #include "oops/symbol.hpp" |
58 #include "oops/symbol.hpp" |
63 #include "prims/jniFastGetField.hpp" |
63 #include "prims/jniFastGetField.hpp" |
64 #include "prims/jvm_misc.hpp" |
64 #include "prims/jvm_misc.hpp" |
65 #include "prims/jvmtiExport.hpp" |
65 #include "prims/jvmtiExport.hpp" |
66 #include "prims/jvmtiThreadState.hpp" |
66 #include "prims/jvmtiThreadState.hpp" |
67 #include "runtime/atomic.hpp" |
67 #include "runtime/atomic.hpp" |
68 #include "runtime/compilationPolicy.hpp" |
|
69 #include "runtime/fieldDescriptor.inline.hpp" |
68 #include "runtime/fieldDescriptor.inline.hpp" |
70 #include "runtime/handles.inline.hpp" |
69 #include "runtime/handles.inline.hpp" |
71 #include "runtime/interfaceSupport.inline.hpp" |
70 #include "runtime/interfaceSupport.inline.hpp" |
72 #include "runtime/java.hpp" |
71 #include "runtime/java.hpp" |
73 #include "runtime/javaCalls.hpp" |
72 #include "runtime/javaCalls.hpp" |
86 #include "utilities/dtrace.hpp" |
85 #include "utilities/dtrace.hpp" |
87 #include "utilities/events.hpp" |
86 #include "utilities/events.hpp" |
88 #include "utilities/histogram.hpp" |
87 #include "utilities/histogram.hpp" |
89 #include "utilities/macros.hpp" |
88 #include "utilities/macros.hpp" |
90 #include "utilities/vmError.hpp" |
89 #include "utilities/vmError.hpp" |
|
90 #if INCLUDE_JVMCI |
|
91 #include "jvmci/jvmciCompiler.hpp" |
|
92 #endif |
91 |
93 |
92 static jint CurrentVersion = JNI_VERSION_10; |
94 static jint CurrentVersion = JNI_VERSION_10; |
93 |
95 |
94 #ifdef _WIN32 |
96 #ifdef _WIN32 |
95 extern LONG WINAPI topLevelExceptionFilter(_EXCEPTION_POINTERS* ); |
97 extern LONG WINAPI topLevelExceptionFilter(_EXCEPTION_POINTERS* ); |
415 loader = Handle(THREAD, k->class_loader()); |
417 loader = Handle(THREAD, k->class_loader()); |
416 } |
418 } |
417 } |
419 } |
418 |
420 |
419 TempNewSymbol sym = SymbolTable::new_symbol(name); |
421 TempNewSymbol sym = SymbolTable::new_symbol(name); |
420 result = find_class_from_class_loader(env, sym, true, loader, |
422 result = find_class_from_class_loader(env, sym, true, true, loader, |
421 protection_domain, true, thread); |
423 protection_domain, true, thread); |
422 |
424 |
423 if (log_is_enabled(Debug, class, resolve) && result != NULL) { |
425 if (log_is_enabled(Debug, class, resolve) && result != NULL) { |
424 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result))); |
426 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result))); |
425 } |
427 } |
557 "java_super computation depends on interface, array, other super"); |
559 "java_super computation depends on interface, array, other super"); |
558 obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(super->java_mirror()); |
560 obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(super->java_mirror()); |
559 return obj; |
561 return obj; |
560 JNI_END |
562 JNI_END |
561 |
563 |
562 JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super)) |
564 JNI_ENTRY_NO_PRESERVE(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super)) |
563 JNIWrapper("IsSubclassOf"); |
565 JNIWrapper("IsSubclassOf"); |
564 |
566 |
565 HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(env, sub, super); |
567 HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(env, sub, super); |
566 |
568 |
567 oop sub_mirror = JNIHandles::resolve_non_null(sub); |
569 oop sub_mirror = JNIHandles::resolve_non_null(sub); |
568 oop super_mirror = JNIHandles::resolve_non_null(super); |
570 oop super_mirror = JNIHandles::resolve_non_null(super); |
569 if (java_lang_Class::is_primitive(sub_mirror) || |
571 if (java_lang_Class::is_primitive(sub_mirror) || |
570 java_lang_Class::is_primitive(super_mirror)) { |
572 java_lang_Class::is_primitive(super_mirror)) { |
571 jboolean ret = oopDesc::equals(sub_mirror, super_mirror); |
573 jboolean ret = (sub_mirror == super_mirror); |
572 |
574 |
573 HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret); |
575 HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret); |
574 return ret; |
576 return ret; |
575 } |
577 } |
576 Klass* sub_klass = java_lang_Class::as_Klass(sub_mirror); |
578 Klass* sub_klass = java_lang_Class::as_Klass(sub_mirror); |
692 |
694 |
693 HOTSPOT_JNI_EXCEPTIONDESCRIBE_RETURN(); |
695 HOTSPOT_JNI_EXCEPTIONDESCRIBE_RETURN(); |
694 JNI_END |
696 JNI_END |
695 |
697 |
696 |
698 |
697 JNI_QUICK_ENTRY(void, jni_ExceptionClear(JNIEnv *env)) |
699 JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionClear(JNIEnv *env)) |
698 JNIWrapper("ExceptionClear"); |
700 JNIWrapper("ExceptionClear"); |
699 |
701 |
700 HOTSPOT_JNI_EXCEPTIONCLEAR_ENTRY(env); |
702 HOTSPOT_JNI_EXCEPTIONCLEAR_ENTRY(env); |
701 |
703 |
702 // The jni code might be using this API to clear java thrown exception. |
704 // The jni code might be using this API to clear java thrown exception. |
789 JNIHandles::destroy_global(ref); |
791 JNIHandles::destroy_global(ref); |
790 |
792 |
791 HOTSPOT_JNI_DELETEGLOBALREF_RETURN(); |
793 HOTSPOT_JNI_DELETEGLOBALREF_RETURN(); |
792 JNI_END |
794 JNI_END |
793 |
795 |
794 JNI_QUICK_ENTRY(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj)) |
796 JNI_ENTRY_NO_PRESERVE(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj)) |
795 JNIWrapper("DeleteLocalRef"); |
797 JNIWrapper("DeleteLocalRef"); |
796 |
798 |
797 HOTSPOT_JNI_DELETELOCALREF_ENTRY(env, obj); |
799 HOTSPOT_JNI_DELETELOCALREF_ENTRY(env, obj); |
798 |
800 |
799 JNIHandles::destroy_local(obj); |
801 JNIHandles::destroy_local(obj); |
800 |
802 |
801 HOTSPOT_JNI_DELETELOCALREF_RETURN(); |
803 HOTSPOT_JNI_DELETELOCALREF_RETURN(); |
802 JNI_END |
804 JNI_END |
803 |
805 |
804 JNI_QUICK_ENTRY(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2)) |
806 JNI_ENTRY_NO_PRESERVE(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2)) |
805 JNIWrapper("IsSameObject"); |
807 JNIWrapper("IsSameObject"); |
806 |
808 |
807 HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(env, r1, r2); |
809 HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(env, r1, r2); |
808 |
810 |
809 jboolean ret = JNIHandles::is_same_object(r1, r2) ? JNI_TRUE : JNI_FALSE; |
811 jboolean ret = JNIHandles::is_same_object(r1, r2) ? JNI_TRUE : JNI_FALSE; |
1102 |
1104 |
1103 // Invoke the method. Result is returned as oop. |
1105 // Invoke the method. Result is returned as oop. |
1104 JavaCalls::call(result, method, &java_args, CHECK); |
1106 JavaCalls::call(result, method, &java_args, CHECK); |
1105 |
1107 |
1106 // Convert result |
1108 // Convert result |
1107 if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) { |
1109 if (is_reference_type(result->get_type())) { |
1108 result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject())); |
1110 result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject())); |
1109 } |
1111 } |
1110 } |
1112 } |
1111 |
1113 |
1112 |
1114 |
1165 |
1167 |
1166 // Invoke the method. Result is returned as oop. |
1168 // Invoke the method. Result is returned as oop. |
1167 JavaCalls::call(result, method, &java_args, CHECK); |
1169 JavaCalls::call(result, method, &java_args, CHECK); |
1168 |
1170 |
1169 // Convert result |
1171 // Convert result |
1170 if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) { |
1172 if (is_reference_type(result->get_type())) { |
1171 result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject())); |
1173 result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject())); |
1172 } |
1174 } |
1173 } |
1175 } |
1174 |
1176 |
1175 |
1177 |
1275 |
1277 |
1276 HOTSPOT_JNI_GETOBJECTCLASS_RETURN(ret); |
1278 HOTSPOT_JNI_GETOBJECTCLASS_RETURN(ret); |
1277 return ret; |
1279 return ret; |
1278 JNI_END |
1280 JNI_END |
1279 |
1281 |
1280 JNI_QUICK_ENTRY(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)) |
1282 JNI_ENTRY_NO_PRESERVE(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)) |
1281 JNIWrapper("IsInstanceOf"); |
1283 JNIWrapper("IsInstanceOf"); |
1282 |
1284 |
1283 HOTSPOT_JNI_ISINSTANCEOF_ENTRY(env, obj, clazz); |
1285 HOTSPOT_JNI_ISINSTANCEOF_ENTRY(env, obj, clazz); |
1284 |
1286 |
1285 jboolean ret = JNI_TRUE; |
1287 jboolean ret = JNI_TRUE; |
2064 , EntryProbe, ReturnProbe) \ |
2066 , EntryProbe, ReturnProbe) \ |
2065 \ |
2067 \ |
2066 DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return \ |
2068 DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return \ |
2067 , ReturnProbe); \ |
2069 , ReturnProbe); \ |
2068 \ |
2070 \ |
2069 JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \ |
2071 JNI_ENTRY_NO_PRESERVE(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \ |
2070 JNIWrapper("Get" XSTR(Result) "Field"); \ |
2072 JNIWrapper("Get" XSTR(Result) "Field"); \ |
2071 \ |
2073 \ |
2072 EntryProbe; \ |
2074 EntryProbe; \ |
2073 Return ret = 0;\ |
2075 Return ret = 0;\ |
2074 DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\ |
2076 DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\ |
2135 } |
2137 } |
2136 address jni_GetDoubleField_addr() { |
2138 address jni_GetDoubleField_addr() { |
2137 return (address)jni_GetDoubleField; |
2139 return (address)jni_GetDoubleField; |
2138 } |
2140 } |
2139 |
2141 |
2140 JNI_QUICK_ENTRY(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value)) |
2142 JNI_ENTRY_NO_PRESERVE(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value)) |
2141 JNIWrapper("SetObjectField"); |
2143 JNIWrapper("SetObjectField"); |
2142 HOTSPOT_JNI_SETOBJECTFIELD_ENTRY(env, obj, (uintptr_t) fieldID, value); |
2144 HOTSPOT_JNI_SETOBJECTFIELD_ENTRY(env, obj, (uintptr_t) fieldID, value); |
2143 oop o = JNIHandles::resolve_non_null(obj); |
2145 oop o = JNIHandles::resolve_non_null(obj); |
2144 Klass* k = o->klass(); |
2146 Klass* k = o->klass(); |
2145 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); |
2147 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); |
2157 |
2159 |
2158 |
2160 |
2159 #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType \ |
2161 #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType \ |
2160 , EntryProbe, ReturnProbe) \ |
2162 , EntryProbe, ReturnProbe) \ |
2161 \ |
2163 \ |
2162 JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \ |
2164 JNI_ENTRY_NO_PRESERVE(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \ |
2163 JNIWrapper("Set" XSTR(Result) "Field"); \ |
2165 JNIWrapper("Set" XSTR(Result) "Field"); \ |
2164 \ |
2166 \ |
2165 EntryProbe; \ |
2167 EntryProbe; \ |
2166 \ |
2168 \ |
2167 oop o = JNIHandles::resolve_non_null(obj); \ |
2169 oop o = JNIHandles::resolve_non_null(obj); \ |
2423 ret = (jstring) JNIHandles::make_local(env, string); |
2425 ret = (jstring) JNIHandles::make_local(env, string); |
2424 return ret; |
2426 return ret; |
2425 JNI_END |
2427 JNI_END |
2426 |
2428 |
2427 |
2429 |
2428 JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string)) |
2430 JNI_ENTRY_NO_PRESERVE(jsize, jni_GetStringLength(JNIEnv *env, jstring string)) |
2429 JNIWrapper("GetStringLength"); |
2431 JNIWrapper("GetStringLength"); |
2430 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string); |
2432 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string); |
2431 jsize ret = 0; |
2433 jsize ret = 0; |
2432 oop s = JNIHandles::resolve_non_null(string); |
2434 oop s = JNIHandles::resolve_non_null(string); |
2433 ret = java_lang_String::length(s); |
2435 ret = java_lang_String::length(s); |
2434 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret); |
2436 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret); |
2435 return ret; |
2437 return ret; |
2436 JNI_END |
2438 JNI_END |
2437 |
2439 |
2438 |
2440 |
2439 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars( |
2441 JNI_ENTRY_NO_PRESERVE(const jchar*, jni_GetStringChars( |
2440 JNIEnv *env, jstring string, jboolean *isCopy)) |
2442 JNIEnv *env, jstring string, jboolean *isCopy)) |
2441 JNIWrapper("GetStringChars"); |
2443 JNIWrapper("GetStringChars"); |
2442 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); |
2444 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); |
2443 jchar* buf = NULL; |
2445 jchar* buf = NULL; |
2444 oop s = JNIHandles::resolve_non_null(string); |
2446 oop s = JNIHandles::resolve_non_null(string); |
2469 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf); |
2471 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf); |
2470 return buf; |
2472 return buf; |
2471 JNI_END |
2473 JNI_END |
2472 |
2474 |
2473 |
2475 |
2474 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)) |
2476 JNI_ENTRY_NO_PRESERVE(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)) |
2475 JNIWrapper("ReleaseStringChars"); |
2477 JNIWrapper("ReleaseStringChars"); |
2476 HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars); |
2478 HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars); |
2477 //%note jni_6 |
2479 //%note jni_6 |
2478 if (chars != NULL) { |
2480 if (chars != NULL) { |
2479 // Since String objects are supposed to be immutable, don't copy any |
2481 // Since String objects are supposed to be immutable, don't copy any |
2541 } |
2543 } |
2542 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_RETURN(); |
2544 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_RETURN(); |
2543 JNI_END |
2545 JNI_END |
2544 |
2546 |
2545 |
2547 |
2546 JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array)) |
2548 JNI_ENTRY_NO_PRESERVE(jsize, jni_GetArrayLength(JNIEnv *env, jarray array)) |
2547 JNIWrapper("GetArrayLength"); |
2549 JNIWrapper("GetArrayLength"); |
2548 HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(env, array); |
2550 HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(env, array); |
2549 arrayOop a = arrayOop(JNIHandles::resolve_non_null(array)); |
2551 arrayOop a = arrayOop(JNIHandles::resolve_non_null(array)); |
2550 assert(a->is_array(), "must be array"); |
2552 assert(a->is_array(), "must be array"); |
2551 jsize ret = a->length(); |
2553 jsize ret = a->length(); |
2698 |
2700 |
2699 |
2701 |
2700 #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag \ |
2702 #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag \ |
2701 , EntryProbe, ReturnProbe) \ |
2703 , EntryProbe, ReturnProbe) \ |
2702 \ |
2704 \ |
2703 JNI_QUICK_ENTRY(ElementType*, \ |
2705 JNI_ENTRY_NO_PRESERVE(ElementType*, \ |
2704 jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \ |
2706 jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \ |
2705 JNIWrapper("Get" XSTR(Result) "ArrayElements"); \ |
2707 JNIWrapper("Get" XSTR(Result) "ArrayElements"); \ |
2706 EntryProbe; \ |
2708 EntryProbe; \ |
2707 /* allocate an chunk of memory in c land */ \ |
2709 /* allocate an chunk of memory in c land */ \ |
2708 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ |
2710 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ |
2760 |
2762 |
2761 |
2763 |
2762 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \ |
2764 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \ |
2763 , EntryProbe, ReturnProbe);\ |
2765 , EntryProbe, ReturnProbe);\ |
2764 \ |
2766 \ |
2765 JNI_QUICK_ENTRY(void, \ |
2767 JNI_ENTRY_NO_PRESERVE(void, \ |
2766 jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \ |
2768 jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \ |
2767 ElementType *buf, jint mode)) \ |
2769 ElementType *buf, jint mode)) \ |
2768 JNIWrapper("Release" XSTR(Result) "ArrayElements"); \ |
2770 JNIWrapper("Release" XSTR(Result) "ArrayElements"); \ |
2769 EntryProbe; \ |
2771 EntryProbe; \ |
2770 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ |
2772 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ |
3260 JNIHandles::destroy_weak_global(ref); |
3262 JNIHandles::destroy_weak_global(ref); |
3261 HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN(); |
3263 HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN(); |
3262 JNI_END |
3264 JNI_END |
3263 |
3265 |
3264 |
3266 |
3265 JNI_QUICK_ENTRY(jboolean, jni_ExceptionCheck(JNIEnv *env)) |
3267 JNI_ENTRY_NO_PRESERVE(jboolean, jni_ExceptionCheck(JNIEnv *env)) |
3266 JNIWrapper("jni_ExceptionCheck"); |
3268 JNIWrapper("jni_ExceptionCheck"); |
3267 HOTSPOT_JNI_EXCEPTIONCHECK_ENTRY(env); |
3269 HOTSPOT_JNI_EXCEPTIONCHECK_ENTRY(env); |
3268 jni_check_async_exceptions(thread); |
3270 jni_check_async_exceptions(thread); |
3269 jboolean ret = (thread->has_pending_exception()) ? JNI_TRUE : JNI_FALSE; |
3271 jboolean ret = (thread->has_pending_exception()) ? JNI_TRUE : JNI_FALSE; |
3270 HOTSPOT_JNI_EXCEPTIONCHECK_RETURN(ret); |
3272 HOTSPOT_JNI_EXCEPTIONCHECK_RETURN(ret); |
3287 static jclass lookupOne(JNIEnv* env, const char* name, TRAPS) { |
3289 static jclass lookupOne(JNIEnv* env, const char* name, TRAPS) { |
3288 Handle loader; // null (bootstrap) loader |
3290 Handle loader; // null (bootstrap) loader |
3289 Handle protection_domain; // null protection domain |
3291 Handle protection_domain; // null protection domain |
3290 |
3292 |
3291 TempNewSymbol sym = SymbolTable::new_symbol(name); |
3293 TempNewSymbol sym = SymbolTable::new_symbol(name); |
3292 jclass result = find_class_from_class_loader(env, sym, true, loader, protection_domain, true, CHECK_NULL); |
3294 jclass result = find_class_from_class_loader(env, sym, true, true, loader, protection_domain, true, CHECK_NULL); |
3293 |
3295 |
3294 if (log_is_enabled(Debug, class, resolve) && result != NULL) { |
3296 if (log_is_enabled(Debug, class, resolve) && result != NULL) { |
3295 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result))); |
3297 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result))); |
3296 } |
3298 } |
3297 return result; |
3299 return result; |
3774 } |
3776 } |
3775 } |
3777 } |
3776 |
3778 |
3777 void quicken_jni_functions() { |
3779 void quicken_jni_functions() { |
3778 // Replace Get<Primitive>Field with fast versions |
3780 // Replace Get<Primitive>Field with fast versions |
3779 if (UseFastJNIAccessors && !JvmtiExport::can_post_field_access() |
3781 if (UseFastJNIAccessors && !VerifyJNIFields && !CountJNICalls && !CheckJNICalls) { |
3780 && !VerifyJNIFields && !CountJNICalls && !CheckJNICalls) { |
|
3781 address func; |
3782 address func; |
3782 func = JNI_FastGetField::generate_fast_get_boolean_field(); |
3783 func = JNI_FastGetField::generate_fast_get_boolean_field(); |
3783 if (func != (address)-1) { |
3784 if (func != (address)-1) { |
3784 jni_NativeInterface.GetBooleanField = (GetBooleanField_t)func; |
3785 jni_NativeInterface.GetBooleanField = (GetBooleanField_t)func; |
3785 } |
3786 } |
4134 |
4135 |
4135 thread->initialize_tlab(); |
4136 thread->initialize_tlab(); |
4136 |
4137 |
4137 thread->cache_global_variables(); |
4138 thread->cache_global_variables(); |
4138 |
4139 |
4139 // Crucial that we do not have a safepoint check for this thread, since it has |
4140 // This thread will not do a safepoint check, since it has |
4140 // not been added to the Thread list yet. |
4141 // not been added to the Thread list yet. |
4141 { Threads_lock->lock_without_safepoint_check(); |
4142 { MutexLocker ml(Threads_lock); |
4142 // This must be inside this lock in order to get FullGCALot to work properly, i.e., to |
4143 // This must be inside this lock in order to get FullGCALot to work properly, i.e., to |
4143 // avoid this thread trying to do a GC before it is added to the thread-list |
4144 // avoid this thread trying to do a GC before it is added to the thread-list |
4144 thread->set_active_handles(JNIHandleBlock::allocate_block()); |
4145 thread->set_active_handles(JNIHandleBlock::allocate_block()); |
4145 Threads::add(thread, daemon); |
4146 Threads::add(thread, daemon); |
4146 Threads_lock->unlock(); |
|
4147 } |
4147 } |
4148 // Create thread group and name info from attach arguments |
4148 // Create thread group and name info from attach arguments |
4149 oop group = NULL; |
4149 oop group = NULL; |
4150 char* thread_name = NULL; |
4150 char* thread_name = NULL; |
4151 if (args != NULL && Threads::is_supported_jni_version(args->version)) { |
4151 if (args != NULL && Threads::is_supported_jni_version(args->version)) { |