diff --git a/ast/JaddCodeGen.jrag b/ast/JaddCodeGen.jrag index 8e6dde1babba57a691b0b6b8b0287eb200008ceb..7501a79acb51220eb6c12d909c2b3c138c831c08 100644 --- a/ast/JaddCodeGen.jrag +++ b/ast/JaddCodeGen.jrag @@ -693,6 +693,9 @@ aspect JaddCodeGen { stream.println(ind(5) + "that.setChild(node, i);"); stream.println(ind(4) + "oldNode.in$Circle(false);"); stream.println(ind(4) + "rewriteState = that.state().pop();"); + // ES_2011-09-30: Code generation for incremental evaluation, rewrites + if (ASTNode.incremental) jjtGenIncrementalTrackRewrite3(stream); + // stream.println(ind(3) + "} while(rewriteState == ASTNode$State.REWRITE_CHANGE);"); stream.println(ind(3) + "if(rewriteState == ASTNode$State.REWRITE_NOCHANGE && that.is$Final()) {"); if(ASTNode.stagedRewrites) @@ -990,6 +993,7 @@ aspect JaddCodeGen { public void ASTDecl.jjtGenIncrementalTrackRewrite1(PrintWriter stream) { stream.println(ind(2) + "if(that.init_children == null) {"); stream.println(ind(3) + "that.init_children = new ASTNode[that.children.length];"); + stream.println(ind(3) + "that.rewritten_children = new boolean[that.children.length];"); stream.println(ind(2) + "}"); stream.println(ind(2) + "if(that.init_children[i] == null) {"); stream.println(ind(3) + "that.init_children[i] = node.fullCopy();"); @@ -1004,6 +1008,12 @@ aspect JaddCodeGen { //stream.println(ind(2) + "that.children[i] = node;"); //stream.println(ind(2) + "that.children[i].setParent(that);"); } + // ES_2011-09-30: Code generation for incremental evaluation, tracking rewrites + public void ASTDecl.jjtGenIncrementalTrackRewrite3(PrintWriter stream) { + stream.println(ind(4) + "if (rewriteState == ASTNode$State.REWRITE_CHANGE) {"); + stream.println(ind(5) + "that.rewritten_children[i] = true;"); + stream.println(ind(4) + "}"); + } // ES_2011-09-20: Code generation for incremental evaluation, tracking getChild @@ -1064,6 +1074,9 @@ aspect JaddCodeGen { stream.println(ind(3) + "ASTNode d[] = new ASTNode[i << 1];"); stream.println(ind(3) + "System.arraycopy(init_children, 0, d, 0, init_children.length);"); stream.println(ind(3) + "init_children = d;"); + stream.println(ind(3) + "boolean[] b = new boolean[i << 1];"); + stream.println(ind(3) + "System.arraycopy(rewritten_children, 0, b, 0, rewritten_children.length);"); + stream.println(ind(3) + "rewritten_children = b;"); stream.println(ind(2) + "}"); // stream.println(ind(2) + "if (getChild_handler != null) {"); @@ -1130,6 +1143,13 @@ aspect JaddCodeGen { stream.println(ind(4) + "System.arraycopy(init_children, i, d, i+1, init_children.length);"); stream.println(ind(3) + "}"); stream.println(ind(3) + "init_children = d;"); + stream.println(ind(3) + "boolean b[] = new boolean[i << 1];"); + stream.println(ind(3) + "System.arraycopy(rewritten_children, 0, b, 0, rewritten_children.length);"); + stream.println(ind(3) + "if (i < rewritten_children.length) {"); + stream.println(ind(4) + "System.arraycopy(rewritten_children, i, b, i+1, rewritten_children.length);"); + stream.println(ind(3) + "}"); + stream.println(ind(3) + "rewritten_children = b;"); + stream.println(ind(2) + "}"); // stream.println(ind(2) + "if (getChild_handler != null) {"); @@ -1171,6 +1191,7 @@ aspect JaddCodeGen { stream.println(ind(3) + "if (init_children != null) {"); stream.println(ind(4) + "init_children[i] = null;"); stream.println(ind(4) + "System.arraycopy(init_children, i+1, init_children, i, init_children.length-i-1);"); + stream.println(ind(4) + "System.arraycopy(rewritten_children, i+1, rewritten_children, i, rewritten_children.length-i-1);"); stream.println(ind(3) + "}"); // stream.println(ind(3) + "if (getChild_handler != null) {"); @@ -1771,6 +1792,7 @@ aspect JaddCodeGen { // rewrite code if (name().equals("ASTNode")) { stream.println(ind + "protected ASTNode[] ASTNode.init_children;"); + stream.println(ind + "protected boolean[] ASTNode.rewritten_children;"); } // @@ -1911,9 +1933,10 @@ aspect JaddCodeGen { if (name().equals("ASTNode")) { stream.println(" if (attrID.equals(\"getChild\")) {"); stream.println(" int i = (Integer)_parameters;"); - stream.println(" if (init_children != null && init_children[i] != null) {"); + stream.println(" if (rewritten_children != null && rewritten_children[i]) {"); stream.println(" getChild(i).notifyForRemove();"); stream.println(" children[i] = init_children[i];"); + stream.println(" rewritten_children[i] = false;"); stream.println(" init_children[i] = null;"); stream.println(" }"); stream.println(" }"); @@ -2193,8 +2216,8 @@ aspect JaddCodeGen { stream.println(" public void " + name() + ".dumpCachedValues() {"); if (name().equals("ASTNode")) { // rewrite code - stream.println(" for (int k = 0; init_children != null && k < init_children.length; k++) {"); - stream.println(" if (init_children[k] != null) {"); + stream.println(" for (int k = 0; rewritten_children != null && k < rewritten_children.length; k++) {"); + stream.println(" if (rewritten_children[k]) {"); stream.println(" System.out.println(getChildNoTransform(k).relativeNodeID() + " + "\" rewritten from \" + init_children[k].relativeNodeID());"); stream.println(" }"); diff --git a/test/Test120.result b/test/Test120.result index bad19d3903493d3f9a9305987666a7d6162bef8a..4c68a25c8f4df28452b029c307c1c7f15314db10 100644 --- a/test/Test120.result +++ b/test/Test120.result @@ -1,14 +1,14 @@ Dependencies: dep(A:a1 -> A:getName) dep(A:b2 -> A:getName) -dep(A:b3 -> A:getName) -dep(A:b6 -> A:getName) -dep(A:c4 -> A:getName) -dep(A:c5 -> A:getName) dep(A:a3 -> A:b3) +dep(A:b3 -> A:getName) dep(A:a4 -> A:c4) +dep(A:c4 -> A:getName) dep(A:b5 -> A:c5) +dep(A:c5 -> A:getName) dep(A:a6 -> A:b6) +dep(A:b6 -> A:getName) dep(A:a7 -> A:b7_2) dep(A:a7 -> A:c7_1) dep(A:a8 -> A:c8_1) diff --git a/test/Test121.result b/test/Test121.result index 30e865b6f736a2b77ec02a6e5d765650a58dd11f..b2f29da56f42e8ea5df1574ab3fe6d47d4d0283c 100644 --- a/test/Test121.result +++ b/test/Test121.result @@ -1,8 +1,8 @@ Dependencies: -dep(A:c_String[a] -> A:getName) -dep(A:c_String[b] -> A:getName) -dep(A:a1 -> A:c_String[b]) dep(A:a0 -> A:c_String[a]) +dep(A:a1 -> A:c_String[b]) +dep(A:c_String[b] -> A:getName) +dep(A:c_String[a] -> A:getName) Cached values: value(A:a0, false) value(A:a1, true) diff --git a/test/Test122.result b/test/Test122.result index df0f00c5ae5368cde15b4d11ec9c4e1ec51c00c7..280d6f4fe837781bb74d71cd42de78d369618bcb 100644 --- a/test/Test122.result +++ b/test/Test122.result @@ -1,31 +1,38 @@ Dependencies after b1.decl: -dep(A/List[0]/B[0]:decl -> A:getChild[0]) -dep(A/List[0]/B[0]:decl -> A/List[0]:getParent) -dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[0]) -dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[1]) +dep(A:getChild[0] -> A/List[0]:getChild[0]) +dep(A:getChild[0] -> A/List[0]:getChild[1]) dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getName) -dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getUse) dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getParent) +dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getUse) dep(A/List[0]/B[0]:decl -> A/List[0]/B[1]:getName) +dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[0]) +dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[1]) +dep(A/List[0]/B[0]:decl -> A/List[0]:getParent) +dep(A/List[0]/B[0]:decl -> A:getChild[0]) Cached values after b1.decl: +A/List[0] rewritten from A/List value(A/List[0]/B[0]:decl, A/List[0]/B[1]) Dependencies after b2.decl: -dep(A/List[0]/B[0]:decl -> A:getChild[0]) -dep(A/List[0]/B[1]:decl -> A:getChild[0]) -dep(A/List[0]/B[0]:decl -> A/List[0]:getParent) -dep(A/List[0]/B[1]:decl -> A/List[0]:getParent) -dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[0]) -dep(A/List[0]/B[1]:decl -> A/List[0]:getChild[0]) -dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[1]) -dep(A/List[0]/B[1]:decl -> A/List[0]:getChild[1]) +dep(A:getChild[0] -> A/List[0]:getChild[0]) +dep(A:getChild[0] -> A/List[0]:getChild[1]) dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getName) -dep(A/List[0]/B[1]:decl -> A/List[0]/B[0]:getName) -dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getUse) dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getParent) +dep(A/List[0]/B[0]:decl -> A/List[0]/B[0]:getUse) dep(A/List[0]/B[0]:decl -> A/List[0]/B[1]:getName) -dep(A/List[0]/B[1]:decl -> A/List[0]/B[1]:getUse) +dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[0]) +dep(A/List[0]/B[0]:decl -> A/List[0]:getChild[1]) +dep(A/List[0]/B[0]:decl -> A/List[0]:getParent) +dep(A/List[0]/B[0]:decl -> A:getChild[0]) +dep(A/List[0]/B[1]:decl -> A/List[0]/B[0]:getName) dep(A/List[0]/B[1]:decl -> A/List[0]/B[1]:getParent) +dep(A/List[0]/B[1]:decl -> A/List[0]/B[1]:getUse) +dep(A/List[0]/B[1]:decl -> A/List[0]:getChild[0]) +dep(A/List[0]/B[1]:decl -> A/List[0]:getChild[1]) +dep(A/List[0]/B[1]:decl -> A/List[0]:getParent) +dep(A/List[0]/B[1]:decl -> A:getChild[0]) Cached values after b2.decl: +A/List[0] rewritten from A/List value(A/List[0]/B[0]:decl, A/List[0]/B[1]) value(A/List[0]/B[1]:decl, A/List[0]/B[0]) + diff --git a/test/Test123.java b/test/Test123.java index caf6e53da28e856cba5a134c008320db7d1e8d03..3c38886f6893845fd637d3c23da01304bf4021c7 100644 --- a/test/Test123.java +++ b/test/Test123.java @@ -8,14 +8,12 @@ public class Test123 { B b1 = new B("b", "a"); B b2 = new B("a", "b"); - A a = new A(new test.ast.List().add(b1).add(b2)); - b1 = a.getB(0); b2 = a.getB(1); - b1.decl(); + System.out.println("Dependencies after b1.decl:"); a.dumpDependencies(); a.getChild(0).dumpDependencies(); @@ -27,8 +25,8 @@ public class Test123 { b1.dumpCachedValues(); b2.dumpCachedValues(); - b2.setName("c"); + System.out.println("Dependencies after b2.setName:"); a.dumpDependencies(); a.getChild(0).dumpDependencies(); diff --git a/test/shouldpass b/test/shouldpass index 550a293c9447f90f46343410d653c7e6ff8f9c78..c4595d8bbfa8100eb6a28a813f31bd3f9fb28fdb 100644 --- a/test/shouldpass +++ b/test/shouldpass @@ -78,3 +78,4 @@ test/Test124.java passed test/Test125.java passed test/Test126.java passed test/Test127.java passed +test/Test128.java passed