Mercurial > hg > truffle
comparison 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 |
comparison
equal
deleted
inserted
replaced
18509:7bf2965140de | 18510:cb4d5cc2b52b |
---|---|
177 private final NodeField[] fields; | 177 private final NodeField[] fields; |
178 // Separate arrays for the frequently accessed field offsets. | 178 // Separate arrays for the frequently accessed field offsets. |
179 private final long parentOffset; | 179 private final long parentOffset; |
180 private final long[] childOffsets; | 180 private final long[] childOffsets; |
181 private final long[] childrenOffsets; | 181 private final long[] childrenOffsets; |
182 private final long[] cloneableOffsets; | |
182 private final Class<? extends Node> clazz; | 183 private final Class<? extends Node> clazz; |
183 | 184 |
184 public static NodeClass get(Class<? extends Node> clazz) { | 185 public static NodeClass get(Class<? extends Node> clazz) { |
185 return nodeClasses.get(clazz); | 186 return nodeClasses.get(clazz); |
186 } | 187 } |
188 public NodeClass(Class<? extends Node> clazz, FieldOffsetProvider fieldOffsetProvider) { | 189 public NodeClass(Class<? extends Node> clazz, FieldOffsetProvider fieldOffsetProvider) { |
189 List<NodeField> fieldsList = new ArrayList<>(); | 190 List<NodeField> fieldsList = new ArrayList<>(); |
190 long parentFieldOffset = -1; | 191 long parentFieldOffset = -1; |
191 List<Long> childOffsetsList = new ArrayList<>(); | 192 List<Long> childOffsetsList = new ArrayList<>(); |
192 List<Long> childrenOffsetsList = new ArrayList<>(); | 193 List<Long> childrenOffsetsList = new ArrayList<>(); |
194 List<Long> cloneableOffsetsList = new ArrayList<>(); | |
193 | 195 |
194 for (Field field : getAllFields(clazz)) { | 196 for (Field field : getAllFields(clazz)) { |
195 if (Modifier.isStatic(field.getModifiers()) || field.isSynthetic()) { | 197 if (Modifier.isStatic(field.getModifiers()) || field.isSynthetic()) { |
196 continue; | 198 continue; |
197 } | 199 } |
207 childOffsetsList.add(fieldOffsetProvider.objectFieldOffset(field)); | 209 childOffsetsList.add(fieldOffsetProvider.objectFieldOffset(field)); |
208 } else if (field.getAnnotation(Children.class) != null) { | 210 } else if (field.getAnnotation(Children.class) != null) { |
209 checkChildrenField(field); | 211 checkChildrenField(field); |
210 kind = NodeFieldKind.CHILDREN; | 212 kind = NodeFieldKind.CHILDREN; |
211 childrenOffsetsList.add(fieldOffsetProvider.objectFieldOffset(field)); | 213 childrenOffsetsList.add(fieldOffsetProvider.objectFieldOffset(field)); |
214 } else if (NodeCloneable.class.isAssignableFrom(field.getType())) { | |
215 kind = NodeFieldKind.DATA; | |
216 cloneableOffsetsList.add(fieldOffsetProvider.objectFieldOffset(field)); | |
212 } else { | 217 } else { |
213 kind = NodeFieldKind.DATA; | 218 kind = NodeFieldKind.DATA; |
214 } | 219 } |
215 fieldsList.add(new NodeField(kind, field.getType(), field.getName(), fieldOffsetProvider.objectFieldOffset(field))); | 220 fieldsList.add(new NodeField(kind, field.getType(), field.getName(), fieldOffsetProvider.objectFieldOffset(field))); |
216 } | 221 } |
221 | 226 |
222 this.fields = fieldsList.toArray(new NodeField[fieldsList.size()]); | 227 this.fields = fieldsList.toArray(new NodeField[fieldsList.size()]); |
223 this.parentOffset = parentFieldOffset; | 228 this.parentOffset = parentFieldOffset; |
224 this.childOffsets = toLongArray(childOffsetsList); | 229 this.childOffsets = toLongArray(childOffsetsList); |
225 this.childrenOffsets = toLongArray(childrenOffsetsList); | 230 this.childrenOffsets = toLongArray(childrenOffsetsList); |
231 this.cloneableOffsets = toLongArray(cloneableOffsetsList); | |
226 this.clazz = clazz; | 232 this.clazz = clazz; |
227 } | 233 } |
228 | 234 |
229 private static boolean isNodeType(Class<?> clazz) { | 235 private static boolean isNodeType(Class<?> clazz) { |
230 return Node.class.isAssignableFrom(clazz) || (clazz.isInterface() && NodeInterface.class.isAssignableFrom(clazz)); | 236 return Node.class.isAssignableFrom(clazz) || (clazz.isInterface() && NodeInterface.class.isAssignableFrom(clazz)); |
467 clonedChildren[i] = clonedChild; | 473 clonedChildren[i] = clonedChild; |
468 unsafe.putObject(clonedChild, nodeClass.parentOffset, clone); | 474 unsafe.putObject(clonedChild, nodeClass.parentOffset, clone); |
469 } | 475 } |
470 } | 476 } |
471 unsafe.putObject(clone, fieldOffset, clonedChildren); | 477 unsafe.putObject(clone, fieldOffset, clonedChildren); |
478 } | |
479 } | |
480 for (long fieldOffset : nodeClass.cloneableOffsets) { | |
481 Object cloneable = unsafe.getObject(clone, fieldOffset); | |
482 if (cloneable != null && cloneable == unsafe.getObject(orig, fieldOffset)) { | |
483 unsafe.putObject(clone, fieldOffset, ((NodeCloneable) cloneable).clone()); | |
472 } | 484 } |
473 } | 485 } |
474 return (T) clone; | 486 return (T) clone; |
475 } | 487 } |
476 | 488 |