Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ public class LayeredStaticFieldSupport extends LayeredClassInitialization implem
final Set<Object> appLayerFields;

final Map<AnalysisField, LayerAssignmentStatus> assignmentStatusMap;
final Map<AnalysisField, Integer> priorInstalledLayerNum;
final Map<AnalysisField, Integer> priorInstalledLocation;
final Map<AnalysisField, Integer> priorInstalledLayerMap;
final Map<AnalysisField, Integer> priorInstalledLocationMap;

public static final String appLayerPrimitiveStaticFieldsBaseName = "APPLAYER_PRIMITIVE_STATICFIELDSBASE";
public static final String appLayerObjectStaticFieldsBaseName = "APPLAYER_OBJECT_STATICFIELDSBASE";
Expand All @@ -107,8 +107,8 @@ private LayeredStaticFieldSupport(Set<Object> appLayerFields, UniverseBuilder.St
this.appLayerFields = appLayerFields;
assignmentStatusMap = new ConcurrentHashMap<>();
inAppLayer = ImageLayerBuildingSupport.buildingApplicationLayer();
priorInstalledLayerNum = inAppLayer ? new ConcurrentHashMap<>() : null;
priorInstalledLocation = inAppLayer ? new ConcurrentHashMap<>() : null;
priorInstalledLayerMap = inAppLayer ? new ConcurrentHashMap<>() : null;
priorInstalledLocationMap = inAppLayer ? new ConcurrentHashMap<>() : null;
this.appLayerStaticFieldOffsets = appLayerStaticFieldOffsets;
}

Expand Down Expand Up @@ -150,13 +150,16 @@ private static AnalysisField getAnalysisField(Object obj) {
}
}

public void initializeFromFieldData(AnalysisField aField, SharedLayerSnapshotCapnProtoSchemaHolder.PersistedAnalysisField.Reader fieldData) {
Object previous = priorInstalledLayerNum.put(aField, fieldData.getPriorInstalledLayerNum());
assert previous == null : previous;
previous = assignmentStatusMap.put(aField, LayerAssignmentStatus.values()[fieldData.getAssignmentStatus()]);
assert previous == null : previous;
previous = priorInstalledLocation.put(aField, fieldData.getLocation());
assert previous == null : previous;
public void ensureInitializedFromFieldData(AnalysisField aField, SharedLayerSnapshotCapnProtoSchemaHolder.PersistedAnalysisField.Reader fieldData) {
Integer priorInstalledLayerNum = fieldData.getPriorInstalledLayerNum();
Object result = priorInstalledLayerMap.computeIfAbsent(aField, f -> priorInstalledLayerNum);
assert priorInstalledLayerNum.equals(result) : result;
LayerAssignmentStatus assignmentStatus = LayerAssignmentStatus.values()[fieldData.getAssignmentStatus()];
result = assignmentStatusMap.computeIfAbsent(aField, f -> assignmentStatus);
assert assignmentStatus.equals(result);
Integer priorInstalledLocation = fieldData.getLocation();
result = priorInstalledLocationMap.computeIfAbsent(aField, f -> priorInstalledLocation);
assert priorInstalledLocation.equals(result);
}

private void installFieldInAppLayer(Field field, MetaAccessProvider meta) {
Expand Down Expand Up @@ -216,7 +219,7 @@ public LayerAssignmentStatus getAssignmentStatus(AnalysisField analysisField) {
if (!(inAppLayer && analysisField.isInBaseLayer())) {
return LayerAssignmentStatus.UNDECIDED;
}
throw VMError.shouldNotReachHere("base layer types should have already been initialized");
throw VMError.shouldNotReachHere(String.format("Base analysis field assignment status queried before it is initialized: %s", analysisField));
});
}

Expand All @@ -225,8 +228,8 @@ public int getPriorInstalledLayerNum(AnalysisField analysisField) {
return MultiLayeredImageSingleton.LAYER_NUM_UNINSTALLED;
}

assert priorInstalledLayerNum.containsKey(analysisField);
return priorInstalledLayerNum.get(analysisField);
assert priorInstalledLayerMap.containsKey(analysisField);
return priorInstalledLayerMap.get(analysisField);
}

public boolean preventConstantFolding(AnalysisField aField) {
Expand Down Expand Up @@ -265,13 +268,13 @@ public void reinitializeKnownFields(List<HostedField> staticFields) {
LayerAssignmentStatus state = getAssignmentStatus(aField);
if (state == LayerAssignmentStatus.PRIOR_LAYER) {
int layerNum = getPriorInstalledLayerNum(aField);
assert priorInstalledLocation.containsKey(aField);
int location = priorInstalledLocation.get(aField);
assert priorInstalledLocationMap.containsKey(aField);
int location = priorInstalledLocationMap.get(aField);
hField.setLocation(location, layerNum);
} else if (state == LayerAssignmentStatus.APP_LAYER_DEFERRED) {
assert inAppLayer;
assert priorInstalledLocation.containsKey(aField);
int location = priorInstalledLocation.get(aField);
assert priorInstalledLocationMap.containsKey(aField);
int location = priorInstalledLocationMap.get(aField);
hField.setLocation(location, currentLayerNum);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1141,15 +1141,17 @@ private int getBaseLayerFieldId(AnalysisField analysisField) {
@Override
public void addBaseLayerField(AnalysisField analysisField) {
fields.putIfAbsent(analysisField.getId(), analysisField);
if (analysisField.isStatic()) {
PersistedAnalysisField.Reader fieldData = getFieldData(analysisField);
assert fieldData != null : "The field should be in the base layer";
layeredStaticFieldSupport.ensureInitializedFromFieldData(analysisField, fieldData);
}
}

@Override
public void initializeBaseLayerField(AnalysisField analysisField) {
PersistedAnalysisField.Reader fieldData = getFieldData(analysisField);
assert fieldData != null : "The field should be in the base layer";
if (analysisField.isStatic()) {
layeredStaticFieldSupport.initializeFromFieldData(analysisField, fieldData);
}

boolean isAccessed = fieldData.getIsAccessed();
boolean isRead = fieldData.getIsRead();
Expand Down
Loading