diff --git a/make/jdk/src/classes/build/tools/methodhandle/VarHandleGuardMethodGenerator.java b/make/jdk/src/classes/build/tools/methodhandle/VarHandleGuardMethodGenerator.java index ecca3879621..d88c3c8f785 100644 --- a/make/jdk/src/classes/build/tools/methodhandle/VarHandleGuardMethodGenerator.java +++ b/make/jdk/src/classes/build/tools/methodhandle/VarHandleGuardMethodGenerator.java @@ -142,7 +142,7 @@ public final class VarHandleGuardMethodGenerator { } else if (direct && handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) { MethodHandle.linkToStatic(); } else { - ad.adaptedMethodHandle(handle).invokeBasic(); + ad.adaptedMethodHandle(handle).invokeBasic(); } }"""; diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandle.java b/src/java.base/share/classes/java/lang/invoke/MethodHandle.java index 0d02bc6b46d..5853a8385a1 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandle.java @@ -980,7 +980,7 @@ public abstract sealed class MethodHandle implements Constable return false; // no direct relation between loaders is found } - static boolean isBuiltinLoader(ClassLoader loader) { + private static boolean isBuiltinLoader(ClassLoader loader) { return loader == null || loader == ClassLoaders.platformClassLoader() || loader == ClassLoaders.appClassLoader(); diff --git a/src/java.base/share/classes/java/lang/invoke/SegmentVarHandle.java b/src/java.base/share/classes/java/lang/invoke/SegmentVarHandle.java index 99fb35379e0..12756cfa69c 100644 --- a/src/java.base/share/classes/java/lang/invoke/SegmentVarHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/SegmentVarHandle.java @@ -64,6 +64,11 @@ final class SegmentVarHandle extends VarHandle { : accessType.accessModeType(MemorySegment.class, getType.returnType(), long.class, long.class); } + @Override + boolean isReachableFrom(ClassLoader cl) { + return true; + } + @Override public SegmentVarHandle withInvokeExactBehavior() { return hasInvokeExactBehavior() ? diff --git a/src/java.base/share/classes/java/lang/invoke/VarHandle.java b/src/java.base/share/classes/java/lang/invoke/VarHandle.java index add823a1a6f..885a497b5a0 100644 --- a/src/java.base/share/classes/java/lang/invoke/VarHandle.java +++ b/src/java.base/share/classes/java/lang/invoke/VarHandle.java @@ -2012,10 +2012,7 @@ public abstract sealed class VarHandle implements Constable // Exists for the adaption mechanism of AccessDescriptor // Each VH should report its explicitly (receiver, coordinates) and // implicitly (static declaring class) used class to MethodHandle.isReachableFrom - boolean isReachableFrom(ClassLoader cl) { - // Call MethodHandle.isReachableFrom for the used classes - return true; - } + abstract boolean isReachableFrom(ClassLoader cl); static final class AccessDescriptor { final MethodType symbolicMethodTypeExact; diff --git a/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template b/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template index 3614e34999a..9cb2f53c3d2 100644 --- a/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template +++ b/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template @@ -789,6 +789,11 @@ final class VarHandle$Type$s { return at.accessModeType({#if[Object]?arrayType:$type$[].class}, {#if[Object]?arrayType.getComponentType():$type$.class}, int.class); } + @Override + boolean isReachableFrom(ClassLoader cl) { + return {#if[Object]?MethodHandle.isReachableFrom(arrayType, cl):true}; + } + #if[Object] @ForceInline static Object runtimeTypeCheck(Array handle, Object[] oarray, Object value) { diff --git a/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template b/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template index 3cd523ee1cf..161dcb3e774 100644 --- a/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template +++ b/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template @@ -79,6 +79,11 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase { super(form, exact); this.be = be; } + + @Override + boolean isReachableFrom(ClassLoader cl) { + return true; + } } static final class ArrayHandle extends ByteArrayViewVarHandle {