Mercurial > hg > truffle
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java @ 16909:62cfffca9be2
Truffle-DSL: some more performance optimizations.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Sat, 23 Aug 2014 19:31:18 +0200 |
parents | 23415229349b |
children | 93e061157811 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java Sat Aug 23 19:31:13 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTreeBuilder.java Sat Aug 23 19:31:18 2014 +0200 @@ -33,17 +33,22 @@ public class CodeTreeBuilder { - private final CodeTreeBuilder parent; - private BuilderCodeTree currentElement; private final BuilderCodeTree root; private int treeCount; + private Element enclosingElement; public CodeTreeBuilder(CodeTreeBuilder parent) { - this.root = new BuilderCodeTree(GROUP, null, null); + this.root = new BuilderCodeTree(null, GROUP, null, null); this.currentElement = root; - this.parent = parent; + if (parent != null) { + this.enclosingElement = parent.enclosingElement; + } + } + + public void setEnclosingElement(Element enclosingElement) { + this.enclosingElement = enclosingElement; } @Override @@ -80,24 +85,24 @@ } private CodeTreeBuilder push(CodeTreeKind kind) { - return push(new BuilderCodeTree(kind, null, null)); + return push(new BuilderCodeTree(currentElement, kind, null, null), kind == NEW_LINE); } private CodeTreeBuilder push(String string) { - return push(new BuilderCodeTree(CodeTreeKind.STRING, null, string)); + return push(new BuilderCodeTree(currentElement, CodeTreeKind.STRING, null, string), false); } private CodeTreeBuilder push(TypeMirror type) { - return push(new BuilderCodeTree(CodeTreeKind.TYPE, type, null)); + return push(new BuilderCodeTree(currentElement, CodeTreeKind.TYPE, type, null), false); } private CodeTreeBuilder push(CodeTreeKind kind, TypeMirror type, String string) { - return push(new BuilderCodeTree(kind, type, string)); + return push(new BuilderCodeTree(currentElement, kind, type, string), kind == NEW_LINE); } - private CodeTreeBuilder push(BuilderCodeTree tree) { + private CodeTreeBuilder push(BuilderCodeTree tree, boolean removeLast) { if (currentElement != null) { - if (!removeLastIfEnqueued(tree)) { + if (removeLast && !removeLastIfEnqueued(tree)) { return this; } currentElement.add(tree); @@ -118,7 +123,7 @@ return !clearLastRec(tree.removeLast, currentElement.getEnclosedElements()); } List<CodeTree> childTree = tree.getEnclosedElements(); - if (!childTree.isEmpty()) { + if (childTree != null && !childTree.isEmpty()) { CodeTree last = childTree.get(0); if (last instanceof BuilderCodeTree) { if (!removeLastIfEnqueued((BuilderCodeTree) last)) { @@ -134,9 +139,9 @@ treeCount--; } else { // delay clearing the last - BuilderCodeTree tree = new BuilderCodeTree(REMOVE_LAST, null, null); + BuilderCodeTree tree = new BuilderCodeTree(currentElement, REMOVE_LAST, null, null); tree.removeLast = kind; - push(tree); + push(tree, false); } } @@ -299,11 +304,11 @@ public CodeTreeBuilder tree(CodeTree treeToAdd) { if (treeToAdd instanceof BuilderCodeTree) { - return push((BuilderCodeTree) treeToAdd).end(); + return push((BuilderCodeTree) treeToAdd, true).end(); } else { - BuilderCodeTree tree = new BuilderCodeTree(GROUP, null, null); - tree.add(treeToAdd); - return push(tree).end(); + BuilderCodeTree tree = new BuilderCodeTree(currentElement, GROUP, null, null); + currentElement.add(treeToAdd); + return push(tree, true).end(); } } @@ -364,6 +369,9 @@ } private boolean clearLastRec(CodeTreeKind kind, List<CodeTree> children) { + if (children == null) { + return false; + } for (int i = children.size() - 1; i >= 0; i--) { CodeTree child = children.get(i); if (child.getCodeKind() == kind) { @@ -474,7 +482,7 @@ } private void toParent() { - Element parentElement = currentElement.getEnclosingElement(); + CodeTree parentElement = currentElement.getParent(); if (currentElement != root) { this.currentElement = (BuilderCodeTree) parentElement; } else { @@ -640,15 +648,10 @@ } public ExecutableElement findMethod() { - Element element = currentElement; - while (element != null && (element.getKind() != ElementKind.METHOD && (element.getKind() != ElementKind.CONSTRUCTOR))) { - element = element.getEnclosingElement(); + if (enclosingElement != null && (enclosingElement.getKind() == ElementKind.METHOD || enclosingElement.getKind() == ElementKind.CONSTRUCTOR)) { + return (ExecutableElement) enclosingElement; } - ExecutableElement found = element != null ? (ExecutableElement) element : null; - if (found == null && parent != null) { - found = parent.findMethod(); - } - return found; + return null; } public CodeTreeBuilder returnNull() { @@ -751,8 +754,8 @@ private EndCallback atEndListener; private CodeTreeKind removeLast; - public BuilderCodeTree(CodeTreeKind kind, TypeMirror type, String string) { - super(kind, type, string); + public BuilderCodeTree(CodeTree parent, CodeTreeKind kind, TypeMirror type, String string) { + super(parent, kind, type, string); } public void registerAtEnd(EndCallback atEnd) { @@ -770,7 +773,7 @@ @Override public String toString() { final StringBuilder b = new StringBuilder(); - acceptCodeElementScanner(new Printer(b), null); + new Printer(b).visitTree(this, null, null); return b.toString(); } @@ -819,23 +822,25 @@ } @Override - public void visitTree(CodeTree e, Void p) { + public void visitTree(CodeTree e, Void p, Element enclosingElement) { switch (e.getCodeKind()) { case COMMA_GROUP: List<CodeTree> children = e.getEnclosedElements(); - for (int i = 0; i < children.size(); i++) { - children.get(i).acceptCodeElementScanner(this, p); - if (i < e.getEnclosedElements().size() - 1) { - b.append(", "); + if (children != null) { + for (int i = 0; i < children.size(); i++) { + visitTree(children.get(i), p, enclosingElement); + if (i < e.getEnclosedElements().size() - 1) { + b.append(", "); + } } } break; case GROUP: - super.visitTree(e, p); + super.visitTree(e, p, enclosingElement); break; case INDENT: indent(); - super.visitTree(e, p); + super.visitTree(e, p, enclosingElement); dedent(); break; case NEW_LINE: