diff --git a/common.json b/common.json index 0a68cc7d61f5..e6bc6d302e11 100644 --- a/common.json +++ b/common.json @@ -55,12 +55,12 @@ "graalvm-ee-25-ea": {"name": "graalvm-jdk", "version": "25.0.0", "ea": "36", "platformspecific": true }, "oraclejdk-latest": {"name": "jpg-jdk", "version": "25", "build_id": "jdk-25+37", "platformspecific": true, "extrabundles": ["static-libs"]}, - "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-25+37-jvmci-b05", "platformspecific": true }, - "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-25+37-jvmci-b05-debug", "platformspecific": true }, - "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-25+37-jvmci-b05-sulong", "platformspecific": true }, - "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-25+37-jvmci-b05", "platformspecific": true }, - "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-25+37-jvmci-b05-debug", "platformspecific": true }, - "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-25+37-jvmci-b05-sulong", "platformspecific": true } + "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-25+37-jvmci-b06", "platformspecific": true }, + "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-25+37-jvmci-b06-debug", "platformspecific": true }, + "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-25+37-jvmci-b06-sulong", "platformspecific": true }, + "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-25+37-jvmci-b06", "platformspecific": true }, + "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-25+37-jvmci-b06-debug", "platformspecific": true }, + "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-25+37-jvmci-b06-sulong", "platformspecific": true } }, "eclipse": { diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java index 7260d9da1742..e985b6d33c5d 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/JVMCIVersionCheck.java @@ -57,8 +57,8 @@ public final class JVMCIVersionCheck { // Checkstyle: stop stable iteration order check private static final Map> JVMCI_MIN_VERSIONS = Map.of( "25", Map.of( - "Oracle Corporation", createLabsJDKVersion("25+37", 5), - DEFAULT_VENDOR_ENTRY, createLabsJDKVersion("25+37", 5))); + "Oracle Corporation", createLabsJDKVersion("25+37", 6), + DEFAULT_VENDOR_ENTRY, createLabsJDKVersion("25+37", 6))); // Checkstyle: resume stable iteration order check private static final int NA = 0; diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java index d3a427351250..569301b8ede6 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SnippetResolvedJavaType.java @@ -242,6 +242,11 @@ public ResolvedJavaType getArrayClass() { return arrayOfType; } + @Override + public boolean isHidden() { + throw new UnsupportedOperationException(); + } + @Override public List getPermittedSubclasses() { throw new UnsupportedOperationException(); @@ -312,6 +317,11 @@ public ResolvedJavaType getEnclosingType() { throw new UnsupportedOperationException(); } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + throw new UnsupportedOperationException(); + } + @Override public ResolvedJavaMethod[] getDeclaredConstructors() { return getDeclaredConstructors(true); diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replaycomp/proxy/HotSpotResolvedJavaTypeProxy.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replaycomp/proxy/HotSpotResolvedJavaTypeProxy.java index 3a89940e8484..8686d746939c 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replaycomp/proxy/HotSpotResolvedJavaTypeProxy.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replaycomp/proxy/HotSpotResolvedJavaTypeProxy.java @@ -42,6 +42,7 @@ import java.lang.annotation.Annotation; import java.util.List; +import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod; import jdk.vm.ci.hotspot.HotSpotResolvedJavaType; import jdk.vm.ci.hotspot.HotSpotResolvedObjectType; import jdk.vm.ci.meta.Assumptions; @@ -86,6 +87,22 @@ public final HotSpotResolvedObjectType getArrayClass() { return (HotSpotResolvedObjectType) handle(getArrayClassMethod, getArrayClassInvokable); } + private static final SymbolicMethod getEnclosingMethodMethod = method("getEnclosingMethod"); + private static final InvokableMethod getEnclosingMethodInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).getEnclosingMethod(); + + @Override + public HotSpotResolvedJavaMethod getEnclosingMethod() { + return (HotSpotResolvedJavaMethod) handle(getEnclosingMethodMethod, getEnclosingMethodInvokable); + } + + private static final SymbolicMethod isHiddenMethod = method("isHidden"); + private static final InvokableMethod isHiddenInvokable = (receiver, args) -> ((HotSpotResolvedObjectType) receiver).isHidden(); + + @Override + public boolean isHidden() { + return (boolean) handle(isHiddenMethod, isHiddenInvokable); + } + private static final SymbolicMethod getPermittedSubclassesMethod = method("getPermittedSubclasses"); private static final InvokableMethod getPermittedSubclassesInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).getPermittedSubclasses(); diff --git a/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedArrayType.java b/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedArrayType.java index 6bcd86e6bab5..66f06ed9d8dc 100644 --- a/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedArrayType.java +++ b/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedArrayType.java @@ -218,6 +218,11 @@ public EspressoResolvedArrayType getArrayClass() { return arrayType; } + @Override + public boolean isHidden() { + return false; + } + @Override public List getPermittedSubclasses() { return null; @@ -289,6 +294,11 @@ public ResolvedJavaType getEnclosingType() { return null; } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + return null; + } + @Override public ResolvedJavaMethod[] getDeclaredConstructors(boolean forceLink) { return NO_METHODS; diff --git a/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedInstanceType.java b/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedInstanceType.java index 7c9273d8d0c7..6dc7b9c03b3b 100644 --- a/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedInstanceType.java +++ b/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedInstanceType.java @@ -34,6 +34,8 @@ import static java.util.Objects.requireNonNull; import java.lang.annotation.Annotation; +import java.lang.reflect.Executable; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.Collections; @@ -273,6 +275,9 @@ public ResolvedJavaType getComponentType() { return null; } + @Override + public native boolean isHidden(); + @Override public List getPermittedSubclasses() { Class[] permittedSubclass = getPermittedSubclasses0(getMirror()); @@ -492,6 +497,16 @@ public ResolvedJavaType getEnclosingType() { return runtime().getHostJVMCIBackend().getMetaAccess().lookupJavaType(enclosingClass); } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + Method enclosingMethod = getMirror().getEnclosingMethod(); + Executable enclosingExecutable = enclosingMethod != null ? enclosingMethod : getMirror().getEnclosingConstructor(); + if (enclosingExecutable != null) { + return runtime().getHostJVMCIBackend().getMetaAccess().lookupJavaMethod(enclosingExecutable); + } + return null; + } + @Override public native void link(); diff --git a/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedPrimitiveType.java b/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedPrimitiveType.java index db6792451d5f..1d03c0153756 100644 --- a/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedPrimitiveType.java +++ b/espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoResolvedPrimitiveType.java @@ -187,6 +187,11 @@ public ResolvedJavaType getComponentType() { return null; } + @Override + public boolean isHidden() { + return false; + } + @Override public List getPermittedSubclasses() { return null; @@ -259,6 +264,11 @@ public ResolvedJavaType getEnclosingType() { return null; } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + return null; + } + @Override public ResolvedJavaMethod[] getDeclaredMethods(boolean forceLink) { return NO_METHODS; diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedInstanceType.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedInstanceType.java index ad03aec317f0..20581b99f138 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedInstanceType.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedInstanceType.java @@ -88,6 +88,11 @@ static StaticObject doDefault(StaticObject self, } } + @Substitution + public static boolean isHidden(@JavaType(Class.class) StaticObject self, @Inject EspressoContext context) { + return context.getVM().JVM_IsHiddenClass(self); + } + @Substitution public static @JavaType(Class[].class) StaticObject getPermittedSubclasses0(@JavaType(Class.class) StaticObject self, @Inject EspressoContext context) { return context.getVM().JVM_GetPermittedSubclasses(self); diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java index 8fcaed432039..511a911ef8ed 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java @@ -225,8 +225,14 @@ public abstract class AnalysisType extends AnalysisElement implements WrappedJav private volatile AnalysisType arrayClass = null; - private static final List PERMITTED_SUBCLASSES_INIT = new ArrayList<>(); - private volatile List permittedSubclasses = PERMITTED_SUBCLASSES_INIT; + /** + * Sentinel marker for the uninitialized state of {@link #permittedSubclasses}. Indicates that + * the permitted subclasses (for sealed types) has not yet been computed. Distinguishes this + * state from both a computed {@code null} (not sealed) and a computed list (which may be + * empty). + */ + private static final List PERMITTED_SUBCLASSES_UNINITIALIZED = new ArrayList<>(); + private volatile List permittedSubclasses = PERMITTED_SUBCLASSES_UNINITIALIZED; @SuppressWarnings("this-escape") public AnalysisType(AnalysisUniverse universe, ResolvedJavaType javaType, JavaKind storageKind, AnalysisType objectType, AnalysisType cloneableType) { @@ -967,9 +973,14 @@ public final AnalysisType getArrayClass() { } @Override - public List getPermittedSubclasses() { - if (permittedSubclasses == PERMITTED_SUBCLASSES_INIT) { - List wrappedPermittedSubclasses = wrapped.getPermittedSubclasses(); + public boolean isHidden() { + return wrapped.isHidden(); + } + + @Override + public List getPermittedSubclasses() { + if (permittedSubclasses == PERMITTED_SUBCLASSES_UNINITIALIZED) { + List wrappedPermittedSubclasses = wrapped.getPermittedSubclasses(); permittedSubclasses = wrappedPermittedSubclasses == null ? null : wrappedPermittedSubclasses.stream().map(universe::lookup).collect(Collectors.toUnmodifiableList()); } return permittedSubclasses; @@ -1327,6 +1338,11 @@ public AnalysisType getEnclosingType() { return universe.lookup(wrapped.getEnclosingType()); } + @Override + public AnalysisMethod getEnclosingMethod() { + return universe.lookup(wrapped.getEnclosingMethod()); + } + @Override public ResolvedJavaType[] getDeclaredTypes() { ResolvedJavaType[] declaredTypes = wrapped.getDeclaredTypes(); diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java index 6c38d6f2422d..79654d82f482 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/BaseLayerType.java @@ -226,6 +226,11 @@ public ResolvedJavaType getArrayClass() { throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used."); } + @Override + public boolean isHidden() { + throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used."); + } + @Override public List getPermittedSubclasses() { throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used."); @@ -321,6 +326,11 @@ public ResolvedJavaType getEnclosingType() { return enclosingType; } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used."); + } + @Override public ResolvedJavaMethod[] getDeclaredConstructors() { throw AnalysisError.shouldNotReachHere("This type is incomplete and should not be used."); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/crema/CremaResolvedJavaType.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/crema/CremaResolvedJavaType.java index db011554f661..2ed6d473a6b4 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/crema/CremaResolvedJavaType.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/crema/CremaResolvedJavaType.java @@ -81,16 +81,6 @@ public interface CremaResolvedJavaType extends ResolvedJavaType { */ byte[] getRawTypeAnnotations(); - /** - * If this object represents a local or anonymous class within a method, returns a - * {@link CremaEnclosingMethodInfo} object representing the immediately enclosing method of the - * underlying class. Returns {@code null} otherwise. - * - * @return the immediately enclosing method of the underlying class, if that class is a local or - * anonymous class; otherwise {@code null}. - */ - CremaEnclosingMethodInfo getEnclosingMethod(); - /** * Returns an array of {@code JavaType} objects reflecting all the classes and interfaces * declared as members of the class represented by this object. This includes public, protected, @@ -128,7 +118,4 @@ public interface CremaResolvedJavaType extends ResolvedJavaType { * @return a JavaType representing the nest host */ ResolvedJavaType getNestHost(); - - record CremaEnclosingMethodInfo(JavaType enclosingType, String name, String description) { - } } diff --git a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java index b6fcbfc54dc4..4f1ae18a6012 100644 --- a/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java +++ b/substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/meta/SubstrateType.java @@ -25,6 +25,8 @@ package com.oracle.svm.graal.meta; import java.lang.annotation.Annotation; +import java.lang.reflect.Executable; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -45,7 +47,6 @@ import jdk.vm.ci.meta.Assumptions.AssumptionResult; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; -import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.MetaUtil; import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -320,7 +321,12 @@ public ResolvedJavaType getArrayClass() { } @Override - public List getPermittedSubclasses() { + public boolean isHidden() { + return hub.isHidden(); + } + + @Override + public List getPermittedSubclasses() { Class[] hubPermittedSubclasses = hub.getPermittedSubclasses(); if (hubPermittedSubclasses == null) { return null; @@ -454,6 +460,17 @@ public ResolvedJavaType getEnclosingType() { return SubstrateMetaAccess.singleton().lookupJavaType(enclosingClass); } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + Class cls = DynamicHub.toClass(hub); + Method enclosingMethod = cls.getEnclosingMethod(); + Executable enclosingExecutable = enclosingMethod != null ? enclosingMethod : cls.getEnclosingConstructor(); + if (enclosingExecutable != null) { + return SubstrateMetaAccess.singleton().lookupJavaMethod(enclosingExecutable); + } + return null; + } + @Override public ResolvedJavaMethod[] getDeclaredConstructors() { return getDeclaredConstructors(true); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java index cd35971de299..de2be6b297f5 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/annotation/CustomSubstitutionType.java @@ -207,7 +207,12 @@ public ResolvedJavaType getArrayClass() { } @Override - public List getPermittedSubclasses() { + public boolean isHidden() { + return original.isHidden(); + } + + @Override + public List getPermittedSubclasses() { return original.getPermittedSubclasses(); } @@ -261,6 +266,11 @@ public ResolvedJavaType getEnclosingType() { return original.getEnclosingType(); } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + return original.getEnclosingMethod(); + } + @Override public ResolvedJavaMethod[] getDeclaredConstructors() { return getDeclaredConstructors(true); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedArrayClass.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedArrayClass.java index 430fc61c1c90..efa6eb0f659c 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedArrayClass.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedArrayClass.java @@ -29,7 +29,6 @@ import com.oracle.graal.pointsto.meta.AnalysisType; import jdk.vm.ci.meta.JavaKind; -import jdk.vm.ci.meta.JavaType; public class HostedArrayClass extends HostedClass { @@ -73,7 +72,7 @@ public final HostedType getComponentType() { } @Override - public List getPermittedSubclasses() { + public List getPermittedSubclasses() { return null; } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedPrimitiveType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedPrimitiveType.java index 794643803725..e224a635cd15 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedPrimitiveType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedPrimitiveType.java @@ -29,7 +29,6 @@ import com.oracle.graal.pointsto.meta.AnalysisType; import jdk.vm.ci.meta.JavaKind; -import jdk.vm.ci.meta.JavaType; public class HostedPrimitiveType extends HostedType { @@ -73,7 +72,7 @@ public final HostedType getComponentType() { } @Override - public List getPermittedSubclasses() { + public List getPermittedSubclasses() { return null; } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java index b74dde8ebea7..a577fbc8aaaa 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java @@ -44,7 +44,6 @@ import jdk.vm.ci.meta.Assumptions.AssumptionResult; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; -import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaRecordComponent; @@ -67,8 +66,15 @@ public abstract class HostedType extends HostedElement implements SharedType, Wr private final HostedInterface[] interfaces; protected HostedArrayClass arrayType; - private static final List PERMITTED_SUBCLASSES_INIT = new ArrayList<>(); - private List permittedSubclasses = PERMITTED_SUBCLASSES_INIT; + + /** + * Sentinel marker for the uninitialized state of {@link #permittedSubclasses}. Indicates that + * the permitted subclasses (for sealed types) has not yet been computed. Distinguishes this + * state from both a computed {@code null} (not sealed) and a computed list (which may be + * empty). + */ + private static final List PERMITTED_SUBCLASSES_UNINITIALIZED = new ArrayList<>(); + private List permittedSubclasses = PERMITTED_SUBCLASSES_UNINITIALIZED; protected HostedType[] subTypes; protected HostedField[] staticFields; @@ -419,12 +425,17 @@ public final HostedArrayClass getArrayClass() { } @Override - public List getPermittedSubclasses() { + public boolean isHidden() { + return wrapped.isHidden(); + } + + @Override + public List getPermittedSubclasses() { if (isPrimitive() || isArray()) { return null; } - if (permittedSubclasses == PERMITTED_SUBCLASSES_INIT) { - List aPermittedSubclasses = wrapped.getPermittedSubclasses(); + if (permittedSubclasses == PERMITTED_SUBCLASSES_UNINITIALIZED) { + List aPermittedSubclasses = wrapped.getPermittedSubclasses(); permittedSubclasses = aPermittedSubclasses == null ? null : aPermittedSubclasses.stream().map(universe::lookup).collect(Collectors.toUnmodifiableList()); } return permittedSubclasses; @@ -554,6 +565,11 @@ public HostedType getEnclosingType() { return universe.lookup(wrapped.getEnclosingType()); } + @Override + public HostedMethod getEnclosingMethod() { + return universe.lookup(wrapped.getEnclosingMethod()); + } + @Override public ResolvedJavaType[] getDeclaredTypes() { ResolvedJavaType[] declaredTypes = wrapped.getDeclaredTypes(); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/InjectedFieldsType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/InjectedFieldsType.java index 0bab0902bd5a..8a593d7c76af 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/InjectedFieldsType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/InjectedFieldsType.java @@ -205,7 +205,12 @@ public ResolvedJavaType getArrayClass() { } @Override - public List getPermittedSubclasses() { + public boolean isHidden() { + return original.isHidden(); + } + + @Override + public List getPermittedSubclasses() { return original.getPermittedSubclasses(); } @@ -264,6 +269,11 @@ public ResolvedJavaType getEnclosingType() { return original.getEnclosingType(); } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + return original.getEnclosingMethod(); + } + @Override public ResolvedJavaMethod[] getDeclaredConstructors() { return getDeclaredConstructors(true); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionType.java index 008b761ec26a..2387cd55bf92 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/substitute/SubstitutionType.java @@ -232,7 +232,12 @@ public ResolvedJavaType getArrayClass() { } @Override - public List getPermittedSubclasses() { + public boolean isHidden() { + return annotated.isHidden(); + } + + @Override + public List getPermittedSubclasses() { return annotated.getPermittedSubclasses(); } @@ -302,6 +307,11 @@ public ResolvedJavaType getEnclosingType() { return annotated.getEnclosingType(); } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + return annotated.getEnclosingMethod(); + } + @Override public ResolvedJavaMethod[] getDeclaredConstructors() { return getDeclaredConstructors(true); diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedObjectType.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedObjectType.java index 5478acb9fbf6..e0051a33735e 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedObjectType.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedObjectType.java @@ -114,7 +114,7 @@ public byte[] getRawTypeAnnotations() { } @Override - public CremaEnclosingMethodInfo getEnclosingMethod() { + public ResolvedJavaMethod getEnclosingMethod() { // (GR-69095) throw VMError.unimplemented("getEnclosingMethod"); } @@ -125,6 +125,12 @@ public JavaType[] getDeclaredClasses() { throw VMError.unimplemented("getDeclaredClasses"); } + @Override + public boolean isHidden() { + // (GR-69095) + throw VMError.unimplemented("isHidden"); + } + @Override public JavaType[] getPermittedSubClasses() { // (GR-69095) diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaType.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaType.java index 5eb03959ba62..020e428e52b6 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaType.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaType.java @@ -305,6 +305,11 @@ public final ResolvedJavaType getEnclosingType() { throw VMError.intentionallyUnimplemented(); } + @Override + public ResolvedJavaMethod getEnclosingMethod() { + throw VMError.intentionallyUnimplemented(); + } + @Override public ResolvedJavaMethod[] getDeclaredConstructors() { throw VMError.intentionallyUnimplemented(); diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java index 6ba0da022ec4..66c57716aff1 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedObjectType.java @@ -208,6 +208,11 @@ public final InterpreterResolvedJavaType getComponentType() { return componentType; } + @Override + public boolean isHidden() { + throw VMError.unimplemented("isHidden"); + } + @Override public List getPermittedSubclasses() { throw VMError.unimplemented("getPermittedSubclasses"); diff --git a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedPrimitiveType.java b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedPrimitiveType.java index 25de0a42c11a..6bec07c8eec1 100644 --- a/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedPrimitiveType.java +++ b/substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedPrimitiveType.java @@ -95,6 +95,11 @@ public ResolvedJavaType getComponentType() { return null; } + @Override + public boolean isHidden() { + return false; + } + @Override public List getPermittedSubclasses() { return null;