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