comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeUtil.java @ 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 cb4d5cc2b52b
children e55e18c1f40d
comparison
equal deleted inserted replaced
18749:6fa518bf5d1b 18750:8a758dce7d80
448 } 448 }
449 } 449 }
450 450
451 @SuppressWarnings("unchecked") 451 @SuppressWarnings("unchecked")
452 public static <T extends Node> T cloneNode(T orig) { 452 public static <T extends Node> T cloneNode(T orig) {
453 return (T) orig.deepCopy();
454 }
455
456 static Node deepCopyImpl(Node orig) {
453 final Node clone = orig.copy(); 457 final Node clone = orig.copy();
454 NodeClass nodeClass = NodeClass.get(clone.getClass()); 458 NodeClass nodeClass = NodeClass.get(clone.getClass());
455 459
456 unsafe.putObject(clone, nodeClass.parentOffset, null); 460 unsafe.putObject(clone, nodeClass.parentOffset, null);
457 461
458 for (long fieldOffset : nodeClass.childOffsets) { 462 for (long fieldOffset : nodeClass.childOffsets) {
459 Node child = (Node) unsafe.getObject(orig, fieldOffset); 463 Node child = (Node) unsafe.getObject(orig, fieldOffset);
460 if (child != null) { 464 if (child != null) {
461 Node clonedChild = cloneNode(child); 465 Node clonedChild = child.deepCopy();
462 unsafe.putObject(clonedChild, nodeClass.parentOffset, clone); 466 unsafe.putObject(clonedChild, nodeClass.parentOffset, clone);
463 unsafe.putObject(clone, fieldOffset, clonedChild); 467 unsafe.putObject(clone, fieldOffset, clonedChild);
464 } 468 }
465 } 469 }
466 for (long fieldOffset : nodeClass.childrenOffsets) { 470 for (long fieldOffset : nodeClass.childrenOffsets) {
467 Object[] children = (Object[]) unsafe.getObject(orig, fieldOffset); 471 Object[] children = (Object[]) unsafe.getObject(orig, fieldOffset);
468 if (children != null) { 472 if (children != null) {
469 Object[] clonedChildren = (Object[]) Array.newInstance(children.getClass().getComponentType(), children.length); 473 Object[] clonedChildren = (Object[]) Array.newInstance(children.getClass().getComponentType(), children.length);
470 for (int i = 0; i < children.length; i++) { 474 for (int i = 0; i < children.length; i++) {
471 if (children[i] != null) { 475 if (children[i] != null) {
472 Node clonedChild = cloneNode((Node) children[i]); 476 Node clonedChild = ((Node) children[i]).deepCopy();
473 clonedChildren[i] = clonedChild; 477 clonedChildren[i] = clonedChild;
474 unsafe.putObject(clonedChild, nodeClass.parentOffset, clone); 478 unsafe.putObject(clonedChild, nodeClass.parentOffset, clone);
475 } 479 }
476 } 480 }
477 unsafe.putObject(clone, fieldOffset, clonedChildren); 481 unsafe.putObject(clone, fieldOffset, clonedChildren);
481 Object cloneable = unsafe.getObject(clone, fieldOffset); 485 Object cloneable = unsafe.getObject(clone, fieldOffset);
482 if (cloneable != null && cloneable == unsafe.getObject(orig, fieldOffset)) { 486 if (cloneable != null && cloneable == unsafe.getObject(orig, fieldOffset)) {
483 unsafe.putObject(clone, fieldOffset, ((NodeCloneable) cloneable).clone()); 487 unsafe.putObject(clone, fieldOffset, ((NodeCloneable) cloneable).clone());
484 } 488 }
485 } 489 }
486 return (T) clone; 490 return clone;
487 } 491 }
488 492
489 public static List<Node> findNodeChildren(Node node) { 493 public static List<Node> findNodeChildren(Node node) {
490 List<Node> nodes = new ArrayList<>(); 494 List<Node> nodes = new ArrayList<>();
491 NodeClass nodeClass = NodeClass.get(node.getClass()); 495 NodeClass nodeClass = NodeClass.get(node.getClass());