1.1 --- a/src/share/vm/prims/unsafe.cpp Mon Jul 23 13:04:59 2012 -0700 1.2 +++ b/src/share/vm/prims/unsafe.cpp Tue Jul 24 10:51:00 2012 -0700 1.3 @@ -761,16 +761,33 @@ 1.4 return JNIHandles::make_local(env, JNIHandles::resolve_non_null(clazz)); 1.5 UNSAFE_END 1.6 1.7 -UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) 1.8 +UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) { 1.9 UnsafeWrapper("Unsafe_EnsureClassInitialized"); 1.10 if (clazz == NULL) { 1.11 THROW(vmSymbols::java_lang_NullPointerException()); 1.12 } 1.13 oop mirror = JNIHandles::resolve_non_null(clazz); 1.14 - instanceKlass* k = instanceKlass::cast(java_lang_Class::as_klassOop(mirror)); 1.15 - if (k != NULL) { 1.16 + 1.17 + klassOop klass = java_lang_Class::as_klassOop(mirror); 1.18 + if (klass != NULL && Klass::cast(klass)->should_be_initialized()) { 1.19 + instanceKlass* k = instanceKlass::cast(klass); 1.20 k->initialize(CHECK); 1.21 } 1.22 +} 1.23 +UNSAFE_END 1.24 + 1.25 +UNSAFE_ENTRY(jboolean, Unsafe_ShouldBeInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) { 1.26 + UnsafeWrapper("Unsafe_ShouldBeInitialized"); 1.27 + if (clazz == NULL) { 1.28 + THROW_(vmSymbols::java_lang_NullPointerException(), false); 1.29 + } 1.30 + oop mirror = JNIHandles::resolve_non_null(clazz); 1.31 + klassOop klass = java_lang_Class::as_klassOop(mirror); 1.32 + if (klass != NULL && Klass::cast(klass)->should_be_initialized()) { 1.33 + return true; 1.34 + } 1.35 + return false; 1.36 +} 1.37 UNSAFE_END 1.38 1.39 static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) { 1.40 @@ -1566,6 +1583,10 @@ 1.41 {CC"defineAnonymousClass", CC"("DAC_Args")"CLS, FN_PTR(Unsafe_DefineAnonymousClass)}, 1.42 }; 1.43 1.44 +JNINativeMethod lform_methods[] = { 1.45 + {CC"shouldBeInitialized",CC"("CLS")Z", FN_PTR(Unsafe_ShouldBeInitialized)}, 1.46 +}; 1.47 + 1.48 #undef CC 1.49 #undef FN_PTR 1.50 1.51 @@ -1636,6 +1657,15 @@ 1.52 env->ExceptionClear(); 1.53 } 1.54 } 1.55 + if (EnableInvokeDynamic) { 1.56 + env->RegisterNatives(unsafecls, lform_methods, sizeof(lform_methods)/sizeof(JNINativeMethod)); 1.57 + if (env->ExceptionOccurred()) { 1.58 + if (PrintMiscellaneous && (Verbose || WizardMode)) { 1.59 + tty->print_cr("Warning: SDK 1.7 LambdaForm support in Unsafe not found."); 1.60 + } 1.61 + env->ExceptionClear(); 1.62 + } 1.63 + } 1.64 int status = env->RegisterNatives(unsafecls, methods, sizeof(methods)/sizeof(JNINativeMethod)); 1.65 if (env->ExceptionOccurred()) { 1.66 if (PrintMiscellaneous && (Verbose || WizardMode)) {