fix ClassInference for arrays

This commit is contained in:
Alexey Andreev 2021-08-30 17:52:59 +03:00
parent c65a9e1c97
commit c2f90d3cfc

View File

@ -71,6 +71,7 @@ public class ClassInference {
private ClassHierarchy hierarchy; private ClassHierarchy hierarchy;
private SubclassListProvider subclassListProvider; private SubclassListProvider subclassListProvider;
private Graph assignmentGraph; private Graph assignmentGraph;
private Graph arrayDataAssignmentGraph;
private Graph cloneGraph; private Graph cloneGraph;
private Graph arrayGraph; private Graph arrayGraph;
private Graph itemGraph; private Graph itemGraph;
@ -218,6 +219,17 @@ public class ClassInference {
casts = visitor.casts.toArray(new ValueCast[0]); casts = visitor.casts.toArray(new ValueCast[0]);
exceptions = visitor.exceptions.getAll(); exceptions = visitor.exceptions.getAll();
virtualCallSites = visitor.virtualCallSites.toArray(new VirtualCallSite[0]); virtualCallSites = visitor.virtualCallSites.toArray(new VirtualCallSite[0]);
GraphBuilder arrayAssignmentGraphBuilder = new GraphBuilder(assignmentGraph.size());
for (int i = 0; i < assignmentGraph.size(); ++i) {
for (int j : assignmentGraph.outgoingEdges(i)) {
arrayAssignmentGraphBuilder.addEdge(i, j);
}
}
for (ValueCast cast : casts) {
arrayAssignmentGraphBuilder.addEdge(cast.fromVariable, cast.toVariable);
}
arrayDataAssignmentGraph = arrayAssignmentGraphBuilder.build();
} }
private void buildPropagationGraph() { private void buildPropagationGraph() {
@ -259,7 +271,7 @@ public class ClassInference {
} }
if (degree > 0) { if (degree > 0) {
for (int predecessor : assignmentGraph.incomingEdges(variable)) { for (int predecessor : arrayDataAssignmentGraph.incomingEdges(variable)) {
int predecessorEntry = packNodeAndDegree(predecessor, degree); int predecessorEntry = packNodeAndDegree(predecessor, degree);
graphBuilder.addEdge(predecessorEntry, entry); graphBuilder.addEdge(predecessorEntry, entry);
graphBuilder.addEdge(entry, predecessorEntry); graphBuilder.addEdge(entry, predecessorEntry);
@ -280,8 +292,13 @@ public class ClassInference {
} }
} }
for (int successor : assignmentGraph.outgoingEdges(variable)) { for (int successor : arrayDataAssignmentGraph.outgoingEdges(variable)) {
graphBuilder.addEdge(packNodeAndDegree(successor, degree), entry); int successorEntry = packNodeAndDegree(successor, degree);
graphBuilder.addEdge(successorEntry, entry);
graphBuilder.addEdge(entry, successorEntry);
if (!visited[successorEntry]) {
stack.push(successorEntry);
}
} }
} }