8249650: Optimize JNIHandle::make_local thread variable usage

Reviewed-by: kbarrett, dcubed, kvn, coleenp, sspitsyn
This commit is contained in:
David Holmes 2020-07-22 01:27:08 -04:00
parent 2a8f92e7e7
commit 73c75ed838
12 changed files with 154 additions and 185 deletions

View file

@ -436,11 +436,11 @@ char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
char *native_platform_string; char *native_platform_string;
{ JavaThread* thread = (JavaThread*)THREAD; { JavaThread* thread = (JavaThread*)THREAD;
assert(thread->is_Java_thread(), "must be java thread"); assert(thread->is_Java_thread(), "must be java thread");
JNIEnv *env = thread->jni_environment(); jstring js = (jstring) JNIHandles::make_local(thread, java_string());
jstring js = (jstring) JNIHandles::make_local(env, java_string());
bool is_copy; bool is_copy;
HandleMark hm(thread); HandleMark hm(thread);
ThreadToNativeFromVM ttn(thread); ThreadToNativeFromVM ttn(thread);
JNIEnv *env = thread->jni_environment();
native_platform_string = (_to_platform_string_fn)(env, js, &is_copy); native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
assert(is_copy == JNI_TRUE, "is_copy value changed"); assert(is_copy == JNI_TRUE, "is_copy value changed");
JNIHandles::destroy_local(js); JNIHandles::destroy_local(js);
@ -2844,10 +2844,10 @@ Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* h
void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS) { void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS) {
// set Method* or mid/cpref // set Method* or mid/cpref
HandleMark hm(THREAD); HandleMark hm(THREAD);
Handle mname(Thread::current(), stackFrame->obj_field(_memberName_offset)); Handle mname(THREAD, stackFrame->obj_field(_memberName_offset));
InstanceKlass* ik = method->method_holder(); InstanceKlass* ik = method->method_holder();
CallInfo info(method(), ik, CHECK); CallInfo info(method(), ik, CHECK);
MethodHandles::init_method_MemberName(mname, info); MethodHandles::init_method_MemberName(mname, info, THREAD);
// set bci // set bci
java_lang_StackFrameInfo::set_bci(stackFrame(), bci); java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
// method may be redefined; store the version // method may be redefined; store the version

View file

@ -296,7 +296,6 @@ bool Verifier::is_eligible_for_verification(InstanceKlass* klass, bool should_ve
Symbol* Verifier::inference_verify( Symbol* Verifier::inference_verify(
InstanceKlass* klass, char* message, size_t message_len, TRAPS) { InstanceKlass* klass, char* message, size_t message_len, TRAPS) {
JavaThread* thread = (JavaThread*)THREAD; JavaThread* thread = (JavaThread*)THREAD;
JNIEnv *env = thread->jni_environment();
verify_byte_codes_fn_t verify_func = verify_byte_codes_fn(); verify_byte_codes_fn_t verify_func = verify_byte_codes_fn();
@ -305,10 +304,10 @@ Symbol* Verifier::inference_verify(
return vmSymbols::java_lang_VerifyError(); return vmSymbols::java_lang_VerifyError();
} }
ResourceMark rm(THREAD); ResourceMark rm(thread);
log_info(verification)("Verifying class %s with old format", klass->external_name()); log_info(verification)("Verifying class %s with old format", klass->external_name());
jclass cls = (jclass) JNIHandles::make_local(env, klass->java_mirror()); jclass cls = (jclass) JNIHandles::make_local(thread, klass->java_mirror());
jint result; jint result;
{ {
@ -316,7 +315,7 @@ Symbol* Verifier::inference_verify(
ThreadToNativeFromVM ttn(thread); ThreadToNativeFromVM ttn(thread);
// ThreadToNativeFromVM takes care of changing thread_state, so safepoint // ThreadToNativeFromVM takes care of changing thread_state, so safepoint
// code knows that we have left the VM // code knows that we have left the VM
JNIEnv *env = thread->jni_environment();
result = (*verify_func)(env, cls, message, (int)message_len, klass->major_version()); result = (*verify_func)(env, cls, message, (int)message_len, klass->major_version());
} }

View file

@ -251,7 +251,7 @@ C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong
if (obj != NULL) { if (obj != NULL) {
oopDesc::verify(obj); oopDesc::verify(obj);
} }
return JNIHandles::make_local(obj); return JNIHandles::make_local(THREAD, obj);
C2V_END C2V_END
C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method)) C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
@ -1038,7 +1038,7 @@ C2V_VMENTRY_NULL(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject
if (jap.return_type() == T_VOID) { if (jap.return_type() == T_VOID) {
return NULL; return NULL;
} else if (is_reference_type(jap.return_type())) { } else if (is_reference_type(jap.return_type())) {
return JNIHandles::make_local((oop) result.get_jobject()); return JNIHandles::make_local(THREAD, (oop) result.get_jobject());
} else { } else {
jvalue *value = (jvalue *) result.get_value_addr(); jvalue *value = (jvalue *) result.get_value_addr();
// Narrow the value down if required (Important on big endian machines) // Narrow the value down if required (Important on big endian machines)
@ -2314,7 +2314,7 @@ C2V_VMENTRY_NULL(jlongArray, registerNativeMethods, (JNIEnv* env, jobject, jclas
} }
typeArrayOop info_oop = oopFactory::new_longArray(4, CHECK_0); typeArrayOop info_oop = oopFactory::new_longArray(4, CHECK_0);
jlongArray info = (jlongArray) JNIHandles::make_local(info_oop); jlongArray info = (jlongArray) JNIHandles::make_local(THREAD, info_oop);
runtime->init_JavaVM_info(info, JVMCI_CHECK_0); runtime->init_JavaVM_info(info, JVMCI_CHECK_0);
return info; return info;
} }
@ -2565,7 +2565,7 @@ C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmc
} }
fieldDescriptor fd(iklass, index); fieldDescriptor fd(iklass, index);
oop reflected = Reflection::new_field(&fd, CHECK_NULL); oop reflected = Reflection::new_field(&fd, CHECK_NULL);
return JNIHandles::make_local(env, reflected); return JNIHandles::make_local(THREAD, reflected);
} }
C2V_VMENTRY_NULL(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current)) C2V_VMENTRY_NULL(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))

View file

@ -344,8 +344,7 @@ JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderR
trace_class_resolution(k); trace_class_resolution(k);
} }
cls = (jclass)JNIHandles::make_local( cls = (jclass)JNIHandles::make_local(THREAD, k->java_mirror());
env, k->java_mirror());
return cls; return cls;
JNI_END JNI_END
@ -501,7 +500,7 @@ JNI_ENTRY(jobject, jni_ToReflectedMethod(JNIEnv *env, jclass cls, jmethodID meth
} else { } else {
reflection_method = Reflection::new_method(m, false, CHECK_NULL); reflection_method = Reflection::new_method(m, false, CHECK_NULL);
} }
ret = JNIHandles::make_local(env, reflection_method); ret = JNIHandles::make_local(THREAD, reflection_method);
return ret; return ret;
JNI_END JNI_END
@ -535,7 +534,7 @@ JNI_ENTRY(jclass, jni_GetSuperclass(JNIEnv *env, jclass sub))
: k->super() ) ); : k->super() ) );
assert(super == super2, assert(super == super2,
"java_super computation depends on interface, array, other super"); "java_super computation depends on interface, array, other super");
obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(super->java_mirror()); obj = (super == NULL) ? NULL : (jclass) JNIHandles::make_local(THREAD, super->java_mirror());
return obj; return obj;
JNI_END JNI_END
@ -623,7 +622,7 @@ JNI_ENTRY_NO_PRESERVE(jthrowable, jni_ExceptionOccurred(JNIEnv *env))
jni_check_async_exceptions(thread); jni_check_async_exceptions(thread);
oop exception = thread->pending_exception(); oop exception = thread->pending_exception();
jthrowable ret = (jthrowable) JNIHandles::make_local(env, exception); jthrowable ret = (jthrowable) JNIHandles::make_local(THREAD, exception);
HOTSPOT_JNI_EXCEPTIONOCCURRED_RETURN(ret); HOTSPOT_JNI_EXCEPTIONOCCURRED_RETURN(ret);
return ret; return ret;
@ -798,7 +797,7 @@ JNI_ENTRY(jobject, jni_NewLocalRef(JNIEnv *env, jobject ref))
HOTSPOT_JNI_NEWLOCALREF_ENTRY(env, ref); HOTSPOT_JNI_NEWLOCALREF_ENTRY(env, ref);
jobject ret = JNIHandles::make_local(env, JNIHandles::resolve(ref)); jobject ret = JNIHandles::make_local(THREAD, JNIHandles::resolve(ref));
HOTSPOT_JNI_NEWLOCALREF_RETURN(ret); HOTSPOT_JNI_NEWLOCALREF_RETURN(ret);
return ret; return ret;
@ -976,7 +975,7 @@ static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver,
// Convert result // Convert result
if (is_reference_type(result->get_type())) { if (is_reference_type(result->get_type())) {
result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject())); result->set_jobject(JNIHandles::make_local(THREAD, (oop) result->get_jobject()));
} }
} }
@ -1038,7 +1037,7 @@ static void jni_invoke_nonstatic(JNIEnv *env, JavaValue* result, jobject receive
// Convert result // Convert result
if (is_reference_type(result->get_type())) { if (is_reference_type(result->get_type())) {
result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject())); result->set_jobject(JNIHandles::make_local(THREAD, (oop) result->get_jobject()));
} }
} }
@ -1054,7 +1053,7 @@ JNI_ENTRY(jobject, jni_AllocObject(JNIEnv *env, jclass clazz))
DT_RETURN_MARK(AllocObject, jobject, (const jobject&)ret); DT_RETURN_MARK(AllocObject, jobject, (const jobject&)ret);
instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(clazz), CHECK_NULL); instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(clazz), CHECK_NULL);
ret = JNIHandles::make_local(env, i); ret = JNIHandles::make_local(THREAD, i);
return ret; return ret;
JNI_END JNI_END
@ -1070,7 +1069,7 @@ JNI_ENTRY(jobject, jni_NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID,
DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj); DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj);
instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(clazz), CHECK_NULL); instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(clazz), CHECK_NULL);
obj = JNIHandles::make_local(env, i); obj = JNIHandles::make_local(THREAD, i);
JavaValue jvalue(T_VOID); JavaValue jvalue(T_VOID);
JNI_ArgumentPusherArray ap(methodID, args); JNI_ArgumentPusherArray ap(methodID, args);
jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL); jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
@ -1090,7 +1089,7 @@ JNI_ENTRY(jobject, jni_NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID,
DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj); DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj);
instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(clazz), CHECK_NULL); instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(clazz), CHECK_NULL);
obj = JNIHandles::make_local(env, i); obj = JNIHandles::make_local(THREAD, i);
JavaValue jvalue(T_VOID); JavaValue jvalue(T_VOID);
JNI_ArgumentPusherVaArg ap(methodID, args); JNI_ArgumentPusherVaArg ap(methodID, args);
jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL); jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
@ -1110,7 +1109,7 @@ JNI_ENTRY(jobject, jni_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID,
DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj); DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj);
instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(clazz), CHECK_NULL); instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(clazz), CHECK_NULL);
obj = JNIHandles::make_local(env, i); obj = JNIHandles::make_local(THREAD, i);
va_list args; va_list args;
va_start(args, methodID); va_start(args, methodID);
JavaValue jvalue(T_VOID); JavaValue jvalue(T_VOID);
@ -1128,7 +1127,7 @@ JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
Klass* k = JNIHandles::resolve_non_null(obj)->klass(); Klass* k = JNIHandles::resolve_non_null(obj)->klass();
jclass ret = jclass ret =
(jclass) JNIHandles::make_local(env, k->java_mirror()); (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
HOTSPOT_JNI_GETOBJECTCLASS_RETURN(ret); HOTSPOT_JNI_GETOBJECTCLASS_RETURN(ret);
return ret; return ret;
@ -1910,7 +1909,7 @@ JNI_ENTRY(jobject, jni_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID
o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false); o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
} }
oop loaded_obj = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_load_at(o, offset); oop loaded_obj = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_load_at(o, offset);
jobject ret = JNIHandles::make_local(env, loaded_obj); jobject ret = JNIHandles::make_local(THREAD, loaded_obj);
HOTSPOT_JNI_GETOBJECTFIELD_RETURN(ret); HOTSPOT_JNI_GETOBJECTFIELD_RETURN(ret);
return ret; return ret;
JNI_END JNI_END
@ -2090,7 +2089,7 @@ JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldI
} }
assert(found, "bad fieldID passed into jni_ToReflectedField"); assert(found, "bad fieldID passed into jni_ToReflectedField");
oop reflected = Reflection::new_field(&fd, CHECK_NULL); oop reflected = Reflection::new_field(&fd, CHECK_NULL);
ret = JNIHandles::make_local(env, reflected); ret = JNIHandles::make_local(THREAD, reflected);
return ret; return ret;
JNI_END JNI_END
@ -2150,7 +2149,7 @@ JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID
if (JvmtiExport::should_post_field_access()) { if (JvmtiExport::should_post_field_access()) {
JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
} }
jobject ret = JNIHandles::make_local(id->holder()->java_mirror()->obj_field(id->offset())); jobject ret = JNIHandles::make_local(THREAD, id->holder()->java_mirror()->obj_field(id->offset()));
HOTSPOT_JNI_GETSTATICOBJECTFIELD_RETURN(ret); HOTSPOT_JNI_GETSTATICOBJECTFIELD_RETURN(ret);
return ret; return ret;
JNI_END JNI_END
@ -2277,7 +2276,7 @@ JNI_ENTRY(jstring, jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize l
jstring ret = NULL; jstring ret = NULL;
DT_RETURN_MARK(NewString, jstring, (const jstring&)ret); DT_RETURN_MARK(NewString, jstring, (const jstring&)ret);
oop string=java_lang_String::create_oop_from_unicode((jchar*) unicodeChars, len, CHECK_NULL); oop string=java_lang_String::create_oop_from_unicode((jchar*) unicodeChars, len, CHECK_NULL);
ret = (jstring) JNIHandles::make_local(env, string); ret = (jstring) JNIHandles::make_local(THREAD, string);
return ret; return ret;
JNI_END JNI_END
@ -2353,7 +2352,7 @@ JNI_ENTRY(jstring, jni_NewStringUTF(JNIEnv *env, const char *bytes))
DT_RETURN_MARK(NewStringUTF, jstring, (const jstring&)ret); DT_RETURN_MARK(NewStringUTF, jstring, (const jstring&)ret);
oop result = java_lang_String::create_oop_from_str((char*) bytes, CHECK_NULL); oop result = java_lang_String::create_oop_from_str((char*) bytes, CHECK_NULL);
ret = (jstring) JNIHandles::make_local(env, result); ret = (jstring) JNIHandles::make_local(THREAD, result);
return ret; return ret;
JNI_END JNI_END
@ -2433,7 +2432,7 @@ JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass ele
result->obj_at_put(index, initial_value); result->obj_at_put(index, initial_value);
} }
} }
ret = (jobjectArray) JNIHandles::make_local(env, result); ret = (jobjectArray) JNIHandles::make_local(THREAD, result);
return ret; return ret;
JNI_END JNI_END
@ -2447,7 +2446,7 @@ JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, js
DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret); DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array)); objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
if (a->is_within_bounds(index)) { if (a->is_within_bounds(index)) {
ret = JNIHandles::make_local(env, a->obj_at(index)); ret = JNIHandles::make_local(THREAD, a->obj_at(index));
return ret; return ret;
} else { } else {
ResourceMark rm(THREAD); ResourceMark rm(THREAD);
@ -2507,7 +2506,7 @@ JNI_ENTRY(Return, \
DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\ DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
\ \
oop obj= oopFactory::Allocator(len, CHECK_NULL); \ oop obj= oopFactory::Allocator(len, CHECK_NULL); \
ret = (Return) JNIHandles::make_local(env, obj); \ ret = (Return) JNIHandles::make_local(THREAD, obj); \
return ret;\ return ret;\
JNI_END JNI_END

View file

@ -141,7 +141,7 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) {
const char * source_file = NULL; const char * source_file = NULL;
const char * trace = "explicit"; const char * trace = "explicit";
InstanceKlass* caller = NULL; InstanceKlass* caller = NULL;
JavaThread* jthread = JavaThread::current(); JavaThread* jthread = (JavaThread*) THREAD;
if (jthread->has_last_Java_frame()) { if (jthread->has_last_Java_frame()) {
vframeStream vfst(jthread); vframeStream vfst(jthread);
@ -447,7 +447,7 @@ JVM_ENTRY(jobjectArray, JVM_GetProperties(JNIEnv *env))
} }
} }
return (jobjectArray) JNIHandles::make_local(env, result_h()); return (jobjectArray) JNIHandles::make_local(THREAD, result_h());
JVM_END JVM_END
@ -464,7 +464,7 @@ JVM_ENTRY(jstring, JVM_GetTemporaryDirectory(JNIEnv *env))
HandleMark hm(THREAD); HandleMark hm(THREAD);
const char* temp_dir = os::get_temp_directory(); const char* temp_dir = os::get_temp_directory();
Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL); Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL);
return (jstring) JNIHandles::make_local(env, h()); return (jstring) JNIHandles::make_local(THREAD, h());
JVM_END JVM_END
@ -568,7 +568,7 @@ JVM_ENTRY(jstring, JVM_GetExtendedNPEMessage(JNIEnv *env, jthrowable throwable))
bool ok = BytecodeUtils::get_NPE_message_at(&ss, method, bci); bool ok = BytecodeUtils::get_NPE_message_at(&ss, method, bci);
if (ok) { if (ok) {
oop result = java_lang_String::create_oop_from_str(ss.base(), CHECK_NULL); oop result = java_lang_String::create_oop_from_str(ss.base(), CHECK_NULL);
return (jstring) JNIHandles::make_local(env, result); return (jstring) JNIHandles::make_local(THREAD, result);
} else { } else {
return NULL; return NULL;
} }
@ -622,7 +622,7 @@ JVM_ENTRY(jobject, JVM_CallStackWalk(JNIEnv *env, jobject stackStream, jlong mod
oop result = StackWalk::walk(stackStream_h, mode, skip_frames, frame_count, oop result = StackWalk::walk(stackStream_h, mode, skip_frames, frame_count,
start_index, frames_array_h, CHECK_NULL); start_index, frames_array_h, CHECK_NULL);
return JNIHandles::make_local(env, result); return JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -630,7 +630,6 @@ JVM_ENTRY(jint, JVM_MoreStackWalk(JNIEnv *env, jobject stackStream, jlong mode,
jint frame_count, jint start_index, jint frame_count, jint start_index,
jobjectArray frames)) jobjectArray frames))
JVMWrapper("JVM_MoreStackWalk"); JVMWrapper("JVM_MoreStackWalk");
JavaThread* jt = (JavaThread*) THREAD;
// frames array is a Class<?>[] array when only getting caller reference, // frames array is a Class<?>[] array when only getting caller reference,
// and a StackFrameInfo[] array (or derivative) otherwise. It should never // and a StackFrameInfo[] array (or derivative) otherwise. It should never
@ -738,7 +737,7 @@ JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
new_obj = Handle(THREAD, new_obj_oop); new_obj = Handle(THREAD, new_obj_oop);
} }
return JNIHandles::make_local(env, new_obj()); return JNIHandles::make_local(THREAD, new_obj());
JVM_END JVM_END
// java.io.File /////////////////////////////////////////////////////////////// // java.io.File ///////////////////////////////////////////////////////////////
@ -784,7 +783,7 @@ JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env))
default: default:
if (!m->is_ignored_by_security_stack_walk()) { if (!m->is_ignored_by_security_stack_walk()) {
// We have reached the desired frame; return the holder class. // We have reached the desired frame; return the holder class.
return (jclass) JNIHandles::make_local(env, m->method_holder()->java_mirror()); return (jclass) JNIHandles::make_local(THREAD, m->method_holder()->java_mirror());
} }
break; break;
} }
@ -803,7 +802,7 @@ JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))
if (mirror == NULL) { if (mirror == NULL) {
THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf); THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);
} else { } else {
return (jclass) JNIHandles::make_local(env, mirror); return (jclass) JNIHandles::make_local(THREAD, mirror);
} }
JVM_END JVM_END
@ -832,7 +831,7 @@ JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
if (log_is_enabled(Debug, class, resolve)) { if (log_is_enabled(Debug, class, resolve)) {
trace_class_resolution(k); trace_class_resolution(k);
} }
return (jclass) JNIHandles::make_local(env, k->java_mirror()); return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
JVM_END JVM_END
// Find a class with this name in this loader, using the caller's protection domain. // Find a class with this name in this loader, using the caller's protection domain.
@ -920,7 +919,7 @@ static void is_lock_held_by_thread(Handle loader, PerfCounter* counter, TRAPS) {
} }
// common code for JVM_DefineClass() and JVM_DefineClassWithSource() // common code for JVM_DefineClass() and JVM_DefineClassWithSource()
static jclass jvm_define_class_common(JNIEnv *env, const char *name, static jclass jvm_define_class_common(const char *name,
jobject loader, const jbyte *buf, jobject loader, const jbyte *buf,
jsize len, jobject pd, const char *source, jsize len, jobject pd, const char *source,
TRAPS) { TRAPS) {
@ -964,7 +963,7 @@ static jclass jvm_define_class_common(JNIEnv *env, const char *name,
trace_class_resolution(k); trace_class_resolution(k);
} }
return (jclass) JNIHandles::make_local(env, k->java_mirror()); return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
} }
enum { enum {
@ -978,11 +977,10 @@ enum {
* Define a class with the specified flags that indicates if it's a nestmate, * Define a class with the specified flags that indicates if it's a nestmate,
* hidden, or strongly referenced from class loader. * hidden, or strongly referenced from class loader.
*/ */
static jclass jvm_lookup_define_class(JNIEnv *env, jclass lookup, const char *name, static jclass jvm_lookup_define_class(jclass lookup, const char *name,
const jbyte *buf, jsize len, jobject pd, const jbyte *buf, jsize len, jobject pd,
jboolean init, int flags, jobject classData, TRAPS) { jboolean init, int flags, jobject classData, TRAPS) {
assert(THREAD->is_Java_thread(), "must be a JavaThread"); assert(THREAD->is_Java_thread(), "must be a JavaThread");
JavaThread* jt = (JavaThread*) THREAD;
ResourceMark rm(THREAD); ResourceMark rm(THREAD);
Klass* lookup_k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(lookup)); Klass* lookup_k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(lookup));
@ -1099,13 +1097,13 @@ static jclass jvm_lookup_define_class(JNIEnv *env, jclass lookup, const char *na
ik->link_class(CHECK_NULL); ik->link_class(CHECK_NULL);
} }
return (jclass) JNIHandles::make_local(env, defined_k->java_mirror()); return (jclass) JNIHandles::make_local(THREAD, defined_k->java_mirror());
} }
JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)) JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
JVMWrapper("JVM_DefineClass"); JVMWrapper("JVM_DefineClass");
return jvm_define_class_common(env, name, loader, buf, len, pd, NULL, THREAD); return jvm_define_class_common(name, loader, buf, len, pd, NULL, THREAD);
JVM_END JVM_END
/* /*
@ -1129,13 +1127,13 @@ JVM_ENTRY(jclass, JVM_LookupDefineClass(JNIEnv *env, jclass lookup, const char *
assert(buf != NULL, "buf must not be NULL"); assert(buf != NULL, "buf must not be NULL");
return jvm_lookup_define_class(env, lookup, name, buf, len, pd, initialize, flags, classData, THREAD); return jvm_lookup_define_class(lookup, name, buf, len, pd, initialize, flags, classData, THREAD);
JVM_END JVM_END
JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)) JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source))
JVMWrapper("JVM_DefineClassWithSource"); JVMWrapper("JVM_DefineClassWithSource");
return jvm_define_class_common(env, name, loader, buf, len, pd, source, THREAD); return jvm_define_class_common(name, loader, buf, len, pd, source, THREAD);
JVM_END JVM_END
JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)) JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))
@ -1187,7 +1185,7 @@ JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
} }
#endif #endif
return (k == NULL) ? NULL : return (k == NULL) ? NULL :
(jclass) JNIHandles::make_local(env, k->java_mirror()); (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
JVM_END JVM_END
// Module support ////////////////////////////////////////////////////////////////////////////// // Module support //////////////////////////////////////////////////////////////////////////////
@ -1233,7 +1231,7 @@ JVM_ENTRY(jstring, JVM_InitClassName(JNIEnv *env, jclass cls))
HandleMark hm(THREAD); HandleMark hm(THREAD);
Handle java_class(THREAD, JNIHandles::resolve(cls)); Handle java_class(THREAD, JNIHandles::resolve(cls));
oop result = java_lang_Class::name(java_class, CHECK_NULL); oop result = java_lang_Class::name(java_class, CHECK_NULL);
return (jstring) JNIHandles::make_local(env, result); return (jstring) JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -1246,7 +1244,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
if (java_lang_Class::is_primitive(mirror)) { if (java_lang_Class::is_primitive(mirror)) {
// Primitive objects does not have any interfaces // Primitive objects does not have any interfaces
objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, r); return (jobjectArray) JNIHandles::make_local(THREAD, r);
} }
Klass* klass = java_lang_Class::as_Klass(mirror); Klass* klass = java_lang_Class::as_Klass(mirror);
@ -1274,7 +1272,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
result->obj_at_put(0, SystemDictionary::Cloneable_klass()->java_mirror()); result->obj_at_put(0, SystemDictionary::Cloneable_klass()->java_mirror());
result->obj_at_put(1, SystemDictionary::Serializable_klass()->java_mirror()); result->obj_at_put(1, SystemDictionary::Serializable_klass()->java_mirror());
} }
return (jobjectArray) JNIHandles::make_local(env, result()); return (jobjectArray) JNIHandles::make_local(THREAD, result());
JVM_END JVM_END
@ -1325,7 +1323,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))
} }
// return the copy // return the copy
return (jobjectArray) JNIHandles::make_local(env, signers_copy); return (jobjectArray) JNIHandles::make_local(THREAD, signers_copy);
JVM_END JVM_END
@ -1355,7 +1353,7 @@ JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls))
} }
oop pd = java_lang_Class::protection_domain(JNIHandles::resolve(cls)); oop pd = java_lang_Class::protection_domain(JNIHandles::resolve(cls));
return (jobject) JNIHandles::make_local(env, pd); return (jobject) JNIHandles::make_local(THREAD, pd);
JVM_END JVM_END
@ -1363,7 +1361,7 @@ JVM_END
JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)) JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls))
JVMWrapper("JVM_GetInheritedAccessControlContext"); JVMWrapper("JVM_GetInheritedAccessControlContext");
oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj()); oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj());
return JNIHandles::make_local(env, result); return JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
class RegisterArrayForGC { class RegisterArrayForGC {
@ -1442,7 +1440,7 @@ JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls))
if (is_privileged && privileged_context.is_null()) return NULL; if (is_privileged && privileged_context.is_null()) return NULL;
oop result = java_security_AccessControlContext::create(objArrayHandle(), is_privileged, privileged_context, CHECK_NULL); oop result = java_security_AccessControlContext::create(objArrayHandle(), is_privileged, privileged_context, CHECK_NULL);
return JNIHandles::make_local(env, result); return JNIHandles::make_local(THREAD, result);
} }
// the resource area must be registered in case of a gc // the resource area must be registered in case of a gc
@ -1456,7 +1454,7 @@ JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls))
oop result = java_security_AccessControlContext::create(h_context, is_privileged, privileged_context, CHECK_NULL); oop result = java_security_AccessControlContext::create(h_context, is_privileged, privileged_context, CHECK_NULL);
return JNIHandles::make_local(env, result); return JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -1498,7 +1496,7 @@ JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) || if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_instance_klass()) { ! java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_instance_klass()) {
oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
return (jobjectArray)JNIHandles::make_local(env, result); return (jobjectArray)JNIHandles::make_local(THREAD, result);
} }
InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))); InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
@ -1507,7 +1505,7 @@ JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
if (iter.length() == 0) { if (iter.length() == 0) {
// Neither an inner nor outer class // Neither an inner nor outer class
oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL); oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
return (jobjectArray)JNIHandles::make_local(env, result); return (jobjectArray)JNIHandles::make_local(THREAD, result);
} }
// find inner class info // find inner class info
@ -1549,10 +1547,10 @@ JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
for(int i = 0; i < members; i++) { for(int i = 0; i < members; i++) {
res->obj_at_put(i, result->obj_at(i)); res->obj_at_put(i, result->obj_at(i));
} }
return (jobjectArray)JNIHandles::make_local(env, res); return (jobjectArray)JNIHandles::make_local(THREAD, res);
} }
return (jobjectArray)JNIHandles::make_local(env, result()); return (jobjectArray)JNIHandles::make_local(THREAD, result());
JVM_END JVM_END
@ -1570,7 +1568,7 @@ JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
)->compute_enclosing_class(&inner_is_member, CHECK_NULL); )->compute_enclosing_class(&inner_is_member, CHECK_NULL);
if (outer_klass == NULL) return NULL; // already a top-level class if (outer_klass == NULL) return NULL; // already a top-level class
if (!inner_is_member) return NULL; // a hidden or unsafe anonymous class (inside a method) if (!inner_is_member) return NULL; // a hidden or unsafe anonymous class (inside a method)
return (jclass) JNIHandles::make_local(env, outer_klass->java_mirror()); return (jclass) JNIHandles::make_local(THREAD, outer_klass->java_mirror());
} }
JVM_END JVM_END
@ -1588,7 +1586,7 @@ JVM_ENTRY(jstring, JVM_GetSimpleBinaryName(JNIEnv *env, jclass cls))
constantPoolHandle i_cp(thread, k->constants()); constantPoolHandle i_cp(thread, k->constants());
Symbol* name = i_cp->symbol_at(noff); Symbol* name = i_cp->symbol_at(noff);
Handle str = java_lang_String::create_from_symbol(name, CHECK_NULL); Handle str = java_lang_String::create_from_symbol(name, CHECK_NULL);
return (jstring) JNIHandles::make_local(env, str()); return (jstring) JNIHandles::make_local(THREAD, str());
} }
} }
return NULL; return NULL;
@ -1607,7 +1605,7 @@ JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
Symbol* sym = InstanceKlass::cast(k)->generic_signature(); Symbol* sym = InstanceKlass::cast(k)->generic_signature();
if (sym == NULL) return NULL; if (sym == NULL) return NULL;
Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
return (jstring) JNIHandles::make_local(env, str()); return (jstring) JNIHandles::make_local(THREAD, str());
} }
} }
return NULL; return NULL;
@ -1623,7 +1621,7 @@ JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
if (k->is_instance_klass()) { if (k->is_instance_klass()) {
typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL); typeArrayOop a = Annotations::make_java_array(InstanceKlass::cast(k)->class_annotations(), CHECK_NULL);
return (jbyteArray) JNIHandles::make_local(env, a); return (jbyteArray) JNIHandles::make_local(THREAD, a);
} }
} }
return NULL; return NULL;
@ -1695,7 +1693,7 @@ JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls))
AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations(); AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations();
if (type_annotations != NULL) { if (type_annotations != NULL) {
typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL); typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
return (jbyteArray) JNIHandles::make_local(env, a); return (jbyteArray) JNIHandles::make_local(THREAD, a);
} }
} }
} }
@ -1715,7 +1713,7 @@ JVM_ENTRY(jbyteArray, JVM_GetMethodTypeAnnotations(JNIEnv *env, jobject method))
AnnotationArray* type_annotations = m->type_annotations(); AnnotationArray* type_annotations = m->type_annotations();
if (type_annotations != NULL) { if (type_annotations != NULL) {
typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL); typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
return (jbyteArray) JNIHandles::make_local(env, a); return (jbyteArray) JNIHandles::make_local(THREAD, a);
} }
return NULL; return NULL;
@ -1731,7 +1729,7 @@ JVM_ENTRY(jbyteArray, JVM_GetFieldTypeAnnotations(JNIEnv *env, jobject field))
return NULL; return NULL;
} }
return (jbyteArray) JNIHandles::make_local(env, Annotations::make_java_array(fd.type_annotations(), THREAD)); return (jbyteArray) JNIHandles::make_local(THREAD, Annotations::make_java_array(fd.type_annotations(), THREAD));
JVM_END JVM_END
static void bounds_check(const constantPoolHandle& cp, jint index, TRAPS) { static void bounds_check(const constantPoolHandle& cp, jint index, TRAPS) {
@ -1787,7 +1785,7 @@ JVM_ENTRY(jobjectArray, JVM_GetMethodParameters(JNIEnv *env, jobject method))
flags, CHECK_NULL); flags, CHECK_NULL);
result->obj_at_put(i, param); result->obj_at_put(i, param);
} }
return (jobjectArray)JNIHandles::make_local(env, result()); return (jobjectArray)JNIHandles::make_local(THREAD, result());
} }
} }
JVM_END JVM_END
@ -1804,7 +1802,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass,
java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_array_klass()) { java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_array_klass()) {
// Return empty array // Return empty array
oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL); oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, res); return (jobjectArray) JNIHandles::make_local(THREAD, res);
} }
InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))); InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
@ -1839,7 +1837,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass,
} }
} }
assert(out_idx == num_fields, "just checking"); assert(out_idx == num_fields, "just checking");
return (jobjectArray) JNIHandles::make_local(env, result()); return (jobjectArray) JNIHandles::make_local(THREAD, result());
} }
JVM_END JVM_END
@ -1881,13 +1879,13 @@ JVM_ENTRY(jobjectArray, JVM_GetRecordComponents(JNIEnv* env, jclass ofClass))
oop component_oop = java_lang_reflect_RecordComponent::create(ik, component, CHECK_NULL); oop component_oop = java_lang_reflect_RecordComponent::create(ik, component, CHECK_NULL);
components_h->obj_at_put(x, component_oop); components_h->obj_at_put(x, component_oop);
} }
return (jobjectArray)JNIHandles::make_local(components_h()); return (jobjectArray)JNIHandles::make_local(THREAD, components_h());
} }
} }
// Return empty array if ofClass is not a record. // Return empty array if ofClass is not a record.
objArrayOop result = oopFactory::new_objArray(SystemDictionary::RecordComponent_klass(), 0, CHECK_NULL); objArrayOop result = oopFactory::new_objArray(SystemDictionary::RecordComponent_klass(), 0, CHECK_NULL);
return (jobjectArray)JNIHandles::make_local(env, result); return (jobjectArray)JNIHandles::make_local(THREAD, result);
} }
JVM_END JVM_END
@ -1912,7 +1910,7 @@ static jobjectArray get_class_declared_methods_helper(
|| java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_array_klass()) { || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->is_array_klass()) {
// Return empty array // Return empty array
oop res = oopFactory::new_objArray(klass, 0, CHECK_NULL); oop res = oopFactory::new_objArray(klass, 0, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, res); return (jobjectArray) JNIHandles::make_local(THREAD, res);
} }
InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))); InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
@ -1965,7 +1963,7 @@ static jobjectArray get_class_declared_methods_helper(
} }
} }
return (jobjectArray) JNIHandles::make_local(env, result()); return (jobjectArray) JNIHandles::make_local(THREAD, result());
} }
JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)) JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
@ -2147,7 +2145,7 @@ JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
InstanceKlass* k_h = InstanceKlass::cast(k); InstanceKlass* k_h = InstanceKlass::cast(k);
Handle jcp = reflect_ConstantPool::create(CHECK_NULL); Handle jcp = reflect_ConstantPool::create(CHECK_NULL);
reflect_ConstantPool::set_cp(jcp(), k_h->constants()); reflect_ConstantPool::set_cp(jcp(), k_h->constants());
return JNIHandles::make_local(jcp()); return JNIHandles::make_local(THREAD, jcp());
} }
} }
return NULL; return NULL;
@ -2174,7 +2172,7 @@ JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject obj, jobject u
THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
} }
Klass* k = cp->klass_at(index, CHECK_NULL); Klass* k = cp->klass_at(index, CHECK_NULL);
return (jclass) JNIHandles::make_local(k->java_mirror()); return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
} }
JVM_END JVM_END
@ -2189,7 +2187,7 @@ JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject obj, j
} }
Klass* k = ConstantPool::klass_at_if_loaded(cp, index); Klass* k = ConstantPool::klass_at_if_loaded(cp, index);
if (k == NULL) return NULL; if (k == NULL) return NULL;
return (jclass) JNIHandles::make_local(k->java_mirror()); return (jclass) JNIHandles::make_local(THREAD, k->java_mirror());
} }
JVM_END JVM_END
@ -2219,7 +2217,7 @@ static jobject get_method_at_helper(const constantPoolHandle& cp, jint index, bo
} else { } else {
method = Reflection::new_constructor(m, CHECK_NULL); method = Reflection::new_constructor(m, CHECK_NULL);
} }
return JNIHandles::make_local(method); return JNIHandles::make_local(THREAD, method);
} }
JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject obj, jobject unused, jint index)) JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject obj, jobject unused, jint index))
@ -2266,7 +2264,7 @@ static jobject get_field_at_helper(constantPoolHandle cp, jint index, bool force
THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class"); THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");
} }
oop field = Reflection::new_field(&fd, CHECK_NULL); oop field = Reflection::new_field(&fd, CHECK_NULL);
return JNIHandles::make_local(field); return JNIHandles::make_local(THREAD, field);
} }
JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject obj, jobject unusedl, jint index)) JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject obj, jobject unusedl, jint index))
@ -2313,7 +2311,7 @@ JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject
dest->obj_at_put(1, str()); dest->obj_at_put(1, str());
str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL); str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
dest->obj_at_put(2, str()); dest->obj_at_put(2, str());
return (jobjectArray) JNIHandles::make_local(dest()); return (jobjectArray) JNIHandles::make_local(THREAD, dest());
} }
JVM_END JVM_END
@ -2363,7 +2361,7 @@ JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetNameAndTypeRefInfoAt(JNIEnv *env, job
dest->obj_at_put(0, str()); dest->obj_at_put(0, str());
str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL); str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
dest->obj_at_put(1, str()); dest->obj_at_put(1, str());
return (jobjectArray) JNIHandles::make_local(dest()); return (jobjectArray) JNIHandles::make_local(THREAD, dest());
} }
JVM_END JVM_END
@ -2429,7 +2427,7 @@ JVM_ENTRY(jstring, JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject obj, jobject
THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index"); THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
} }
oop str = cp->string_at(index, CHECK_NULL); oop str = cp->string_at(index, CHECK_NULL);
return (jstring) JNIHandles::make_local(str); return (jstring) JNIHandles::make_local(THREAD, str);
} }
JVM_END JVM_END
@ -2445,7 +2443,7 @@ JVM_ENTRY(jstring, JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject obj, jobject u
} }
Symbol* sym = cp->symbol_at(index); Symbol* sym = cp->symbol_at(index);
Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
return (jstring) JNIHandles::make_local(str()); return (jstring) JNIHandles::make_local(THREAD, str());
} }
JVM_END JVM_END
@ -2502,7 +2500,7 @@ JVM_ENTRY(jobject, JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused))
JVMWrapper("JVM_AssertionStatusDirectives"); JVMWrapper("JVM_AssertionStatusDirectives");
JvmtiVMObjectAllocEventCollector oam; JvmtiVMObjectAllocEventCollector oam;
oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL); oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);
return JNIHandles::make_local(env, asd); return JNIHandles::make_local(THREAD, asd);
JVM_END JVM_END
// Verification //////////////////////////////////////////////////////////////////////////////// // Verification ////////////////////////////////////////////////////////////////////////////////
@ -3284,8 +3282,8 @@ JVM_END
JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass)) JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
JVMWrapper("JVM_CurrentThread"); JVMWrapper("JVM_CurrentThread");
oop jthread = thread->threadObj(); oop jthread = thread->threadObj();
assert (thread != NULL, "no current thread!"); assert(jthread != NULL, "no current thread!");
return JNIHandles::make_local(env, jthread); return JNIHandles::make_local(THREAD, jthread);
JVM_END JVM_END
JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread)) JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
@ -3377,7 +3375,7 @@ JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
result->obj_at_put(i, klass_array->at(i)->java_mirror()); result->obj_at_put(i, klass_array->at(i)->java_mirror());
} }
return (jobjectArray) JNIHandles::make_local(env, result); return (jobjectArray) JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -3390,7 +3388,7 @@ JVM_ENTRY(jstring, JVM_GetSystemPackage(JNIEnv *env, jstring name))
JvmtiVMObjectAllocEventCollector oam; JvmtiVMObjectAllocEventCollector oam;
char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name)); char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
oop result = ClassLoader::get_system_package(str, CHECK_NULL); oop result = ClassLoader::get_system_package(str, CHECK_NULL);
return (jstring) JNIHandles::make_local(result); return (jstring) JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -3398,7 +3396,7 @@ JVM_ENTRY(jobjectArray, JVM_GetSystemPackages(JNIEnv *env))
JVMWrapper("JVM_GetSystemPackages"); JVMWrapper("JVM_GetSystemPackages");
JvmtiVMObjectAllocEventCollector oam; JvmtiVMObjectAllocEventCollector oam;
objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL); objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(result); return (jobjectArray) JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -3413,7 +3411,7 @@ JVM_ENTRY(jobject, JVM_GetAndClearReferencePendingList(JNIEnv* env))
if (ref != NULL) { if (ref != NULL) {
Universe::set_reference_pending_list(NULL); Universe::set_reference_pending_list(NULL);
} }
return JNIHandles::make_local(env, ref); return JNIHandles::make_local(THREAD, ref);
JVM_END JVM_END
JVM_ENTRY(jboolean, JVM_HasReferencePendingList(JNIEnv* env)) JVM_ENTRY(jboolean, JVM_HasReferencePendingList(JNIEnv* env))
@ -3441,7 +3439,7 @@ JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection
oop loader = vfst.method()->method_holder()->class_loader(); oop loader = vfst.method()->method_holder()->class_loader();
if (loader != NULL && !SystemDictionary::is_platform_class_loader(loader)) { if (loader != NULL && !SystemDictionary::is_platform_class_loader(loader)) {
return JNIHandles::make_local(env, loader); return JNIHandles::make_local(THREAD, loader);
} }
} }
return NULL; return NULL;
@ -3480,7 +3478,7 @@ JVM_ENTRY(jobject, JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index))
jvalue value; jvalue value;
BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL); BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL);
oop box = Reflection::box(&value, type, CHECK_NULL); oop box = Reflection::box(&value, type, CHECK_NULL);
return JNIHandles::make_local(env, box); return JNIHandles::make_local(THREAD, box);
JVM_END JVM_END
@ -3530,7 +3528,7 @@ JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length))
JvmtiVMObjectAllocEventCollector oam; JvmtiVMObjectAllocEventCollector oam;
oop element_mirror = JNIHandles::resolve(eltClass); oop element_mirror = JNIHandles::resolve(eltClass);
oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL); oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL);
return JNIHandles::make_local(env, result); return JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -3541,7 +3539,7 @@ JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim
oop element_mirror = JNIHandles::resolve(eltClass); oop element_mirror = JNIHandles::resolve(eltClass);
assert(dim_array->is_typeArray(), "just checking"); assert(dim_array->is_typeArray(), "just checking");
oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL); oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL);
return JNIHandles::make_local(env, result); return JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -3608,7 +3606,7 @@ JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
if (str == NULL) return NULL; if (str == NULL) return NULL;
oop string = JNIHandles::resolve_non_null(str); oop string = JNIHandles::resolve_non_null(str);
oop result = StringTable::intern(string, CHECK_NULL); oop result = StringTable::intern(string, CHECK_NULL);
return (jstring) JNIHandles::make_local(env, result); return (jstring) JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
@ -3667,7 +3665,7 @@ jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init,
if (init && klass->is_instance_klass()) { if (init && klass->is_instance_klass()) {
klass->initialize(CHECK_NULL); klass->initialize(CHECK_NULL);
} }
return (jclass) JNIHandles::make_local(env, klass->java_mirror()); return (jclass) JNIHandles::make_local(THREAD, klass->java_mirror());
} }
@ -3681,14 +3679,14 @@ JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jo
Handle receiver(THREAD, JNIHandles::resolve(obj)); Handle receiver(THREAD, JNIHandles::resolve(obj));
objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0))); objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL); oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL);
jobject res = JNIHandles::make_local(env, result); jobject res = JNIHandles::make_local(THREAD, result);
if (JvmtiExport::should_post_vm_object_alloc()) { if (JvmtiExport::should_post_vm_object_alloc()) {
oop ret_type = java_lang_reflect_Method::return_type(method_handle()); oop ret_type = java_lang_reflect_Method::return_type(method_handle());
assert(ret_type != NULL, "sanity check: ret_type oop must not be NULL!"); assert(ret_type != NULL, "sanity check: ret_type oop must not be NULL!");
if (java_lang_Class::is_primitive(ret_type)) { if (java_lang_Class::is_primitive(ret_type)) {
// Only for primitive type vm allocates memory for java object. // Only for primitive type vm allocates memory for java object.
// See box() method. // See box() method.
JvmtiExport::post_vm_object_alloc(JavaThread::current(), result); JvmtiExport::post_vm_object_alloc(thread, result);
} }
} }
return res; return res;
@ -3703,9 +3701,9 @@ JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjec
oop constructor_mirror = JNIHandles::resolve(c); oop constructor_mirror = JNIHandles::resolve(c);
objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0))); objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL); oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);
jobject res = JNIHandles::make_local(env, result); jobject res = JNIHandles::make_local(THREAD, result);
if (JvmtiExport::should_post_vm_object_alloc()) { if (JvmtiExport::should_post_vm_object_alloc()) {
JvmtiExport::post_vm_object_alloc(JavaThread::current(), result); JvmtiExport::post_vm_object_alloc(thread, result);
} }
return res; return res;
JVM_END JVM_END
@ -3818,7 +3816,7 @@ JVM_ENTRY(jclass, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env,
jclass jcls = NULL; jclass jcls = NULL;
if (lambda_ik != NULL) { if (lambda_ik != NULL) {
InstanceKlass* loaded_lambda = SystemDictionaryShared::prepare_shared_lambda_proxy_class(lambda_ik, caller_ik, initialize, THREAD); InstanceKlass* loaded_lambda = SystemDictionaryShared::prepare_shared_lambda_proxy_class(lambda_ik, caller_ik, initialize, THREAD);
jcls = loaded_lambda == NULL ? NULL : (jclass) JNIHandles::make_local(env, loaded_lambda->java_mirror()); jcls = loaded_lambda == NULL ? NULL : (jclass) JNIHandles::make_local(THREAD, loaded_lambda->java_mirror());
} }
return jcls; return jcls;
#else #else
@ -3876,7 +3874,7 @@ JVM_ENTRY(jobjectArray, JVM_GetAllThreads(JNIEnv *env, jclass dummy))
threads_ah->obj_at_put(i, h()); threads_ah->obj_at_put(i, h());
} }
return (jobjectArray) JNIHandles::make_local(env, threads_ah()); return (jobjectArray) JNIHandles::make_local(THREAD, threads_ah());
JVM_END JVM_END
@ -3918,7 +3916,7 @@ JVM_ENTRY(jobjectArray, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobject
// The JavaThread references in thread_handle_array are validated // The JavaThread references in thread_handle_array are validated
// in VM_ThreadDump::doit(). // in VM_ThreadDump::doit().
Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL); Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL);
return (jobjectArray)JNIHandles::make_local(env, stacktraces()); return (jobjectArray)JNIHandles::make_local(THREAD, stacktraces());
JVM_END JVM_END
@ -3981,7 +3979,7 @@ JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
str = java_lang_String::create_from_symbol(sym, CHECK_NULL); str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
dest->obj_at_put(2, str()); dest->obj_at_put(2, str());
} }
return (jobjectArray) JNIHandles::make_local(dest()); return (jobjectArray) JNIHandles::make_local(THREAD, dest());
} }
JVM_END JVM_END
@ -4011,7 +4009,7 @@ JVM_ENTRY(jobjectArray, JVM_GetVmArguments(JNIEnv *env))
Handle h = java_lang_String::create_from_platform_dependent_str(vm_args[i], CHECK_NULL); Handle h = java_lang_String::create_from_platform_dependent_str(vm_args[i], CHECK_NULL);
result_h->obj_at_put(index, h()); result_h->obj_at_put(index, h());
} }
return (jobjectArray) JNIHandles::make_local(env, result_h()); return (jobjectArray) JNIHandles::make_local(THREAD, result_h());
JVM_END JVM_END
JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name)) JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))

View file

@ -179,7 +179,6 @@ Handle MethodHandles::resolve_MemberName_type(Handle mname, Klass* caller, TRAPS
oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) { oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) {
// This method is used from java.lang.invoke.MemberName constructors. // This method is used from java.lang.invoke.MemberName constructors.
// It fills in the new MemberName from a java.lang.reflect.Member. // It fills in the new MemberName from a java.lang.reflect.Member.
Thread* thread = Thread::current();
oop target_oop = target(); oop target_oop = target();
Klass* target_klass = target_oop->klass(); Klass* target_klass = target_oop->klass();
if (target_klass == SystemDictionary::reflect_Field_klass()) { if (target_klass == SystemDictionary::reflect_Field_klass()) {
@ -207,7 +206,7 @@ oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) {
if (m == NULL || is_signature_polymorphic(m->intrinsic_id())) if (m == NULL || is_signature_polymorphic(m->intrinsic_id()))
return NULL; // do not resolve unless there is a concrete signature return NULL; // do not resolve unless there is a concrete signature
CallInfo info(m, k, CHECK_NULL); CallInfo info(m, k, CHECK_NULL);
return init_method_MemberName(mname, info); return init_method_MemberName(mname, info, THREAD);
} }
} else if (target_klass == SystemDictionary::reflect_Constructor_klass()) { } else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
oop clazz = java_lang_reflect_Constructor::clazz(target_oop); oop clazz = java_lang_reflect_Constructor::clazz(target_oop);
@ -217,13 +216,13 @@ oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) {
Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); Method* m = InstanceKlass::cast(k)->method_with_idnum(slot);
if (m == NULL) return NULL; if (m == NULL) return NULL;
CallInfo info(m, k, CHECK_NULL); CallInfo info(m, k, CHECK_NULL);
return init_method_MemberName(mname, info); return init_method_MemberName(mname, info, THREAD);
} }
} }
return NULL; return NULL;
} }
oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) { oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, TRAPS) {
assert(info.resolved_appendix().is_null(), "only normal methods here"); assert(info.resolved_appendix().is_null(), "only normal methods here");
methodHandle m(Thread::current(), info.resolved_method()); methodHandle m(Thread::current(), info.resolved_method());
assert(m.not_null(), "null method handle"); assert(m.not_null(), "null method handle");
@ -789,7 +788,7 @@ Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller,
THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty); THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
} }
result.set_resolved_method_name(CHECK_(empty)); result.set_resolved_method_name(CHECK_(empty));
oop mname2 = init_method_MemberName(mname, result); oop mname2 = init_method_MemberName(mname, result, THREAD);
return Handle(THREAD, mname2); return Handle(THREAD, mname2);
} }
case IS_CONSTRUCTOR: case IS_CONSTRUCTOR:
@ -812,7 +811,7 @@ Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller,
} }
assert(result.is_statically_bound(), ""); assert(result.is_statically_bound(), "");
result.set_resolved_method_name(CHECK_(empty)); result.set_resolved_method_name(CHECK_(empty));
oop mname2 = init_method_MemberName(mname, result); oop mname2 = init_method_MemberName(mname, result, THREAD);
return Handle(THREAD, mname2); return Handle(THREAD, mname2);
} }
case IS_FIELD: case IS_FIELD:
@ -922,8 +921,6 @@ int MethodHandles::find_MemberNames(Klass* k,
int skip, objArrayHandle results, TRAPS) { int skip, objArrayHandle results, TRAPS) {
// %%% take caller into account! // %%% take caller into account!
Thread* thread = Thread::current();
if (k == NULL || !k->is_instance_klass()) return -1; if (k == NULL || !k->is_instance_klass()) return -1;
int rfill = 0, rlimit = results->length(), rskip = skip; int rfill = 0, rlimit = results->length(), rskip = skip;
@ -960,7 +957,7 @@ int MethodHandles::find_MemberNames(Klass* k,
if (rskip > 0) { if (rskip > 0) {
--rskip; --rskip;
} else if (rfill < rlimit) { } else if (rfill < rlimit) {
Handle result(thread, results->obj_at(rfill++)); Handle result(THREAD, results->obj_at(rfill++));
if (!java_lang_invoke_MemberName::is_instance(result())) if (!java_lang_invoke_MemberName::is_instance(result()))
return -99; // caller bug! return -99; // caller bug!
oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor()); oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor());
@ -1011,11 +1008,11 @@ int MethodHandles::find_MemberNames(Klass* k,
if (rskip > 0) { if (rskip > 0) {
--rskip; --rskip;
} else if (rfill < rlimit) { } else if (rfill < rlimit) {
Handle result(thread, results->obj_at(rfill++)); Handle result(THREAD, results->obj_at(rfill++));
if (!java_lang_invoke_MemberName::is_instance(result())) if (!java_lang_invoke_MemberName::is_instance(result()))
return -99; // caller bug! return -99; // caller bug!
CallInfo info(m, NULL, CHECK_0); CallInfo info(m, NULL, CHECK_0);
oop saved = MethodHandles::init_method_MemberName(result, info); oop saved = MethodHandles::init_method_MemberName(result, info, THREAD);
if (saved != result()) if (saved != result())
results->obj_at_put(rfill-1, saved); // show saved instance to user results->obj_at_put(rfill-1, saved); // show saved instance to user
} else if (++overflow >= overflow_limit) { } else if (++overflow >= overflow_limit) {
@ -1302,7 +1299,7 @@ JVM_ENTRY(jobject, MHN_getMemberVMInfo(JNIEnv *env, jobject igcls, jobject mname
x = mname(); x = mname();
} }
result->obj_at_put(1, x); result->obj_at_put(1, x);
return JNIHandles::make_local(env, result()); return JNIHandles::make_local(THREAD, result());
} }
JVM_END JVM_END
@ -1550,7 +1547,7 @@ JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class))
assert(SystemDictionary::MethodHandle_klass() != NULL, "should be present"); assert(SystemDictionary::MethodHandle_klass() != NULL, "should be present");
oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror(); oop mirror = SystemDictionary::MethodHandle_klass()->java_mirror();
jclass MH_class = (jclass) JNIHandles::make_local(env, mirror); jclass MH_class = (jclass) JNIHandles::make_local(THREAD, mirror);
{ {
ThreadToNativeFromVM ttnfv(thread); ThreadToNativeFromVM ttnfv(thread);

View file

@ -65,7 +65,7 @@ class MethodHandles: AllStatic {
static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing
static oop init_MemberName(Handle mname_h, Handle target_h, TRAPS); // compute vmtarget/vmindex from target static oop init_MemberName(Handle mname_h, Handle target_h, TRAPS); // compute vmtarget/vmindex from target
static oop init_field_MemberName(Handle mname_h, fieldDescriptor& fd, bool is_setter = false); static oop init_field_MemberName(Handle mname_h, fieldDescriptor& fd, bool is_setter = false);
static oop init_method_MemberName(Handle mname_h, CallInfo& info); static oop init_method_MemberName(Handle mname_h, CallInfo& info, TRAPS);
static int find_MemberNames(Klass* k, Symbol* name, Symbol* sig, static int find_MemberNames(Klass* k, Symbol* name, Symbol* sig,
int mflags, Klass* caller, int mflags, Klass* caller,
int skip, objArrayHandle results, TRAPS); int skip, objArrayHandle results, TRAPS);

View file

@ -265,7 +265,7 @@ UNSAFE_ENTRY(jobject, Unsafe_GetReference(JNIEnv *env, jobject unsafe, jobject o
oop p = JNIHandles::resolve(obj); oop p = JNIHandles::resolve(obj);
assert_field_offset_sane(p, offset); assert_field_offset_sane(p, offset);
oop v = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset); oop v = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset);
return JNIHandles::make_local(env, v); return JNIHandles::make_local(THREAD, v);
} UNSAFE_END } UNSAFE_END
UNSAFE_ENTRY(void, Unsafe_PutReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { UNSAFE_ENTRY(void, Unsafe_PutReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) {
@ -279,7 +279,7 @@ UNSAFE_ENTRY(jobject, Unsafe_GetReferenceVolatile(JNIEnv *env, jobject unsafe, j
oop p = JNIHandles::resolve(obj); oop p = JNIHandles::resolve(obj);
assert_field_offset_sane(p, offset); assert_field_offset_sane(p, offset);
oop v = HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset); oop v = HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset);
return JNIHandles::make_local(env, v); return JNIHandles::make_local(THREAD, v);
} UNSAFE_END } UNSAFE_END
UNSAFE_ENTRY(void, Unsafe_PutReferenceVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { UNSAFE_ENTRY(void, Unsafe_PutReferenceVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) {
@ -291,7 +291,7 @@ UNSAFE_ENTRY(void, Unsafe_PutReferenceVolatile(JNIEnv *env, jobject unsafe, jobj
UNSAFE_ENTRY(jobject, Unsafe_GetUncompressedObject(JNIEnv *env, jobject unsafe, jlong addr)) { UNSAFE_ENTRY(jobject, Unsafe_GetUncompressedObject(JNIEnv *env, jobject unsafe, jlong addr)) {
oop v = *(oop*) (address) addr; oop v = *(oop*) (address) addr;
return JNIHandles::make_local(env, v); return JNIHandles::make_local(THREAD, v);
} UNSAFE_END } UNSAFE_END
#define DEFINE_GETSETOOP(java_type, Type) \ #define DEFINE_GETSETOOP(java_type, Type) \
@ -356,7 +356,7 @@ UNSAFE_LEAF(void, Unsafe_FullFence(JNIEnv *env, jobject unsafe)) {
UNSAFE_ENTRY(jobject, Unsafe_AllocateInstance(JNIEnv *env, jobject unsafe, jclass cls)) { UNSAFE_ENTRY(jobject, Unsafe_AllocateInstance(JNIEnv *env, jobject unsafe, jclass cls)) {
instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(cls), CHECK_NULL); instanceOop i = InstanceKlass::allocate_instance(JNIHandles::resolve_non_null(cls), CHECK_NULL);
return JNIHandles::make_local(env, i); return JNIHandles::make_local(THREAD, i);
} UNSAFE_END } UNSAFE_END
UNSAFE_ENTRY(jlong, Unsafe_AllocateMemory0(JNIEnv *env, jobject unsafe, jlong size)) { UNSAFE_ENTRY(jlong, Unsafe_AllocateMemory0(JNIEnv *env, jobject unsafe, jlong size)) {
@ -565,7 +565,7 @@ UNSAFE_ENTRY(jobject, Unsafe_StaticFieldBase0(JNIEnv *env, jobject unsafe, jobje
THROW_0(vmSymbols::java_lang_IllegalArgumentException()); THROW_0(vmSymbols::java_lang_IllegalArgumentException());
} }
return JNIHandles::make_local(env, mirror); return JNIHandles::make_local(THREAD, mirror);
} UNSAFE_END } UNSAFE_END
UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized0(JNIEnv *env, jobject unsafe, jobject clazz)) { UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized0(JNIEnv *env, jobject unsafe, jobject clazz)) {
@ -881,7 +881,7 @@ UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass0(JNIEnv *env, jobject unsafe, j
InstanceKlass* anon_klass = Unsafe_DefineAnonymousClass_impl(env, host_class, data, cp_patches_jh, &temp_alloc, THREAD); InstanceKlass* anon_klass = Unsafe_DefineAnonymousClass_impl(env, host_class, data, cp_patches_jh, &temp_alloc, THREAD);
if (anon_klass != NULL) { if (anon_klass != NULL) {
res_jh = JNIHandles::make_local(env, anon_klass->java_mirror()); res_jh = JNIHandles::make_local(THREAD, anon_klass->java_mirror());
} }
// try/finally clause: // try/finally clause:
@ -914,7 +914,7 @@ UNSAFE_ENTRY(jobject, Unsafe_CompareAndExchangeReference(JNIEnv *env, jobject un
oop p = JNIHandles::resolve(obj); oop p = JNIHandles::resolve(obj);
assert_field_offset_sane(p, offset); assert_field_offset_sane(p, offset);
oop res = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x); oop res = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x);
return JNIHandles::make_local(env, res); return JNIHandles::make_local(THREAD, res);
} UNSAFE_END } UNSAFE_END
UNSAFE_ENTRY(jint, Unsafe_CompareAndExchangeInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) { UNSAFE_ENTRY(jint, Unsafe_CompareAndExchangeInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {

View file

@ -631,7 +631,7 @@ WB_ENTRY(jobject, WB_G1AuxiliaryMemoryUsage(JNIEnv* env))
G1CollectedHeap* g1h = G1CollectedHeap::heap(); G1CollectedHeap* g1h = G1CollectedHeap::heap();
MemoryUsage usage = g1h->get_auxiliary_data_memory_usage(); MemoryUsage usage = g1h->get_auxiliary_data_memory_usage();
Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL); Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL);
return JNIHandles::make_local(env, h()); return JNIHandles::make_local(THREAD, h());
} }
THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1AuxiliaryMemoryUsage: G1 GC is not enabled"); THROW_MSG_0(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1AuxiliaryMemoryUsage: G1 GC is not enabled");
WB_END WB_END
@ -654,7 +654,7 @@ WB_ENTRY(jintArray, WB_G1MemoryNodeIds(JNIEnv* env, jobject o))
for (int i = 0; i < num_node_ids; i++) { for (int i = 0; i < num_node_ids; i++) {
result->int_at_put(i, (jint)node_ids[i]); result->int_at_put(i, (jint)node_ids[i]);
} }
return (jintArray) JNIHandles::make_local(env, result); return (jintArray) JNIHandles::make_local(THREAD, result);
} }
THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1MemoryNodeIds: G1 GC is not enabled"); THROW_MSG_NULL(vmSymbols::java_lang_UnsupportedOperationException(), "WB_G1MemoryNodeIds: G1 GC is not enabled");
WB_END WB_END
@ -715,7 +715,7 @@ WB_ENTRY(jlongArray, WB_G1GetMixedGCInfo(JNIEnv* env, jobject o, jint liveness))
result->long_at_put(0, rli.total_count()); result->long_at_put(0, rli.total_count());
result->long_at_put(1, rli.total_memory()); result->long_at_put(1, rli.total_memory());
result->long_at_put(2, rli.total_memory_to_free()); result->long_at_put(2, rli.total_memory_to_free());
return (jlongArray) JNIHandles::make_local(env, result); return (jlongArray) JNIHandles::make_local(THREAD, result);
WB_END WB_END
#endif // INCLUDE_G1GC #endif // INCLUDE_G1GC
@ -1678,12 +1678,11 @@ WB_ENTRY(jlong, WB_GetMethodData(JNIEnv* env, jobject wv, jobject method))
WB_END WB_END
WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o)) WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
return (jlong) Thread::current()->stack_size(); return (jlong) thread->stack_size();
WB_END WB_END
WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o)) WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
JavaThread* t = JavaThread::current(); return (jlong) thread->stack_available(os::current_stack_pointer()) - (jlong)JavaThread::stack_shadow_zone_size();
return (jlong) t->stack_available(os::current_stack_pointer()) - (jlong)JavaThread::stack_shadow_zone_size();
WB_END WB_END
@ -1790,7 +1789,7 @@ WB_ENTRY(void, WB_AssertSpecialLock(JNIEnv* env, jobject o, jboolean allowVMBloc
MutexLocker ml(new Mutex(Mutex::special, "SpecialTest_lock", allowVMBlock, sfpt_check_required), safepoint_check); MutexLocker ml(new Mutex(Mutex::special, "SpecialTest_lock", allowVMBlock, sfpt_check_required), safepoint_check);
// If the lock above succeeds, try to safepoint to test the NSV implied with this special lock. // If the lock above succeeds, try to safepoint to test the NSV implied with this special lock.
ThreadBlockInVM tbivm(JavaThread::current()); ThreadBlockInVM tbivm(thread);
WB_END WB_END
WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj)) WB_ENTRY(jboolean, WB_IsMonitorInflated(JNIEnv* env, jobject wb, jobject obj))
@ -1957,7 +1956,7 @@ WB_ENTRY(jobject, WB_GetResolvedReferences(JNIEnv* env, jobject wb, jclass clazz
InstanceKlass *ik = InstanceKlass::cast(k); InstanceKlass *ik = InstanceKlass::cast(k);
ConstantPool *cp = ik->constants(); ConstantPool *cp = ik->constants();
objArrayOop refs = cp->resolved_references(); objArrayOop refs = cp->resolved_references();
return (jobject)JNIHandles::make_local(env, refs); return (jobject)JNIHandles::make_local(THREAD, refs);
} else { } else {
return NULL; return NULL;
} }

View file

@ -55,19 +55,10 @@ void jni_handles_init() {
} }
jobject JNIHandles::make_local(oop obj) { jobject JNIHandles::make_local(oop obj) {
if (obj == NULL) { return make_local(Thread::current(), obj);
return NULL; // ignore null handles
} else {
Thread* thread = Thread::current();
assert(oopDesc::is_oop(obj), "not an oop");
assert(!current_thread_in_native(), "must not be in native");
return thread->active_handles()->allocate_handle(obj);
}
} }
// optimized versions
jobject JNIHandles::make_local(Thread* thread, oop obj) { jobject JNIHandles::make_local(Thread* thread, oop obj) {
if (obj == NULL) { if (obj == NULL) {
return NULL; // ignore null handles return NULL; // ignore null handles
@ -79,19 +70,6 @@ jobject JNIHandles::make_local(Thread* thread, oop obj) {
} }
} }
jobject JNIHandles::make_local(JNIEnv* env, oop obj) {
if (obj == NULL) {
return NULL; // ignore null handles
} else {
JavaThread* thread = JavaThread::thread_from_jni_environment(env);
assert(oopDesc::is_oop(obj), "not an oop");
assert(!current_thread_in_native(), "must not be in native");
return thread->active_handles()->allocate_handle(obj);
}
}
static void report_handle_allocation_failure(AllocFailType alloc_failmode, static void report_handle_allocation_failure(AllocFailType alloc_failmode,
const char* handle_kind) { const char* handle_kind) {
if (alloc_failmode == AllocFailStrategy::EXIT_OOM) { if (alloc_failmode == AllocFailStrategy::EXIT_OOM) {

View file

@ -84,8 +84,7 @@ class JNIHandles : AllStatic {
// Local handles // Local handles
static jobject make_local(oop obj); static jobject make_local(oop obj);
static jobject make_local(JNIEnv* env, oop obj); // Fast version when env is known static jobject make_local(Thread* thread, oop obj); // Faster version when current thread is known
static jobject make_local(Thread* thread, oop obj); // Even faster version when current thread is known
inline static void destroy_local(jobject handle); inline static void destroy_local(jobject handle);
// Global handles // Global handles

View file

@ -508,7 +508,7 @@ JVM_ENTRY(jobjectArray, jmm_GetMemoryPools(JNIEnv* env, jobject obj))
poolArray->obj_at_put(i, ph()); poolArray->obj_at_put(i, ph());
} }
} }
return (jobjectArray) JNIHandles::make_local(env, poolArray()); return (jobjectArray) JNIHandles::make_local(THREAD, poolArray());
JVM_END JVM_END
// Returns an array of java/lang/management/MemoryManagerMXBean object // Returns an array of java/lang/management/MemoryManagerMXBean object
@ -552,7 +552,7 @@ JVM_ENTRY(jobjectArray, jmm_GetMemoryManagers(JNIEnv* env, jobject obj))
mgrArray->obj_at_put(i, ph()); mgrArray->obj_at_put(i, ph());
} }
} }
return (jobjectArray) JNIHandles::make_local(env, mgrArray()); return (jobjectArray) JNIHandles::make_local(THREAD, mgrArray());
JVM_END JVM_END
@ -565,7 +565,7 @@ JVM_ENTRY(jobject, jmm_GetMemoryPoolUsage(JNIEnv* env, jobject obj))
if (pool != NULL) { if (pool != NULL) {
MemoryUsage usage = pool->get_memory_usage(); MemoryUsage usage = pool->get_memory_usage();
Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL); Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL);
return JNIHandles::make_local(env, h()); return JNIHandles::make_local(THREAD, h());
} else { } else {
return NULL; return NULL;
} }
@ -580,7 +580,7 @@ JVM_ENTRY(jobject, jmm_GetPeakMemoryPoolUsage(JNIEnv* env, jobject obj))
if (pool != NULL) { if (pool != NULL) {
MemoryUsage usage = pool->get_peak_memory_usage(); MemoryUsage usage = pool->get_peak_memory_usage();
Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL); Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL);
return JNIHandles::make_local(env, h()); return JNIHandles::make_local(THREAD, h());
} else { } else {
return NULL; return NULL;
} }
@ -595,7 +595,7 @@ JVM_ENTRY(jobject, jmm_GetPoolCollectionUsage(JNIEnv* env, jobject obj))
if (pool != NULL && pool->is_collected_pool()) { if (pool != NULL && pool->is_collected_pool()) {
MemoryUsage usage = pool->get_last_collection_usage(); MemoryUsage usage = pool->get_last_collection_usage();
Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL); Handle h = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL);
return JNIHandles::make_local(env, h()); return JNIHandles::make_local(THREAD, h());
} else { } else {
return NULL; return NULL;
} }
@ -759,7 +759,7 @@ JVM_ENTRY(jobject, jmm_GetMemoryUsage(JNIEnv* env, jboolean heap))
} }
Handle obj = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL); Handle obj = MemoryService::create_MemoryUsage_obj(usage, CHECK_NULL);
return JNIHandles::make_local(env, obj()); return JNIHandles::make_local(THREAD, obj());
JVM_END JVM_END
// Returns the boolean value of a given attribute. // Returns the boolean value of a given attribute.
@ -1274,7 +1274,7 @@ JVM_ENTRY(jobjectArray, jmm_DumpThreads(JNIEnv *env, jlongArray thread_ids, jboo
result_h->obj_at_put(index, info_obj); result_h->obj_at_put(index, info_obj);
} }
return (jobjectArray) JNIHandles::make_local(env, result_h()); return (jobjectArray) JNIHandles::make_local(THREAD, result_h());
JVM_END JVM_END
// Reset statistic. Return true if the requested statistic is reset. // Reset statistic. Return true if the requested statistic is reset.
@ -1420,23 +1420,23 @@ JVM_ENTRY(jobjectArray, jmm_GetVMGlobalNames(JNIEnv *env))
for(int i = 0; i < num_entries; i++) { for(int i = 0; i < num_entries; i++) {
res->obj_at_put(i, flags_ah->obj_at(i)); res->obj_at_put(i, flags_ah->obj_at(i));
} }
return (jobjectArray)JNIHandles::make_local(env, res); return (jobjectArray)JNIHandles::make_local(THREAD, res);
} }
return (jobjectArray)JNIHandles::make_local(env, flags_ah()); return (jobjectArray)JNIHandles::make_local(THREAD, flags_ah());
JVM_END JVM_END
// Utility function used by jmm_GetVMGlobals. Returns false if flag type // Utility function used by jmm_GetVMGlobals. Returns false if flag type
// can't be determined, true otherwise. If false is returned, then *global // can't be determined, true otherwise. If false is returned, then *global
// will be incomplete and invalid. // will be incomplete and invalid.
bool add_global_entry(JNIEnv* env, Handle name, jmmVMGlobal *global, JVMFlag *flag, TRAPS) { bool add_global_entry(Handle name, jmmVMGlobal *global, JVMFlag *flag, TRAPS) {
Handle flag_name; Handle flag_name;
if (name() == NULL) { if (name() == NULL) {
flag_name = java_lang_String::create_from_str(flag->_name, CHECK_false); flag_name = java_lang_String::create_from_str(flag->_name, CHECK_false);
} else { } else {
flag_name = name; flag_name = name;
} }
global->name = (jstring)JNIHandles::make_local(env, flag_name()); global->name = (jstring)JNIHandles::make_local(THREAD, flag_name());
if (flag->is_bool()) { if (flag->is_bool()) {
global->value.z = flag->get_bool() ? JNI_TRUE : JNI_FALSE; global->value.z = flag->get_bool() ? JNI_TRUE : JNI_FALSE;
@ -1464,7 +1464,7 @@ bool add_global_entry(JNIEnv* env, Handle name, jmmVMGlobal *global, JVMFlag *fl
global->type = JMM_VMGLOBAL_TYPE_JLONG; global->type = JMM_VMGLOBAL_TYPE_JLONG;
} else if (flag->is_ccstr()) { } else if (flag->is_ccstr()) {
Handle str = java_lang_String::create_from_str(flag->get_ccstr(), CHECK_false); Handle str = java_lang_String::create_from_str(flag->get_ccstr(), CHECK_false);
global->value.l = (jobject)JNIHandles::make_local(env, str()); global->value.l = (jobject)JNIHandles::make_local(THREAD, str());
global->type = JMM_VMGLOBAL_TYPE_JSTRING; global->type = JMM_VMGLOBAL_TYPE_JSTRING;
} else { } else {
global->type = JMM_VMGLOBAL_TYPE_UNKNOWN; global->type = JMM_VMGLOBAL_TYPE_UNKNOWN;
@ -1543,7 +1543,7 @@ JVM_ENTRY(jint, jmm_GetVMGlobals(JNIEnv *env,
char* str = java_lang_String::as_utf8_string(s); char* str = java_lang_String::as_utf8_string(s);
JVMFlag* flag = JVMFlag::find_flag(str); JVMFlag* flag = JVMFlag::find_flag(str);
if (flag != NULL && if (flag != NULL &&
add_global_entry(env, sh, &globals[i], flag, THREAD)) { add_global_entry(sh, &globals[i], flag, THREAD)) {
num_entries++; num_entries++;
} else { } else {
globals[i].name = NULL; globals[i].name = NULL;
@ -1565,7 +1565,7 @@ JVM_ENTRY(jint, jmm_GetVMGlobals(JNIEnv *env,
} }
// Exclude the locked (diagnostic, experimental) flags // Exclude the locked (diagnostic, experimental) flags
if ((flag->is_unlocked() || flag->is_unlocker()) && if ((flag->is_unlocked() || flag->is_unlocker()) &&
add_global_entry(env, null_h, &globals[num_entries], flag, THREAD)) { add_global_entry(null_h, &globals[num_entries], flag, THREAD)) {
num_entries++; num_entries++;
} }
} }
@ -1750,7 +1750,7 @@ static Handle find_deadlocks(bool object_monitors_only, TRAPS) {
// //
JVM_ENTRY(jobjectArray, jmm_FindDeadlockedThreads(JNIEnv *env, jboolean object_monitors_only)) JVM_ENTRY(jobjectArray, jmm_FindDeadlockedThreads(JNIEnv *env, jboolean object_monitors_only))
Handle result = find_deadlocks(object_monitors_only != 0, CHECK_NULL); Handle result = find_deadlocks(object_monitors_only != 0, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, result()); return (jobjectArray) JNIHandles::make_local(THREAD, result());
JVM_END JVM_END
// Finds cycles of threads that are deadlocked on monitor locks // Finds cycles of threads that are deadlocked on monitor locks
@ -1758,7 +1758,7 @@ JVM_END
// Otherwise, returns NULL. // Otherwise, returns NULL.
JVM_ENTRY(jobjectArray, jmm_FindMonitorDeadlockedThreads(JNIEnv *env)) JVM_ENTRY(jobjectArray, jmm_FindMonitorDeadlockedThreads(JNIEnv *env))
Handle result = find_deadlocks(true, CHECK_NULL); Handle result = find_deadlocks(true, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, result()); return (jobjectArray) JNIHandles::make_local(THREAD, result());
JVM_END JVM_END
// Gets the information about GC extension attributes including // Gets the information about GC extension attributes including
@ -1940,7 +1940,7 @@ JVM_ENTRY(jobjectArray, jmm_GetDiagnosticCommands(JNIEnv *env))
oop cmd_name = java_lang_String::create_oop_from_str(dcmd_list->at(i), CHECK_NULL); oop cmd_name = java_lang_String::create_oop_from_str(dcmd_list->at(i), CHECK_NULL);
cmd_array->obj_at_put(i, cmd_name); cmd_array->obj_at_put(i, cmd_name);
} }
return (jobjectArray) JNIHandles::make_local(env, cmd_array()); return (jobjectArray) JNIHandles::make_local(THREAD, cmd_array());
JVM_END JVM_END
JVM_ENTRY(void, jmm_GetDiagnosticCommandInfo(JNIEnv *env, jobjectArray cmds, JVM_ENTRY(void, jmm_GetDiagnosticCommandInfo(JNIEnv *env, jobjectArray cmds,
@ -2049,7 +2049,7 @@ JVM_ENTRY(jstring, jmm_ExecuteDiagnosticCommand(JNIEnv *env, jstring commandline
bufferedStream output; bufferedStream output;
DCmd::parse_and_execute(DCmd_Source_MBean, &output, cmdline, ' ', CHECK_NULL); DCmd::parse_and_execute(DCmd_Source_MBean, &output, cmdline, ' ', CHECK_NULL);
oop result = java_lang_String::create_oop_from_str(output.as_string(), CHECK_NULL); oop result = java_lang_String::create_oop_from_str(output.as_string(), CHECK_NULL);
return (jstring) JNIHandles::make_local(env, result); return (jstring) JNIHandles::make_local(THREAD, result);
JVM_END JVM_END
JVM_ENTRY(void, jmm_SetDiagnosticFrameworkNotificationEnabled(JNIEnv *env, jboolean enabled)) JVM_ENTRY(void, jmm_SetDiagnosticFrameworkNotificationEnabled(JNIEnv *env, jboolean enabled))