src/hotspot/share/prims/jni.cpp
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 54847 59ea39bb2809
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
    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)) {