RFR (S): 8026502: java/lang/invoke/MethodHandleConstants.java fails on all platforms
Christian Thalinger
christian.thalinger at oracle.com
Tue Oct 22 20:24:49 PDT 2013
https://bugs.openjdk.java.net/browse/JDK-8026502
8026502: java/lang/invoke/MethodHandleConstants.java fails on all platforms
Reviewed-by:
There are two sides to this fix:
1) hardening the VM so it doesn't fall over input it shouldn't get:
diff -r 36e17466dd39 src/share/vm/classfile/systemDictionary.cpp
--- a/src/share/vm/classfile/systemDictionary.cpp Tue Oct 22 14:02:15 2013 +0000
+++ b/src/share/vm/classfile/systemDictionary.cpp Tue Oct 22 20:17:52 2013 -0700
@@ -2360,6 +2360,11 @@ methodHandle SystemDictionary::find_meth
objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty));
assert(appendix_box->obj_at(0) == NULL, "");
+ // This should not happen. JDK code should take care of that.
+ if (accessing_klass.is_null() || method_type.is_null()) {
+ THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokehandle", empty);
+ }
+
// call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName
JavaCallArguments args;
args.push_oop(accessing_klass()->java_mirror());
@@ -2485,6 +2490,9 @@ Handle SystemDictionary::link_method_han
Handle type;
if (signature->utf8_length() > 0 && signature->byte_at(0) == '(') {
type = find_method_handle_type(signature, caller, CHECK_(empty));
+ } else if (caller.is_null()) {
+ // This should not happen. JDK code should take care of that.
+ THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty);
} else {
ResourceMark rm(THREAD);
SignatureStream ss(signature, false);
@@ -2548,6 +2556,11 @@ methodHandle SystemDictionary::find_dyna
Handle method_name = java_lang_String::create_from_symbol(name, CHECK_(empty));
Handle method_type = find_method_handle_type(type, caller, CHECK_(empty));
+ // This should not happen. JDK code should take care of that.
+ if (caller.is_null() || method_type.is_null()) {
+ THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad invokedynamic", empty);
+ }
+
objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty));
assert(appendix_box->obj_at(0) == NULL, "");
2) fix the JDK code so it doesn't pass input to the VM it shouldn't:
diff -r 0913c3bab168 src/share/classes/java/lang/invoke/MethodHandles.java
--- a/src/share/classes/java/lang/invoke/MethodHandles.java Tue Oct 22 15:12:22 2013 -0700
+++ b/src/share/classes/java/lang/invoke/MethodHandles.java Tue Oct 22 19:49:01 2013 -0700
@@ -1716,6 +1716,13 @@ return mh1;
checkSymbolicClass(defc);
return mh;
}
+ // Treat MethodHandle.invoke and invokeExact specially.
+ if (defc == MethodHandle.class && refKind == REF_invokeVirtual) {
+ mh = findVirtualForMH(member.getName(), member.getMethodType());
+ if (mh != null) {
+ return mh;
+ }
+ }
MemberName resolved = resolveOrFail(refKind, member);
mh = getDirectMethodForConstant(refKind, defc, resolved);
if (mh instanceof DirectMethodHandle
@@ -1768,12 +1775,6 @@ return mh1;
if (MethodHandleNatives.refKindIsField(refKind)) {
return getDirectFieldNoSecurityManager(refKind, defc, member);
} else if (MethodHandleNatives.refKindIsMethod(refKind)) {
- if (defc == MethodHandle.class && refKind == REF_invokeVirtual) {
- MethodHandle mh = findVirtualForMH(member.getName(), member.getMethodType());
- if (mh != null) {
- return mh;
- }
- }
return getDirectMethodNoSecurityManager(refKind, defc, member, lookupClass);
} else if (refKind == REF_newInvokeSpecial) {
return getDirectConstructorNoSecurityManager(defc, member);
More information about the hotspot-compiler-dev
mailing list