Fixes array item propagation

This commit is contained in:
konsoletyper 2014-02-14 16:42:45 +04:00
parent d310409db3
commit f085dbb607
2 changed files with 25 additions and 3 deletions

View File

@ -30,6 +30,18 @@ public class JavaScriptBodyDependency implements DependencyListener {
public void started(DependencyChecker dependencyChecker) {
allClassesNode = dependencyChecker.createNode();
allClassesNode.setTag("JavaScriptBody:global");
allClassesNode.getArrayItem().addConsumer(new OneDirectionalConnection(allClassesNode));
allClassesNode.getArrayItem().getArrayItem().addConsumer(new OneDirectionalConnection(allClassesNode));
}
private static class OneDirectionalConnection implements DependencyConsumer {
private DependencyNode target;
public OneDirectionalConnection( DependencyNode target) {
this.target = target;
}
@Override public void consume(String type) {
target.propagate(type);
}
}
@Override
@ -47,12 +59,15 @@ public class JavaScriptBodyDependency implements DependencyListener {
MethodGraph graph = dependencyChecker.attachMethodGraph(methodRef);
if (graph.getResult() != null) {
allClassesNode.connect(graph.getResult());
allClassesNode.addConsumer(new OneDirectionalConnection(graph.getResult().getArrayItem()));
allClassesNode.addConsumer(new OneDirectionalConnection(graph.getResult().getArrayItem()
.getArrayItem()));
}
for (int i = 0; i < graph.getParameterCount(); ++i) {
graph.getVariable(i).connect(allClassesNode);
allClassesNode.getArrayItem().connect(graph.getVariable(i).getArrayItem());
allClassesNode.getArrayItem().getArrayItem().connect(graph.getVariable(i)
.getArrayItem().getArrayItem());
allClassesNode.addConsumer(new OneDirectionalConnection(graph.getVariable(i).getArrayItem()));
allClassesNode.addConsumer(new OneDirectionalConnection(graph.getVariable(i).getArrayItem()
.getArrayItem()));
}
if (javacall != null && javacall.getBoolean()) {
String body = annot.getValue("body").getString();

View File

@ -44,6 +44,13 @@ public class JavaScriptBodyTests {
@Test
public void dependencyPropagatedThroughArray() {
storeObject(new Object[] { new AImpl() });
A[] array = (A[])retrieveObject();
assertEquals(23, array[0].foo());
}
@Test
public void dependencyPropagatedBackThroughArray() {
A[] first = new A[1];
storeObject(first);
Object[] second = (Object[])retrieveObject();