Mercurial > hg > graal-jvmci-8
diff src/share/vm/prims/unsafe.cpp @ 6266:1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
6984705: JSR 292 method handle creation should not go through JNI
Summary: remove assembly code for JDK 7 chained method handles
Reviewed-by: jrose, twisti, kvn, mhaupt
Contributed-by: John Rose <john.r.rose@oracle.com>, Christian Thalinger <christian.thalinger@oracle.com>, Michael Haupt <michael.haupt@oracle.com>
author | twisti |
---|---|
date | Tue, 24 Jul 2012 10:51:00 -0700 |
parents | 9c9fb30d2b3b |
children | da91efe96a93 |
line wrap: on
line diff
--- a/src/share/vm/prims/unsafe.cpp Mon Jul 23 13:04:59 2012 -0700 +++ b/src/share/vm/prims/unsafe.cpp Tue Jul 24 10:51:00 2012 -0700 @@ -761,16 +761,33 @@ return JNIHandles::make_local(env, JNIHandles::resolve_non_null(clazz)); UNSAFE_END -UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) +UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) { UnsafeWrapper("Unsafe_EnsureClassInitialized"); if (clazz == NULL) { THROW(vmSymbols::java_lang_NullPointerException()); } oop mirror = JNIHandles::resolve_non_null(clazz); - instanceKlass* k = instanceKlass::cast(java_lang_Class::as_klassOop(mirror)); - if (k != NULL) { + + klassOop klass = java_lang_Class::as_klassOop(mirror); + if (klass != NULL && Klass::cast(klass)->should_be_initialized()) { + instanceKlass* k = instanceKlass::cast(klass); k->initialize(CHECK); } +} +UNSAFE_END + +UNSAFE_ENTRY(jboolean, Unsafe_ShouldBeInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) { + UnsafeWrapper("Unsafe_ShouldBeInitialized"); + if (clazz == NULL) { + THROW_(vmSymbols::java_lang_NullPointerException(), false); + } + oop mirror = JNIHandles::resolve_non_null(clazz); + klassOop klass = java_lang_Class::as_klassOop(mirror); + if (klass != NULL && Klass::cast(klass)->should_be_initialized()) { + return true; + } + return false; +} UNSAFE_END static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) { @@ -1566,6 +1583,10 @@ {CC"defineAnonymousClass", CC"("DAC_Args")"CLS, FN_PTR(Unsafe_DefineAnonymousClass)}, }; +JNINativeMethod lform_methods[] = { + {CC"shouldBeInitialized",CC"("CLS")Z", FN_PTR(Unsafe_ShouldBeInitialized)}, +}; + #undef CC #undef FN_PTR @@ -1636,6 +1657,15 @@ env->ExceptionClear(); } } + if (EnableInvokeDynamic) { + env->RegisterNatives(unsafecls, lform_methods, sizeof(lform_methods)/sizeof(JNINativeMethod)); + if (env->ExceptionOccurred()) { + if (PrintMiscellaneous && (Verbose || WizardMode)) { + tty->print_cr("Warning: SDK 1.7 LambdaForm support in Unsafe not found."); + } + env->ExceptionClear(); + } + } int status = env->RegisterNatives(unsafecls, methods, sizeof(methods)/sizeof(JNINativeMethod)); if (env->ExceptionOccurred()) { if (PrintMiscellaneous && (Verbose || WizardMode)) {