Mercurial > hg > graal-jvmci-8
diff graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java @ 15346:1cd02b4d90d1
onAdopt callback for ASTs
author | Michael Haupt <michael.haupt@oracle.com> |
---|---|
date | Wed, 23 Apr 2014 15:23:18 +0200 |
parents | 64dcb92ee75a |
children | 2cea065e419d |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Wed Apr 23 12:38:05 2014 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/Node.java Wed Apr 23 15:23:18 2014 +0200 @@ -191,8 +191,12 @@ if (newChild == this) { throw new IllegalStateException("The parent of a node can never be the node itself."); } + boolean isInserted = newChild.parent == null; newChild.parent = this; newChild.adoptHelper(); + if (isInserted) { + newChild.onAdopt(); + } } private void adoptHelper() { @@ -209,8 +213,12 @@ if (newChild == this) { throw new IllegalStateException("The parent of a node can never be the node itself."); } + boolean isInserted = newChild.parent == null; newChild.parent = this; newChild.adoptUnadoptedHelper(); + if (isInserted) { + newChild.onAdopt(); + } } private void adoptUnadoptedHelper() { @@ -356,6 +364,16 @@ out.printf("[truffle] rewrite %-50s |From %-40s |To %-40s |Reason %s.%n", this.toString(), formatNodeInfo(this), formatNodeInfo(newNode), reason); } + /** + * Subclasses of {@link Node} can implement this method to execute extra functionality when a + * node is effectively inserted into the AST. The {@code onAdopt} callback is called after the + * node has been effectively inserted, and it is guaranteed to be called only once for any given + * node. + */ + protected void onAdopt() { + // empty default + } + private static String formatNodeInfo(Node node) { String cost = "?"; switch (node.getCost()) {