changeset 18750:8a758dce7d80

Truffle: added new deepCopy method to Node.
author Christian Humer <christian.humer@gmail.com>
date Mon, 29 Dec 2014 23:38:08 +0100
parents 6fa518bf5d1b
children e55e18c1f40d
files CHANGELOG.md graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java
diffstat 3 files changed, 17 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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.
      */
--- 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 extends Node> 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<Node> findNodeChildren(Node node) {