Skip to content

Commit b79445b

Browse files
committed
[GR-25050] Code refactoring for heap scanning.
PullRequest: graal/10756
2 parents 3f97c49 + fa7be61 commit b79445b

File tree

22 files changed

+536
-280
lines changed

22 files changed

+536
-280
lines changed

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/AnalysisObjectScanningObserver.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
package com.oracle.graal.pointsto;
2626

27+
import com.oracle.graal.pointsto.ObjectScanner.ScanReason;
2728
import com.oracle.graal.pointsto.flow.ArrayElementsTypeFlow;
2829
import com.oracle.graal.pointsto.flow.FieldTypeFlow;
2930
import com.oracle.graal.pointsto.flow.context.object.AnalysisObject;
@@ -42,35 +43,37 @@ public AnalysisObjectScanningObserver(BigBang bb) {
4243
}
4344

4445
@Override
45-
public void forRelocatedPointerFieldValue(JavaConstant receiver, AnalysisField field, JavaConstant fieldValue) {
46+
public boolean forRelocatedPointerFieldValue(JavaConstant receiver, AnalysisField field, JavaConstant fieldValue, ScanReason reason) {
4647
if (!field.isWritten()) {
47-
field.registerAsWritten(null);
48+
return field.registerAsWritten(null);
4849
}
50+
return false;
4951
}
5052

5153
@Override
52-
public void forNullFieldValue(JavaConstant receiver, AnalysisField field) {
54+
public boolean forNullFieldValue(JavaConstant receiver, AnalysisField field, ScanReason reason) {
5355
FieldTypeFlow fieldTypeFlow = getFieldTypeFlow(field, receiver);
5456
if (!fieldTypeFlow.getState().canBeNull()) {
5557
/* Signal that the field can contain null. */
56-
fieldTypeFlow.addState(getAnalysis(), TypeState.forNull());
58+
return fieldTypeFlow.addState(getAnalysis(), TypeState.forNull());
5759
}
60+
return false;
5861
}
5962

6063
@Override
61-
public void forNonNullFieldValue(JavaConstant receiver, AnalysisField field, JavaConstant fieldValue) {
64+
public boolean forNonNullFieldValue(JavaConstant receiver, AnalysisField field, JavaConstant fieldValue, ScanReason reason) {
6265
PointsToAnalysis analysis = getAnalysis();
6366
AnalysisType fieldType = analysis.getMetaAccess().lookupJavaType(analysis.getSnippetReflectionProvider().asObject(Object.class, fieldValue).getClass());
64-
assert fieldType.isInstantiated() : fieldType;
6567

6668
/* Add the constant value object to the field's type flow. */
6769
FieldTypeFlow fieldTypeFlow = getFieldTypeFlow(field, receiver);
6870
AnalysisObject constantObject = bb.analysisPolicy().createConstantObject(analysis, fieldValue, fieldType);
6971
if (!fieldTypeFlow.getState().containsObject(constantObject)) {
7072
/* Add the new constant to the field's flow state. */
7173
TypeState constantTypeState = TypeState.forNonNullObject(analysis, constantObject);
72-
fieldTypeFlow.addState(analysis, constantTypeState);
74+
return fieldTypeFlow.addState(analysis, constantTypeState);
7375
}
76+
return false;
7477
}
7578

7679
/**
@@ -94,25 +97,26 @@ private FieldTypeFlow getFieldTypeFlow(AnalysisField field, JavaConstant receive
9497
}
9598

9699
@Override
97-
public void forNullArrayElement(JavaConstant array, AnalysisType arrayType, int elementIndex) {
100+
public boolean forNullArrayElement(JavaConstant array, AnalysisType arrayType, int elementIndex, ScanReason reason) {
98101
ArrayElementsTypeFlow arrayObjElementsFlow = getArrayElementsFlow(array, arrayType);
99102
if (!arrayObjElementsFlow.getState().canBeNull()) {
100103
/* Signal that the constant array can contain null. */
101-
arrayObjElementsFlow.addState(getAnalysis(), TypeState.forNull());
104+
return arrayObjElementsFlow.addState(getAnalysis(), TypeState.forNull());
102105
}
106+
return false;
103107
}
104108

105109
@Override
106-
public void forNonNullArrayElement(JavaConstant array, AnalysisType arrayType, JavaConstant elementConstant, AnalysisType elementType, int elementIndex) {
107-
assert elementType.isInstantiated() : elementType;
110+
public boolean forNonNullArrayElement(JavaConstant array, AnalysisType arrayType, JavaConstant elementConstant, AnalysisType elementType, int elementIndex, ScanReason reason) {
108111
ArrayElementsTypeFlow arrayObjElementsFlow = getArrayElementsFlow(array, arrayType);
109112
PointsToAnalysis analysis = getAnalysis();
110113
AnalysisObject constantObject = bb.analysisPolicy().createConstantObject(analysis, elementConstant, elementType);
111114
if (!arrayObjElementsFlow.getState().containsObject(constantObject)) {
112115
/* Add the constant element to the constant's array type flow. */
113116
TypeState elementTypeState = TypeState.forNonNullObject(analysis, constantObject);
114-
arrayObjElementsFlow.addState(analysis, elementTypeState);
117+
return arrayObjElementsFlow.addState(analysis, elementTypeState);
115118
}
119+
return false;
116120
}
117121

118122
/**
@@ -125,7 +129,7 @@ private ArrayElementsTypeFlow getArrayElementsFlow(JavaConstant array, AnalysisT
125129
}
126130

127131
@Override
128-
public void forScannedConstant(JavaConstant value, ObjectScanner.ScanReason reason) {
132+
public void forScannedConstant(JavaConstant value, ScanReason reason) {
129133
PointsToAnalysis analysis = getAnalysis();
130134
Object valueObj = analysis.getSnippetReflectionProvider().asObject(Object.class, value);
131135
AnalysisType type = bb.getMetaAccess().lookupJavaType(valueObj.getClass());

0 commit comments

Comments
 (0)