diff --git a/common.json b/common.json index c557cc59de52..147403e0c415 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-b03", "platformspecific": true }, - "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-25+37-jvmci-b03-debug", "platformspecific": true }, - "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-25+37-jvmci-b03-sulong", "platformspecific": true }, - "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-25+37-jvmci-b03", "platformspecific": true }, - "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-25+37-jvmci-b03-debug", "platformspecific": true }, - "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-25+37-jvmci-b03-sulong", "platformspecific": true } + "labsjdk-ce-latest": {"name": "labsjdk", "version": "ce-25+37-jvmci-b04", "platformspecific": true }, + "labsjdk-ce-latestDebug": {"name": "labsjdk", "version": "ce-25+37-jvmci-b04-debug", "platformspecific": true }, + "labsjdk-ce-latest-llvm": {"name": "labsjdk", "version": "ce-25+37-jvmci-b04-sulong", "platformspecific": true }, + "labsjdk-ee-latest": {"name": "labsjdk", "version": "ee-25+37-jvmci-b04", "platformspecific": true }, + "labsjdk-ee-latestDebug": {"name": "labsjdk", "version": "ee-25+37-jvmci-b04-debug", "platformspecific": true }, + "labsjdk-ee-latest-llvm": {"name": "labsjdk", "version": "ee-25+37-jvmci-b04-sulong", "platformspecific": true } }, "eclipse": { diff --git a/compiler/ci/ci_common/gate.jsonnet b/compiler/ci/ci_common/gate.jsonnet index 63ada50c1f9a..5e6d6b03561c 100644 --- a/compiler/ci/ci_common/gate.jsonnet +++ b/compiler/ci/ci_common/gate.jsonnet @@ -550,8 +550,7 @@ local style_builds = [self.make_build(self.jdk_latest, "linux-amd64", "style").build + { environment+: { # Run the strict JVMCI version check, i.e., that JVMCIVersionCheck.JVMCI_MIN_VERSION matches the versions in common.json. - # temporarily disable until labsjdk-ce|ee-25 is gone from common.json - # JVMCI_VERSION_CHECK: "strict", + JVMCI_VERSION_CHECK: "strict", }, }], diff --git a/compiler/mx.compiler/mx_compiler.py b/compiler/mx.compiler/mx_compiler.py index 39d7fff61ebd..194d71be385b 100644 --- a/compiler/mx.compiler/mx_compiler.py +++ b/compiler/mx.compiler/mx_compiler.py @@ -1243,12 +1243,13 @@ def get_latest_jvmci_version(): # only compare the same major versions if latest == 'not found': latest = current - elif latest != current: - # All JVMCI JDKs in common.json with the same major version - # are expected to have the same JVMCI version. - # If they don't then the repo is in some transitionary state - # (e.g. making a JVMCI release) so skip the check. - return False, distribution + # [GR-69961] temporarily disable until labsjdk-ce|ee-25 is gone from common.json + # elif latest != current: + # # All JVMCI JDKs in common.json with the same major version + # # are expected to have the same JVMCI version. + # # If they don't then the repo is in some transitionary state + # # (e.g. making a JVMCI release) so skip the check. + # return False, distribution return not isinstance(latest, str), latest version_check_setting = os.environ.get('JVMCI_VERSION_CHECK', None) 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 b23b591a3273..9f180528695b 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", 1), - DEFAULT_VENDOR_ENTRY, createLabsJDKVersion("25+37", 1))); + "Oracle Corporation", createLabsJDKVersion("25+37", 4), + DEFAULT_VENDOR_ENTRY, createLabsJDKVersion("25+37", 4))); // 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 6b0619792fff..b78853094a8c 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 @@ -31,10 +31,10 @@ import jdk.graal.compiler.core.common.LibGraalSupport; import jdk.graal.compiler.debug.GraalError; - import jdk.vm.ci.meta.Assumptions; 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; @@ -240,6 +240,11 @@ public ResolvedJavaType getArrayClass() { return arrayOfType; } + @Override + public List getPermittedSubclasses() { + throw new UnsupportedOperationException(); + } + @Override public JavaKind getJavaKind() { return JavaKind.Object; 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 53827e99e269..9e928ad3a5a3 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 @@ -47,6 +47,7 @@ import jdk.vm.ci.meta.Assumptions; 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.ResolvedJavaType; @@ -84,6 +85,15 @@ public final HotSpotResolvedObjectType getArrayClass() { return (HotSpotResolvedObjectType) handle(getArrayClassMethod, getArrayClassInvokable); } + private static final SymbolicMethod getPermittedSubclassesMethod = method("getPermittedSubclasses"); + private static final InvokableMethod getPermittedSubclassesInvokable = (receiver, args) -> ((HotSpotResolvedJavaType) receiver).getPermittedSubclasses(); + + @Override + @SuppressWarnings("unchecked") + public List getPermittedSubclasses() { + return (List) handle(getPermittedSubclassesMethod, getPermittedSubclassesInvokable); + } + @Override protected final boolean isBeingInitialized() { throw new UnsupportedOperationException("isBeingInitialized"); 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 8a32f36b92d0..0877bd5e1523 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 @@ -33,6 +33,7 @@ import jdk.vm.ci.common.JVMCIError; import jdk.vm.ci.meta.Assumptions; 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.ResolvedJavaType; @@ -216,6 +217,11 @@ public EspressoResolvedArrayType getArrayClass() { return arrayType; } + @Override + public List getPermittedSubclasses() { + return null; + } + @Override public EspressoResolvedJavaType resolve(ResolvedJavaType accessingClass) { EspressoResolvedJavaType resolvedElementalType = getElementalType().resolve(accessingClass); 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 51d6e923654f..b9468e31b1de 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 @@ -36,6 +36,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Modifier; import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -270,6 +271,22 @@ public ResolvedJavaType getComponentType() { return null; } + @Override + public List getPermittedSubclasses() { + Class[] permittedSubclass = getPermittedSubclasses0(getMirror()); + if (permittedSubclass == null) { + return null; + } + ResolvedJavaType[] permittedSubtypes = new ResolvedJavaType[permittedSubclass.length]; + MetaAccessProvider metaAccess = runtime().getHostJVMCIBackend().getMetaAccess(); + for (int i = 0; i != permittedSubtypes.length; i++) { + permittedSubtypes[i] = metaAccess.lookupJavaType(permittedSubclass[i]); + } + return Collections.unmodifiableList(Arrays.asList(permittedSubtypes)); + } + + private static native Class[] getPermittedSubclasses0(Class mirror); + @Override public boolean isDefinitelyResolvedWithRespectTo(ResolvedJavaType accessingClass) { assert accessingClass != null; 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 0d572fdd9a9f..b0b690625254 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 @@ -33,6 +33,7 @@ import jdk.vm.ci.meta.Assumptions; 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.ResolvedJavaType; @@ -183,6 +184,11 @@ public ResolvedJavaType getComponentType() { return null; } + @Override + public List getPermittedSubclasses() { + return null; + } + @Override public JavaKind getJavaKind() { return kind; 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 c708e8a78fa8..73b383a162ca 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 @@ -84,6 +84,11 @@ static StaticObject doDefault(StaticObject self, } } + @Substitution + public static @JavaType(Class[].class) StaticObject getPermittedSubclasses0(@JavaType(Class.class) StaticObject self, @Inject EspressoContext context) { + return context.getVM().JVM_GetPermittedSubclasses(self); + } + private static StaticObject toJVMCIFields(Field[] fields, StaticObject holder, DirectCallNode fieldConstructor, EspressoContext context, Meta meta) { int count = 0; for (Field f : fields) { 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 438b9194527d..46ba482f99f6 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 @@ -37,6 +37,7 @@ import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import java.util.function.Consumer; import java.util.function.Function; +import java.util.stream.Collectors; import org.graalvm.nativeimage.hosted.Feature.DuringAnalysisAccess; import org.graalvm.word.WordBase; @@ -67,6 +68,7 @@ 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.PrimitiveConstant; import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -219,6 +221,11 @@ public abstract class AnalysisType extends AnalysisElement implements WrappedJav */ @SuppressWarnings("unused") private volatile Object overrideableMethods; + private volatile AnalysisType arrayClass = null; + + private static final List PERMITTED_SUBCLASSES_INIT = new ArrayList<>(); + private volatile List permittedSubclasses = PERMITTED_SUBCLASSES_INIT; + @SuppressWarnings("this-escape") public AnalysisType(AnalysisUniverse universe, ResolvedJavaType javaType, JavaKind storageKind, AnalysisType objectType, AnalysisType cloneableType) { super(universe.hostVM.enableTrackAcrossLayers()); @@ -949,8 +956,6 @@ public void initialize() { } } - private volatile AnalysisType arrayClass = null; - @Override public final AnalysisType getArrayClass() { if (arrayClass == null) { @@ -959,6 +964,15 @@ public final AnalysisType getArrayClass() { return arrayClass; } + @Override + public List getPermittedSubclasses() { + if (permittedSubclasses == PERMITTED_SUBCLASSES_INIT) { + List wrappedPermittedSubclasses = wrapped.getPermittedSubclasses(); + permittedSubclasses = wrappedPermittedSubclasses == null ? null : wrappedPermittedSubclasses.stream().map(universe::lookup).collect(Collectors.toUnmodifiableList()); + } + return permittedSubclasses; + } + @Override public boolean isInterface() { return wrapped.isInterface(); 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 dee55ad73fe9..a230814d13d3 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 @@ -33,6 +33,7 @@ import jdk.vm.ci.meta.Assumptions; 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.ResolvedJavaType; @@ -221,6 +222,11 @@ public ResolvedJavaType getArrayClass() { 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."); + } + @Override public JavaKind getJavaKind() { /* All the primitive types can be looked up by name */ diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java index 8c166f7341c2..94ce4928e4e7 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java @@ -1693,7 +1693,7 @@ static RuntimeException recordsNotAvailable(DynamicHub declaringClass) { } @KeepOriginal - private native Class[] getPermittedSubclasses(); + public native Class[] getPermittedSubclasses(); @Substitute private static ReflectionFactory getReflectionFactory() { 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 65da77adda56..7ae7108e782e 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 @@ -26,6 +26,8 @@ import java.lang.annotation.Annotation; import java.util.Arrays; +import java.util.Collections; +import java.util.List; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -43,6 +45,7 @@ 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; @@ -64,6 +67,9 @@ public class SubstrateType implements SharedType { @UnknownObjectField(availability = AfterAnalysis.class, canBeNull = true)// protected DynamicHub uniqueConcreteImplementation; + @UnknownObjectField(availability = AfterAnalysis.class, canBeNull = true)// + protected SubstrateType[] permittedSubclasses; + public SubstrateType(JavaKind kind, DynamicHub hub) { this.kind = kind; this.hub = hub; @@ -301,6 +307,21 @@ public ResolvedJavaType getArrayClass() { return SubstrateMetaAccess.singleton().lookupJavaTypeFromHub(hub.getArrayHub()); } + @Override + public List getPermittedSubclasses() { + Class[] hubPermittedSubclasses = hub.getPermittedSubclasses(); + if (hubPermittedSubclasses == null) { + return null; + } + if (permittedSubclasses == null) { + permittedSubclasses = new SubstrateType[hubPermittedSubclasses.length]; + for (int i = 0; i < hubPermittedSubclasses.length; i++) { + permittedSubclasses[i] = SubstrateMetaAccess.singleton().lookupJavaType(hubPermittedSubclasses[i]); + } + } + return Collections.unmodifiableList(Arrays.asList(permittedSubclasses)); + } + @Override public SubstrateField[] getInstanceFields(boolean includeSuperclasses) { if (rawAllInstanceFields == null) { 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 13ff216ba004..06206f197891 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 @@ -34,6 +34,7 @@ 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.ResolvedJavaType; @@ -194,6 +195,11 @@ public ResolvedJavaType getArrayClass() { return original.getArrayClass(); } + @Override + public List getPermittedSubclasses() { + return original.getPermittedSubclasses(); + } + @Override public ResolvedJavaMethod resolveMethod(ResolvedJavaMethod method, ResolvedJavaType callerType) { return original.resolveMethod(method, callerType); 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 011991d34145..430fc61c1c90 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 @@ -24,9 +24,12 @@ */ package com.oracle.svm.hosted.meta; +import java.util.List; + import com.oracle.graal.pointsto.meta.AnalysisType; import jdk.vm.ci.meta.JavaKind; +import jdk.vm.ci.meta.JavaType; public class HostedArrayClass extends HostedClass { @@ -69,6 +72,11 @@ public final HostedType getComponentType() { return componentType; } + @Override + public List getPermittedSubclasses() { + return null; + } + @Override public HostedType getBaseType() { return baseType; 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 690bc721e8fa..794643803725 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 @@ -24,9 +24,12 @@ */ package com.oracle.svm.hosted.meta; +import java.util.List; + import com.oracle.graal.pointsto.meta.AnalysisType; import jdk.vm.ci.meta.JavaKind; +import jdk.vm.ci.meta.JavaType; public class HostedPrimitiveType extends HostedType { @@ -69,6 +72,11 @@ public final HostedType getComponentType() { return null; } + @Override + public List getPermittedSubclasses() { + return null; + } + @Override public HostedType getBaseType() { return this; 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 0b33fab54798..30fd019defc7 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 @@ -24,6 +24,10 @@ */ package com.oracle.svm.hosted.meta; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + import org.graalvm.word.WordBase; import com.oracle.graal.pointsto.infrastructure.OriginalClassProvider; @@ -40,6 +44,7 @@ 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.ResolvedJavaType; @@ -60,6 +65,8 @@ 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; protected HostedType[] subTypes; protected HostedField[] staticFields; @@ -404,6 +411,18 @@ public final HostedArrayClass getArrayClass() { return arrayType; } + @Override + public List getPermittedSubclasses() { + if (isPrimitive() || isArray()) { + return null; + } + if (permittedSubclasses == PERMITTED_SUBCLASSES_INIT) { + List aPermittedSubclasses = wrapped.getPermittedSubclasses(); + permittedSubclasses = aPermittedSubclasses == null ? null : aPermittedSubclasses.stream().map(universe::lookup).collect(Collectors.toUnmodifiableList()); + } + return permittedSubclasses; + } + public HostedType getArrayClass(int dimension) { HostedType result = this; for (int i = 0; i < dimension; i++) { 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 b38099694dc6..e7b923ab9178 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 @@ -37,6 +37,7 @@ 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.ResolvedJavaType; @@ -191,6 +192,11 @@ public ResolvedJavaType getArrayClass() { return original.getArrayClass(); } + @Override + public List getPermittedSubclasses() { + return original.getPermittedSubclasses(); + } + @Override public ResolvedJavaMethod resolveConcreteMethod(ResolvedJavaMethod method, ResolvedJavaType callerType) { return original.resolveConcreteMethod(method, callerType); 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 aa305941b8e1..bbd6bb26564d 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 @@ -38,6 +38,7 @@ 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.ResolvedJavaType; @@ -218,6 +219,11 @@ public ResolvedJavaType getArrayClass() { return annotated.getArrayClass(); } + @Override + public List getPermittedSubclasses() { + return annotated.getPermittedSubclasses(); + } + @Override public ResolvedJavaMethod resolveConcreteMethod(ResolvedJavaMethod method, ResolvedJavaType callerType) { /* First check the annotated class. @Substitute methods are found there. */ 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 e2393f17966e..667ed563b568 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 @@ -26,6 +26,8 @@ import static com.oracle.svm.core.BuildPhaseProvider.AfterAnalysis; +import java.util.List; + import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; import org.graalvm.word.WordBase; @@ -45,6 +47,7 @@ import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; +import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaType; public class InterpreterResolvedObjectType extends InterpreterResolvedJavaType { @@ -202,6 +205,11 @@ public final InterpreterResolvedJavaType getComponentType() { return componentType; } + @Override + public List getPermittedSubclasses() { + throw VMError.unimplemented("getPermittedSubclasses"); + } + @Override public final JavaKind getJavaKind() { return JavaKind.Object; 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 94f5f5c7ef73..25de0a42c11a 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 @@ -25,6 +25,7 @@ package com.oracle.svm.interpreter.metadata; import java.lang.reflect.Modifier; +import java.util.List; import com.oracle.svm.core.hub.registry.SymbolsSupport; import com.oracle.svm.espresso.classfile.ConstantPool; @@ -37,6 +38,7 @@ import com.oracle.svm.espresso.classfile.descriptors.Type; import jdk.vm.ci.meta.JavaKind; +import jdk.vm.ci.meta.JavaType; import jdk.vm.ci.meta.ResolvedJavaField; import jdk.vm.ci.meta.ResolvedJavaType; @@ -93,6 +95,11 @@ public ResolvedJavaType getComponentType() { return null; } + @Override + public List getPermittedSubclasses() { + return null; + } + @Override public JavaKind getJavaKind() { return kind;