summaryrefslogtreecommitdiff
path: root/chapter02/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'chapter02/src/main/java')
-rw-r--r--chapter02/src/main/java/com/seaofnodes/simple/node/Node.java9
1 files changed, 6 insertions, 3 deletions
diff --git a/chapter02/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter02/src/main/java/com/seaofnodes/simple/node/Node.java
index 43dea8e1..7c39083e 100644
--- a/chapter02/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter02/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -154,6 +154,12 @@ public abstract class Node {
*/
void set_def(int idx, Node new_def ) {
Node old_def = in(idx);
+ if( old_def == new_def ) return; // No change
+ // If new def is not null, add the corresponding def->use edge
+ // This needs to happen before removing the old node's def->use edge as
+ // the new_def might get killed if the old node kills it recursively.
+ if( new_def != null )
+ new_def._outputs.add(this);
if( old_def != null ) { // If the old def exists, remove a use->def edge
ArrayList<Node> outs = old_def._outputs;
int lidx = outs.size()-1; // Last index
@@ -168,9 +174,6 @@ public abstract class Node {
}
// Set the new_def over the old (killed) edge
_inputs.set(idx,new_def);
- // If new def is not null, add the corresponding use->def edge
- if( new_def != null )
- new_def._outputs.add(this);
}