# HG changeset patch # User rehn # Date 1568012730 -7200 # Node ID 647d623650d33ed4bd33ec5666df5e4822b01a0b # Parent 95c206a3e53c5873a522ac1cb083fc0480b49c11 8228758: assert(_no_handle_mark_nesting == 0) failed: allocating handle inside NoHandleMark Reviewed-by: coleenp, dcubed, dholmes diff -r 95c206a3e53c -r 647d623650d3 src/hotspot/share/prims/jni.cpp --- a/src/hotspot/share/prims/jni.cpp Mon Sep 09 11:19:51 2019 +0800 +++ b/src/hotspot/share/prims/jni.cpp Mon Sep 09 09:05:30 2019 +0200 @@ -559,7 +559,7 @@ return obj; JNI_END -JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super)) +JNI_ENTRY_NO_PRESERVE(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super)) JNIWrapper("IsSubclassOf"); HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(env, sub, super); @@ -694,7 +694,7 @@ JNI_END -JNI_QUICK_ENTRY(void, jni_ExceptionClear(JNIEnv *env)) +JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionClear(JNIEnv *env)) JNIWrapper("ExceptionClear"); HOTSPOT_JNI_EXCEPTIONCLEAR_ENTRY(env); @@ -791,7 +791,7 @@ HOTSPOT_JNI_DELETEGLOBALREF_RETURN(); JNI_END -JNI_QUICK_ENTRY(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj)) +JNI_ENTRY_NO_PRESERVE(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj)) JNIWrapper("DeleteLocalRef"); HOTSPOT_JNI_DELETELOCALREF_ENTRY(env, obj); @@ -801,7 +801,7 @@ HOTSPOT_JNI_DELETELOCALREF_RETURN(); JNI_END -JNI_QUICK_ENTRY(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2)) +JNI_ENTRY_NO_PRESERVE(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2)) JNIWrapper("IsSameObject"); HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(env, r1, r2); @@ -1277,7 +1277,7 @@ return ret; JNI_END -JNI_QUICK_ENTRY(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)) +JNI_ENTRY_NO_PRESERVE(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)) JNIWrapper("IsInstanceOf"); HOTSPOT_JNI_ISINSTANCEOF_ENTRY(env, obj, clazz); @@ -2066,7 +2066,7 @@ DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return \ , ReturnProbe); \ \ -JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \ +JNI_ENTRY_NO_PRESERVE(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \ JNIWrapper("Get" XSTR(Result) "Field"); \ \ EntryProbe; \ @@ -2137,7 +2137,7 @@ return (address)jni_GetDoubleField; } -JNI_QUICK_ENTRY(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value)) +JNI_ENTRY_NO_PRESERVE(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value)) JNIWrapper("SetObjectField"); HOTSPOT_JNI_SETOBJECTFIELD_ENTRY(env, obj, (uintptr_t) fieldID, value); oop o = JNIHandles::resolve_non_null(obj); @@ -2159,7 +2159,7 @@ #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType \ , EntryProbe, ReturnProbe) \ \ -JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \ +JNI_ENTRY_NO_PRESERVE(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \ JNIWrapper("Set" XSTR(Result) "Field"); \ \ EntryProbe; \ @@ -2425,7 +2425,7 @@ JNI_END -JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string)) +JNI_ENTRY_NO_PRESERVE(jsize, jni_GetStringLength(JNIEnv *env, jstring string)) JNIWrapper("GetStringLength"); HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string); jsize ret = 0; @@ -2436,7 +2436,7 @@ JNI_END -JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars( +JNI_ENTRY_NO_PRESERVE(const jchar*, jni_GetStringChars( JNIEnv *env, jstring string, jboolean *isCopy)) JNIWrapper("GetStringChars"); HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); @@ -2471,7 +2471,7 @@ JNI_END -JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)) +JNI_ENTRY_NO_PRESERVE(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)) JNIWrapper("ReleaseStringChars"); HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars); //%note jni_6 @@ -2543,7 +2543,7 @@ JNI_END -JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array)) +JNI_ENTRY_NO_PRESERVE(jsize, jni_GetArrayLength(JNIEnv *env, jarray array)) JNIWrapper("GetArrayLength"); HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(env, array); arrayOop a = arrayOop(JNIHandles::resolve_non_null(array)); @@ -2700,7 +2700,7 @@ #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag \ , EntryProbe, ReturnProbe) \ \ -JNI_QUICK_ENTRY(ElementType*, \ +JNI_ENTRY_NO_PRESERVE(ElementType*, \ jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \ JNIWrapper("Get" XSTR(Result) "ArrayElements"); \ EntryProbe; \ @@ -2762,7 +2762,7 @@ #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \ , EntryProbe, ReturnProbe);\ \ -JNI_QUICK_ENTRY(void, \ +JNI_ENTRY_NO_PRESERVE(void, \ jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \ ElementType *buf, jint mode)) \ JNIWrapper("Release" XSTR(Result) "ArrayElements"); \ @@ -3262,7 +3262,7 @@ JNI_END -JNI_QUICK_ENTRY(jboolean, jni_ExceptionCheck(JNIEnv *env)) +JNI_ENTRY_NO_PRESERVE(jboolean, jni_ExceptionCheck(JNIEnv *env)) JNIWrapper("jni_ExceptionCheck"); HOTSPOT_JNI_EXCEPTIONCHECK_ENTRY(env); jni_check_async_exceptions(thread); diff -r 95c206a3e53c -r 647d623650d3 src/hotspot/share/prims/jvm.cpp --- a/src/hotspot/share/prims/jvm.cpp Mon Sep 09 11:19:51 2019 +0800 +++ b/src/hotspot/share/prims/jvm.cpp Mon Sep 09 09:05:30 2019 +0200 @@ -1105,7 +1105,7 @@ JVM_END -JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls)) +JVM_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls)) JVMWrapper("JVM_IsInterface"); oop mirror = JNIHandles::resolve_non_null(cls); if (java_lang_Class::is_primitive(mirror)) { @@ -1278,14 +1278,14 @@ JVM_END -JVM_QUICK_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls)) +JVM_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls)) JVMWrapper("JVM_IsArrayClass"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); return (k != NULL) && k->is_array_klass() ? true : false; JVM_END -JVM_QUICK_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)) +JVM_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)) JVMWrapper("JVM_IsPrimitiveClass"); oop mirror = JNIHandles::resolve_non_null(cls); return (jboolean) java_lang_Class::is_primitive(mirror); @@ -2253,7 +2253,7 @@ JVM_END -JVM_QUICK_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)) +JVM_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)) JVMWrapper("JVM_GetClassCPTypes"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2269,7 +2269,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)) +JVM_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)) JVMWrapper("JVM_GetClassCPEntriesCount"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2277,7 +2277,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)) +JVM_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)) JVMWrapper("JVM_GetClassFieldsCount"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2285,7 +2285,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)) +JVM_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)) JVMWrapper("JVM_GetClassMethodsCount"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2298,7 +2298,7 @@ // Typically, these methods are called in a loop with bounds determined // by the results of JVM_GetClass{Fields,Methods}Count, which return // zero for arrays. -JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)) +JVM_ENTRY(void, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)) JVMWrapper("JVM_GetMethodIxExceptionIndexes"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2313,7 +2313,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)) +JVM_ENTRY(jint, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)) JVMWrapper("JVM_GetMethodIxExceptionsCount"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2322,7 +2322,7 @@ JVM_END -JVM_QUICK_ENTRY(void, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)) +JVM_ENTRY(void, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)) JVMWrapper("JVM_GetMethodIxByteCode"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2331,7 +2331,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)) +JVM_ENTRY(jint, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)) JVMWrapper("JVM_GetMethodIxByteCodeLength"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2340,7 +2340,7 @@ JVM_END -JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)) +JVM_ENTRY(void, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)) JVMWrapper("JVM_GetMethodIxExceptionTableEntry"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2353,7 +2353,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)) +JVM_ENTRY(jint, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)) JVMWrapper("JVM_GetMethodIxExceptionTableLength"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2362,7 +2362,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)) +JVM_ENTRY(jint, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)) JVMWrapper("JVM_GetMethodIxModifiers"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2371,7 +2371,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)) +JVM_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)) JVMWrapper("JVM_GetFieldIxModifiers"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2379,7 +2379,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)) +JVM_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)) JVMWrapper("JVM_GetMethodIxLocalsCount"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2388,7 +2388,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)) +JVM_ENTRY(jint, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)) JVMWrapper("JVM_GetMethodIxArgsSize"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2397,7 +2397,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)) +JVM_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)) JVMWrapper("JVM_GetMethodIxMaxStack"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); @@ -2406,7 +2406,7 @@ JVM_END -JVM_QUICK_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)) +JVM_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)) JVMWrapper("JVM_IsConstructorIx"); ResourceMark rm(THREAD); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); @@ -2416,7 +2416,7 @@ JVM_END -JVM_QUICK_ENTRY(jboolean, JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cls, int method_index)) +JVM_ENTRY(jboolean, JVM_IsVMGeneratedMethodIx(JNIEnv *env, jclass cls, int method_index)) JVMWrapper("JVM_IsVMGeneratedMethodIx"); ResourceMark rm(THREAD); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); @@ -2593,7 +2593,7 @@ JVM_END -JVM_QUICK_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)) +JVM_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)) JVMWrapper("JVM_GetCPMethodModifiers"); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); Klass* k_called = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(called_cls)); @@ -3064,7 +3064,7 @@ JVM_END -JVM_QUICK_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)) +JVM_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)) JVMWrapper("JVM_IsInterrupted"); ThreadsListHandle tlh(thread); diff -r 95c206a3e53c -r 647d623650d3 src/hotspot/share/runtime/interfaceSupport.inline.hpp --- a/src/hotspot/share/runtime/interfaceSupport.inline.hpp Mon Sep 09 11:19:51 2019 +0800 +++ b/src/hotspot/share/runtime/interfaceSupport.inline.hpp Mon Sep 09 09:05:30 2019 +0200 @@ -393,16 +393,6 @@ /* begin of body */ -// QUICK_ENTRY routines behave like ENTRY but without a handle mark - -#define VM_QUICK_ENTRY_BASE(result_type, header, thread) \ - TRACE_CALL(result_type, header) \ - debug_only(NoHandleMark __hm;) \ - Thread* THREAD = thread; \ - os::verify_stack_alignment(); \ - /* begin of body */ - - #define JRT_ENTRY(result_type, header) \ result_type header { \ ThreadInVMfromJava __tiv(thread); \ @@ -474,18 +464,6 @@ VM_ENTRY_BASE(result_type, header, thread) -// Ensure that the VMNativeEntryWrapper constructor, which can cause -// a GC, is called outside the NoHandleMark (set via VM_QUICK_ENTRY_BASE). -#define JNI_QUICK_ENTRY(result_type, header) \ -extern "C" { \ - result_type JNICALL header { \ - JavaThread* thread=JavaThread::thread_from_jni_environment(env); \ - assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \ - ThreadInVMfromNative __tiv(thread); \ - debug_only(VMNativeEntryWrapper __vew;) \ - VM_QUICK_ENTRY_BASE(result_type, header, thread) - - #define JNI_LEAF(result_type, header) \ extern "C" { \ result_type JNICALL header { \ @@ -519,15 +497,6 @@ VM_ENTRY_BASE(result_type, header, thread) -#define JVM_QUICK_ENTRY(result_type, header) \ -extern "C" { \ - result_type JNICALL header { \ - JavaThread* thread=JavaThread::thread_from_jni_environment(env); \ - ThreadInVMfromNative __tiv(thread); \ - debug_only(VMNativeEntryWrapper __vew;) \ - VM_QUICK_ENTRY_BASE(result_type, header, thread) - - #define JVM_LEAF(result_type, header) \ extern "C" { \ result_type JNICALL header { \