diff graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java @ 18510:cb4d5cc2b52b

Truffle: clone ConditionProfile and BranchProfile node fields
author Andreas Woess <andreas.woess@jku.at>
date Tue, 25 Nov 2014 13:21:50 +0100
parents e3c95cbbb50c
children 8a758dce7d80
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java	Tue Nov 25 13:21:38 2014 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java	Tue Nov 25 13:21:50 2014 +0100
@@ -179,6 +179,7 @@
         private final long parentOffset;
         private final long[] childOffsets;
         private final long[] childrenOffsets;
+        private final long[] cloneableOffsets;
         private final Class<? extends Node> clazz;
 
         public static NodeClass get(Class<? extends Node> clazz) {
@@ -190,6 +191,7 @@
             long parentFieldOffset = -1;
             List<Long> childOffsetsList = new ArrayList<>();
             List<Long> childrenOffsetsList = new ArrayList<>();
+            List<Long> cloneableOffsetsList = new ArrayList<>();
 
             for (Field field : getAllFields(clazz)) {
                 if (Modifier.isStatic(field.getModifiers()) || field.isSynthetic()) {
@@ -209,6 +211,9 @@
                     checkChildrenField(field);
                     kind = NodeFieldKind.CHILDREN;
                     childrenOffsetsList.add(fieldOffsetProvider.objectFieldOffset(field));
+                } else if (NodeCloneable.class.isAssignableFrom(field.getType())) {
+                    kind = NodeFieldKind.DATA;
+                    cloneableOffsetsList.add(fieldOffsetProvider.objectFieldOffset(field));
                 } else {
                     kind = NodeFieldKind.DATA;
                 }
@@ -223,6 +228,7 @@
             this.parentOffset = parentFieldOffset;
             this.childOffsets = toLongArray(childOffsetsList);
             this.childrenOffsets = toLongArray(childrenOffsetsList);
+            this.cloneableOffsets = toLongArray(cloneableOffsetsList);
             this.clazz = clazz;
         }
 
@@ -471,6 +477,12 @@
                 unsafe.putObject(clone, fieldOffset, clonedChildren);
             }
         }
+        for (long fieldOffset : nodeClass.cloneableOffsets) {
+            Object cloneable = unsafe.getObject(clone, fieldOffset);
+            if (cloneable != null && cloneable == unsafe.getObject(orig, fieldOffset)) {
+                unsafe.putObject(clone, fieldOffset, ((NodeCloneable) cloneable).clone());
+            }
+        }
         return (T) clone;
     }