From 6d8eddc652abfddfd7793b06f82526cc0360bf8e Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Wed, 24 Jul 2024 22:47:45 +0300 Subject: a little FP cleanup --- chapter12/src/main/java/com/seaofnodes/simple/Parser.java | 5 +---- chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java | 8 +++++--- 2 files changed, 6 insertions(+), 7 deletions(-) (limited to 'chapter12/src') 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); } } -- cgit v1.2.3