summaryrefslogtreecommitdiff
path: root/chapter12
diff options
context:
space:
mode:
Diffstat (limited to 'chapter12')
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/Parser.java5
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java8
2 files changed, 6 insertions, 7 deletions
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/Parser.java b/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
index fd0a63f2..ef107399 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
@@ -4,7 +4,6 @@ import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.type.*;
import java.util.*;
-import java.io.ByteArrayInputStream;
/**
* The Parser converts a Simple source program to the Sea of Nodes intermediate
@@ -508,9 +507,7 @@ public class Parser {
else break;
// Peepholes can fire, but lhs is already "hooked", kept alive
op.setDef(idx,parseAddition());
- Node fop = op.widen();
- lhs = fop.peephole();
- if( op != fop ) op.kill();
+ lhs = op.widen();
if( negate ) // Extra negate for !=
lhs = new NotNode(lhs).peephole();
}
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java
index a8515bcb..e68cf5ff 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java
@@ -72,11 +72,13 @@ abstract public class BoolNode extends Node {
return null;
}
- public BoolNode widen() {
- if( !(in(1)._type instanceof TypeFloat || in(2)._type instanceof TypeFloat) ) return this;
+ public Node widen() {
+ if( !(in(1)._type instanceof TypeFloat || in(2)._type instanceof TypeFloat) ) return peephole();
Node in1 = Parser.widen(in(1));
Node in2 = Parser.widen(in(2));
- return copyF(in1,in2);
+ Node b = copyF(in1,in2).peephole();
+ kill();
+ return b;
}
public static class EQ extends BoolNode { public EQ(Node lhs, Node rhs) { super(lhs,rhs); } String op() { return "=="; } boolean doOp(long lhs, long rhs) { return lhs == rhs; } Node copy(Node lhs, Node rhs) { return new EQ(lhs,rhs); } BoolNode copyF(Node lhs, Node rhs) { return new EQF(lhs,rhs); } }