Skip to content

Commit bad5414

Browse files
committed
[GR-49858] [GR-60710] In DynamicHub, use byte for hubType and short for open-world type information.
PullRequest: graal/19747
2 parents 3093afc + 13dd5b8 commit bad5414

File tree

2 files changed

+25
-22
lines changed
  • substratevm/src

2 files changed

+25
-22
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@
4040
import static com.oracle.svm.core.code.RuntimeMetadataDecoderImpl.ALL_RECORD_COMPONENTS_FLAG;
4141
import static com.oracle.svm.core.code.RuntimeMetadataDecoderImpl.ALL_SIGNERS_FLAG;
4242
import static com.oracle.svm.core.code.RuntimeMetadataDecoderImpl.CLASS_ACCESS_FLAGS_MASK;
43-
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeObject;
44-
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeInt;
43+
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeByte;
4544
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeChar;
45+
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeInt;
46+
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeObject;
4647
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeShort;
47-
import static com.oracle.svm.core.graal.meta.DynamicHubOffsets.writeByte;
4848
import static com.oracle.svm.core.reflect.RuntimeMetadataDecoder.NO_DATA;
4949

5050
import java.io.InputStream;
@@ -184,7 +184,7 @@ public final class DynamicHub implements AnnotatedElement, java.lang.reflect.Typ
184184
* The returned category does not necessarily match the {@link LayoutEncoding}, see
185185
* {@link Hybrid} objects for more details.
186186
*/
187-
private final int hubType;
187+
private final byte hubType;
188188

189189
/**
190190
* Used to quickly determine if this class is a subclass of {@link Reference}.
@@ -239,17 +239,20 @@ public final class DynamicHub implements AnnotatedElement, java.lang.reflect.Typ
239239
// region open-world only fields
240240

241241
/**
242-
* This stores the depth of the type in the inheritance hierarchy. If the type is an interface
243-
* then the typeIDDepth is -1.
242+
* This stores the depth of the type in the inheritance hierarchy. If the type is an interface,
243+
* then the value is negative.
244+
*
245+
* Could be adapted so that {@link #getNumClassTypes()} can compute its value from this field,
246+
* at the cost of increased size of type checks in code.
244247
*/
245248
@UnknownPrimitiveField(availability = AfterHostedUniverse.class)//
246-
private int typeIDDepth;
249+
private short typeIDDepth;
247250

248251
@UnknownPrimitiveField(availability = AfterHostedUniverse.class)//
249-
private int numClassTypes;
252+
private short numClassTypes;
250253

251254
@UnknownPrimitiveField(availability = AfterHostedUniverse.class)//
252-
private int numInterfaceTypes;
255+
private short numInterfaceTypes;
253256

254257
/**
255258
* Array containing this type's type check id information. During a type check, these slots are
@@ -452,7 +455,7 @@ public final class DynamicHub implements AnnotatedElement, java.lang.reflect.Typ
452455
private ReflectionMetadata reflectionMetadata;
453456

454457
@Platforms(Platform.HOSTED_ONLY.class)
455-
public DynamicHub(Class<?> hostedJavaClass, String name, int hubType, ReferenceType referenceType, DynamicHub superType,
458+
public DynamicHub(Class<?> hostedJavaClass, String name, byte hubType, ReferenceType referenceType, DynamicHub superType,
456459
DynamicHub componentHub, String sourceFileName, int modifiers, short flags, ClassLoader classLoader,
457460
Class<?> nestHost, String simpleBinaryName, Object declaringClass, String signature, int layerId) {
458461
this.hostedJavaClass = hostedJavaClass;
@@ -500,7 +503,7 @@ public static DynamicHub allocate(String name, DynamicHub superHub, DynamicHub c
500503

501504
ReferenceType referenceType = ReferenceType.computeReferenceType(DynamicHub.toClass(superHub));
502505
// GR-59683: HubType.OBJECT_ARRAY?
503-
int hubTybe = referenceType == ReferenceType.None ? HubType.INSTANCE : HubType.REFERENCE_INSTANCE;
506+
byte hubType = (byte) ((referenceType == ReferenceType.None) ? HubType.INSTANCE : HubType.REFERENCE_INSTANCE);
504507

505508
DynamicHubCompanion companion = new DynamicHubCompanion(classLoader);
506509
/* Always allow unsafe allocation for classes that were loaded at run-time. */
@@ -517,9 +520,9 @@ public static DynamicHub allocate(String name, DynamicHub superHub, DynamicHub c
517520

518521
// GR-59687: Determine typecheck related infos
519522
int typeID = 0;
520-
int typeIDDepth = 0;
521-
int numClassTypes = 2;
522-
int numInterfacesTypes = 0;
523+
short typeIDDepth = 0;
524+
short numClassTypes = 2;
525+
short numInterfacesTypes = 0;
523526
int[] openTypeWorldTypeCheckSlots = new int[numClassTypes + (numInterfacesTypes * 2)];
524527

525528
byte additionalFlags = NumUtil.safeToUByte(makeFlag(IS_INSTANTIATED_BIT, true));
@@ -552,17 +555,17 @@ public static DynamicHub allocate(String name, DynamicHub superHub, DynamicHub c
552555
DynamicHubOffsets dynamicHubOffsets = DynamicHubOffsets.singleton();
553556
/* Write fields in defining order. */
554557
writeObject(hub, dynamicHubOffsets.getNameOffset(), name);
555-
writeInt(hub, dynamicHubOffsets.getHubTypeOffset(), hubTybe);
558+
writeByte(hub, dynamicHubOffsets.getHubTypeOffset(), hubType);
556559
writeByte(hub, dynamicHubOffsets.getReferenceTypeOffset(), referenceType.getValue());
557560

558561
writeInt(hub, dynamicHubOffsets.getLayoutEncodingOffset(), layoutEncoding);
559562
writeInt(hub, dynamicHubOffsets.getTypeIDOffset(), typeID);
560563
// skip typeCheckStart, typeCheckRange, typeCheckSlot and
561564
// closedTypeWorldTypeCheckSlots (closed-world only)
562-
writeInt(hub, dynamicHubOffsets.getTypeIDDepthOffset(), typeIDDepth);
563-
writeInt(hub, dynamicHubOffsets.getNumClassTypesOffset(), numClassTypes);
565+
writeShort(hub, dynamicHubOffsets.getTypeIDDepthOffset(), typeIDDepth);
566+
writeShort(hub, dynamicHubOffsets.getNumClassTypesOffset(), numClassTypes);
564567

565-
writeInt(hub, dynamicHubOffsets.getNumInterfaceTypesOffset(), numInterfacesTypes);
568+
writeShort(hub, dynamicHubOffsets.getNumInterfaceTypesOffset(), numInterfacesTypes);
566569
writeObject(hub, dynamicHubOffsets.getOpenTypeWorldTypeCheckSlotsOffset(), openTypeWorldTypeCheckSlots);
567570

568571
writeChar(hub, dynamicHubOffsets.getMonitorOffsetOffset(), monitorOffset);
@@ -677,9 +680,9 @@ public void setOpenTypeWorldData(CFunctionPointer[] vtable, int typeID,
677680
assert this.vtable == null : "Initialization must be called only once";
678681

679682
this.typeID = typeID;
680-
this.typeIDDepth = typeCheckDepth;
681-
this.numClassTypes = numClassTypes;
682-
this.numInterfaceTypes = numInterfaceTypes;
683+
this.typeIDDepth = NumUtil.safeToShortAE(typeCheckDepth);
684+
this.numClassTypes = NumUtil.safeToShortAE(numClassTypes);
685+
this.numInterfaceTypes = NumUtil.safeToShortAE(numInterfaceTypes);
683686
this.openTypeWorldTypeCheckSlots = typeCheckSlots;
684687
this.vtable = vtable;
685688
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ public ClassInitializationSupport getClassInitializationSupport() {
610610
return classInitializationSupport;
611611
}
612612

613-
private static int computeHubType(AnalysisType type) {
613+
private static byte computeHubType(AnalysisType type) {
614614
if (type.isArray()) {
615615
if (type.getComponentType().isPrimitive() || type.getComponentType().isWordType()) {
616616
return HubType.PRIMITIVE_ARRAY;

0 commit comments

Comments
 (0)