Mercurial > hg > truffle
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; }