summaryrefslogtreecommitdiff
path: root/chapter17
diff options
context:
space:
mode:
Diffstat (limited to 'chapter17')
-rw-r--r--chapter17/src/main/java/com/seaofnodes/simple/node/AddNode.java6
-rw-r--r--chapter17/src/main/java/com/seaofnodes/simple/node/MulNode.java5
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter13Test.java13
-rw-r--r--chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java7
4 files changed, 25 insertions, 6 deletions
diff --git a/chapter17/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter17/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 0834a381..4007df91 100644
--- a/chapter17/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter17/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -44,6 +44,7 @@ public class AddNode extends Node {
public Node idealize () {
Node lhs = in(1);
Node rhs = in(2);
+ if( rhs.err() != null ) return null;
Type t2 = rhs._type;
// Add of 0. We do not check for (0+x) because this will already
@@ -184,4 +185,9 @@ public class AddNode extends Node {
@Override Node copy(Node lhs, Node rhs) { return new AddNode(lhs,rhs); }
@Override Node copyF() { return new AddFNode(null,null); }
+ @Override public String err() {
+ if( !(in(1)._type instanceof TypeInteger) ) return "Cannot '"+label()+"' " + in(1)._type;
+ if( !(in(2)._type instanceof TypeInteger) ) return "Cannot '"+label()+"' " + in(2)._type;
+ return null;
+ }
}
diff --git a/chapter17/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter17/src/main/java/com/seaofnodes/simple/node/MulNode.java
index b5ef91e9..949af27a 100644
--- a/chapter17/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter17/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -60,4 +60,9 @@ public class MulNode extends Node {
}
@Override Node copy(Node lhs, Node rhs) { return new MulNode(lhs,rhs); }
@Override Node copyF() { return new MulFNode(null,null); }
+ @Override public String err() {
+ if( !(in(1)._type instanceof TypeInteger) ) return "Cannot '"+label()+"' " + in(1)._type;
+ if( !(in(2)._type instanceof TypeInteger) ) return "Cannot '"+label()+"' " + in(2)._type;
+ return null;
+ }
}
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter13Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter13Test.java
index 30d9b147..eeb28f1d 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter13Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter13Test.java
@@ -130,6 +130,19 @@ return n.i;
}
@Test
+ public void testNullRef4() {
+ Parser parser = new Parser("-null-5/null-5;");
+ try { parser.parse().iterate(); fail(); }
+ catch( Exception e ) { assertEquals("Cannot 'Add' null",e.getMessage()); }
+ }
+
+ @Test public void testNullRef5() {
+ Parser parser = new Parser("return null+42;");
+ try { parser.parse().iterate(); fail(); }
+ catch( Exception e ) { assertEquals("Cannot 'Add' null",e.getMessage()); }
+ }
+
+ @Test
public void testEmpty() {
Parser parser = new Parser(
"""
diff --git a/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java b/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
index 4a7e959a..1ca9a515 100644
--- a/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
+++ b/chapter17/src/test/java/com/seaofnodes/simple/Chapter17Test.java
@@ -11,12 +11,7 @@ public class Chapter17Test {
@Test
public void testJig() {
- Parser parser = new Parser("""
-int i = 0;
-i=i=1;
-return i;
- //return 3.14;
-""");
+ Parser parser = new Parser("return 1;");
StopNode stop = parser.parse().iterate();
assertEquals("return 1;", stop.toString());
assertEquals(1L, Evaluator.evaluate(stop, 0));