Review Request: JDK-8228671: Fastdebug VM throws InternalError when publicLookup.in(T) is used to resolve a member
Mandy Chung
mandy.chung at oracle.com
Fri Jul 26 21:12:42 UTC 2019
Debug VM checks if a class is accessible to the lookup class except if
the lookup class is java.lang.Object (which was the lookup class of
publicLookup previously). WithJDK-8173978, Lookup::in has changed and it
can be used to create a new public Lookup on a different lookup class.
A quick fix for this bug is to pass Object.class for resolution for a
Lookup object with UNCONDITIONAL mode as previously. The lookup class
and allowed modes are used to check if the resolved member is accessible
to this Lookup object. We should re-examine this area in particular
publicLookup (see JDK-8173977).
diff --git
a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
@@ -1329,7 +1329,14 @@
// This is just for calling out to MethodHandleImpl.
private Class<?> lookupClassOrNull() {
- return (allowedModes == TRUSTED) ? null : lookupClass;
+ if (allowedModes == TRUSTED) {
+ return null;
+ }
+ if (allowedModes == UNCONDITIONAL) {
+ // use Object as the caller to pass to VM doing resolution
+ return Object.class;
+ }
+ return lookupClass;
}
/** Tells which access-protection classes of members this
lookup object can produce.
Mandy
More information about the core-libs-dev
mailing list