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