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 3993bdabdc04..5e6b064247d6 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 @@ -525,7 +525,7 @@ public TypeState getAssignableTypes(boolean includeNull) { } public static boolean verifyAssignableTypes(BigBang bb) { - List allTypes = bb.getUniverse().getTypes(); + List allTypes = bb.getUniverse().getTypes().stream().filter(t -> !(t.getWrapped() instanceof BaseLayerType)).toList(); Set mismatchedAssignableResults = ConcurrentHashMap.newKeySet(); allTypes.parallelStream().filter(t -> t.instantiatedTypes != null).forEach(t1 -> { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java index 05325eb950ee..46fcf61f3017 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/TypeCheckBuilder.java @@ -39,6 +39,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; +import com.oracle.graal.pointsto.meta.BaseLayerType; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.graal.snippets.OpenTypeWorldSnippets; import com.oracle.svm.core.hub.DynamicHubSupport; @@ -46,6 +47,7 @@ import com.oracle.svm.hosted.OpenTypeWorldFeature; import jdk.graal.compiler.core.common.calc.UnsignedMath; +import jdk.graal.compiler.debug.Assertions; /** * This class assigns each type an id, determines stamp metadata, and generates the information @@ -1894,10 +1896,16 @@ private void computeClassDisplay(int typeID) { private void computeClassDisplay(int[] parent, int typeID) { assert classDisplay == null; + assert Arrays.stream(parent).noneMatch(id -> id == typeID) : Assertions.errorMessage("Redundant entry in class display", Arrays.toString(parent), typeID); classDisplay = new int[parent.length + 1]; System.arraycopy(parent, 0, classDisplay, 0, parent.length); classDisplay[parent.length] = typeID; } + + private void copyClassDisplay(int[] display) { + assert classDisplay == null; + classDisplay = display; + } } public void calculateOpenTypeWorldTypeMetadata() { @@ -1937,11 +1945,7 @@ public void calculateOpenTypeWorldTypeMetadata() { dimension--; displayType = objectType.getArrayClass(dimension); } - if (displayType.getArrayDimension() == 0) { - info.computeClassDisplay(displayType.getTypeID()); - } else { - info.computeClassDisplay(getTypeInfo.apply(displayType, false).classDisplay, displayType.getTypeID()); - } + info.copyClassDisplay(getTypeInfo.apply(displayType, false).classDisplay); } if (isInterface(type)) { @@ -1997,9 +2001,10 @@ static String printTypeInfo(HostedType type) { static boolean compareTypeIDResults(List types) { if (!SubstrateOptions.DisableTypeIdResultVerification.getValue()) { + List nonBaseLayerTypes = types.stream().filter(t -> !(t.getWrapped().getWrapped() instanceof BaseLayerType)).toList(); Set mismatchedTypes = ConcurrentHashMap.newKeySet(); - types.parallelStream().forEach(superType -> { - for (HostedType checkedType : types) { + nonBaseLayerTypes.parallelStream().forEach(superType -> { + for (HostedType checkedType : nonBaseLayerTypes) { boolean hostedCheck = superType.isAssignableFrom(checkedType); boolean runtimeCheck = runtimeIsAssignableFrom(superType, checkedType); boolean checksMatch = hostedCheck == runtimeCheck;