# HG changeset patch # User Christian Humer # Date 1419892688 -3600 # Node ID 8a758dce7d808b2f1fb19cb925f9520b8b41a859 # Parent 6fa518bf5d1b4962817654d24d524e4f2ddfb041 Truffle: added new deepCopy method to Node. diff -r 6fa518bf5d1b -r 8a758dce7d80 CHANGELOG.md --- a/CHANGELOG.md Mon Dec 29 23:37:58 2014 +0100 +++ b/CHANGELOG.md Mon Dec 29 23:38:08 2014 +0100 @@ -8,7 +8,7 @@ * ... ### Truffle -* ... +* Added Node#deepCopy as primary method to copy ASTs. ## Version 0.6 19-Dec-2014, [Repository Revision](http://hg.openjdk.java.net/graal/graal/shortlog/graal-0.6) diff -r 6fa518bf5d1b -r 8a758dce7d80 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Mon Dec 29 23:37:58 2014 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Mon Dec 29 23:38:08 2014 +0100 @@ -388,6 +388,15 @@ } /** + * Creates a deep copy of this node. + * + * @return the new deep copy + */ + public Node deepCopy() { + return NodeUtil.deepCopyImpl(this); + } + + /** * This method must never be called. It enforces that {@link Object#clone} is not directly * called by subclasses. Use the {@link #copy()} method instead. */ diff -r 6fa518bf5d1b -r 8a758dce7d80 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Mon Dec 29 23:37:58 2014 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java Mon Dec 29 23:38:08 2014 +0100 @@ -450,6 +450,10 @@ @SuppressWarnings("unchecked") public static T cloneNode(T orig) { + return (T) orig.deepCopy(); + } + + static Node deepCopyImpl(Node orig) { final Node clone = orig.copy(); NodeClass nodeClass = NodeClass.get(clone.getClass()); @@ -458,7 +462,7 @@ for (long fieldOffset : nodeClass.childOffsets) { Node child = (Node) unsafe.getObject(orig, fieldOffset); if (child != null) { - Node clonedChild = cloneNode(child); + Node clonedChild = child.deepCopy(); unsafe.putObject(clonedChild, nodeClass.parentOffset, clone); unsafe.putObject(clone, fieldOffset, clonedChild); } @@ -469,7 +473,7 @@ Object[] clonedChildren = (Object[]) Array.newInstance(children.getClass().getComponentType(), children.length); for (int i = 0; i < children.length; i++) { if (children[i] != null) { - Node clonedChild = cloneNode((Node) children[i]); + Node clonedChild = ((Node) children[i]).deepCopy(); clonedChildren[i] = clonedChild; unsafe.putObject(clonedChild, nodeClass.parentOffset, clone); } @@ -483,7 +487,7 @@ unsafe.putObject(clone, fieldOffset, ((NodeCloneable) cloneable).clone()); } } - return (T) clone; + return clone; } public static List findNodeChildren(Node node) {