comparison 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
comparison
equal deleted inserted replaced
6241:aba91a731143 6266:1d7922586cf6
759 THROW_0(vmSymbols::java_lang_NullPointerException()); 759 THROW_0(vmSymbols::java_lang_NullPointerException());
760 } 760 }
761 return JNIHandles::make_local(env, JNIHandles::resolve_non_null(clazz)); 761 return JNIHandles::make_local(env, JNIHandles::resolve_non_null(clazz));
762 UNSAFE_END 762 UNSAFE_END
763 763
764 UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) 764 UNSAFE_ENTRY(void, Unsafe_EnsureClassInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) {
765 UnsafeWrapper("Unsafe_EnsureClassInitialized"); 765 UnsafeWrapper("Unsafe_EnsureClassInitialized");
766 if (clazz == NULL) { 766 if (clazz == NULL) {
767 THROW(vmSymbols::java_lang_NullPointerException()); 767 THROW(vmSymbols::java_lang_NullPointerException());
768 } 768 }
769 oop mirror = JNIHandles::resolve_non_null(clazz); 769 oop mirror = JNIHandles::resolve_non_null(clazz);
770 instanceKlass* k = instanceKlass::cast(java_lang_Class::as_klassOop(mirror)); 770
771 if (k != NULL) { 771 klassOop klass = java_lang_Class::as_klassOop(mirror);
772 if (klass != NULL && Klass::cast(klass)->should_be_initialized()) {
773 instanceKlass* k = instanceKlass::cast(klass);
772 k->initialize(CHECK); 774 k->initialize(CHECK);
773 } 775 }
776 }
777 UNSAFE_END
778
779 UNSAFE_ENTRY(jboolean, Unsafe_ShouldBeInitialized(JNIEnv *env, jobject unsafe, jobject clazz)) {
780 UnsafeWrapper("Unsafe_ShouldBeInitialized");
781 if (clazz == NULL) {
782 THROW_(vmSymbols::java_lang_NullPointerException(), false);
783 }
784 oop mirror = JNIHandles::resolve_non_null(clazz);
785 klassOop klass = java_lang_Class::as_klassOop(mirror);
786 if (klass != NULL && Klass::cast(klass)->should_be_initialized()) {
787 return true;
788 }
789 return false;
790 }
774 UNSAFE_END 791 UNSAFE_END
775 792
776 static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) { 793 static void getBaseAndScale(int& base, int& scale, jclass acls, TRAPS) {
777 if (acls == NULL) { 794 if (acls == NULL) {
778 THROW(vmSymbols::java_lang_NullPointerException()); 795 THROW(vmSymbols::java_lang_NullPointerException());
1564 1581
1565 JNINativeMethod anonk_methods[] = { 1582 JNINativeMethod anonk_methods[] = {
1566 {CC"defineAnonymousClass", CC"("DAC_Args")"CLS, FN_PTR(Unsafe_DefineAnonymousClass)}, 1583 {CC"defineAnonymousClass", CC"("DAC_Args")"CLS, FN_PTR(Unsafe_DefineAnonymousClass)},
1567 }; 1584 };
1568 1585
1586 JNINativeMethod lform_methods[] = {
1587 {CC"shouldBeInitialized",CC"("CLS")Z", FN_PTR(Unsafe_ShouldBeInitialized)},
1588 };
1589
1569 #undef CC 1590 #undef CC
1570 #undef FN_PTR 1591 #undef FN_PTR
1571 1592
1572 #undef ADR 1593 #undef ADR
1573 #undef LANG 1594 #undef LANG
1634 tty->print_cr("Warning: SDK 1.7 Unsafe.defineClass (anonymous version) not found."); 1655 tty->print_cr("Warning: SDK 1.7 Unsafe.defineClass (anonymous version) not found.");
1635 } 1656 }
1636 env->ExceptionClear(); 1657 env->ExceptionClear();
1637 } 1658 }
1638 } 1659 }
1660 if (EnableInvokeDynamic) {
1661 env->RegisterNatives(unsafecls, lform_methods, sizeof(lform_methods)/sizeof(JNINativeMethod));
1662 if (env->ExceptionOccurred()) {
1663 if (PrintMiscellaneous && (Verbose || WizardMode)) {
1664 tty->print_cr("Warning: SDK 1.7 LambdaForm support in Unsafe not found.");
1665 }
1666 env->ExceptionClear();
1667 }
1668 }
1639 int status = env->RegisterNatives(unsafecls, methods, sizeof(methods)/sizeof(JNINativeMethod)); 1669 int status = env->RegisterNatives(unsafecls, methods, sizeof(methods)/sizeof(JNINativeMethod));
1640 if (env->ExceptionOccurred()) { 1670 if (env->ExceptionOccurred()) {
1641 if (PrintMiscellaneous && (Verbose || WizardMode)) { 1671 if (PrintMiscellaneous && (Verbose || WizardMode)) {
1642 tty->print_cr("Warning: SDK 1.6 version of Unsafe not found."); 1672 tty->print_cr("Warning: SDK 1.6 version of Unsafe not found.");
1643 } 1673 }