diff options
| author | Cliff Click <cliffc@acm.org> | 2023-10-29 10:45:20 -0700 |
|---|---|---|
| committer | Dibyendu Majumdar <dibyendumajumdar@users.noreply.github.com> | 2023-11-01 18:56:50 +0000 |
| commit | f3bd82bdae3ebce5289b1a1bed9105c5bf04fdbe (patch) | |
| tree | ede729aca8e374db986b0606e0756875ee668bf3 /chapter05/src | |
| parent | 57d73a18aa2781d99098e5c13c5e2b8d25059aa4 (diff) | |
| download | Simple-f3bd82bdae3ebce5289b1a1bed9105c5bf04fdbe.tar.gz Simple-f3bd82bdae3ebce5289b1a1bed9105c5bf04fdbe.zip | |
Fix div-by-0, some javadoc
higher level parsers can return null, but their return is ignored anycase.
div-by-0 is defined to be 0, backported to ch2,3,4,5
Diffstat (limited to 'chapter05/src')
4 files changed, 17 insertions, 16 deletions
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java index 0d7114d8..92b1f0d5 100644 --- a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java @@ -107,7 +107,7 @@ public class Parser { * <pre> * '{' statements '}' * </pre> - * @return a {@link Node}, never {@code null} + * @return a {@link Node} or {@code null} */ private Node parseBlock() { // Enter a new scope @@ -128,7 +128,7 @@ public class Parser { * <pre> * returnStatement | declStatement | blockStatement | expressionStatement * </pre> - * @return a {@link Node}, never {@code null} + * @return a {@link Node} or {@code null} */ private Node parseStatement() { if (matchx("return") ) return parseReturn(); @@ -200,12 +200,12 @@ public class Parser { /** * Dumps out the node graph - * @return a {@link Node}, never {@code null} + * @return {@code null} */ private Node showGraph() { require(";"); System.out.println(new GraphVisualizer().generateDotOutput(this)); - return ctrl(); + return null; } /** diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java index 22167a87..1f562378 100644 --- a/chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java +++ b/chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java @@ -23,11 +23,10 @@ public class DivNode extends Node { public Type compute() { if (in(1)._type instanceof TypeInteger i0 && in(2)._type instanceof TypeInteger i1) { - if (i0.isConstant() && i1.isConstant()) { - if (i1.value() == 0) - throw new IllegalArgumentException("Divide by zero"); - return TypeInteger.constant(i0.value()/i1.value()); - } + if (i0.isConstant() && i1.isConstant()) + return i1.value() == 0 + ? TypeInteger.ZERO + : TypeInteger.constant(i0.value()/i1.value()); return i0.meet(i1); } return TypeBot.BOTTOM; diff --git a/chapter05/src/main/java/com/seaofnodes/simple/type/TypeInteger.java b/chapter05/src/main/java/com/seaofnodes/simple/type/TypeInteger.java index f75a6788..63c46035 100644 --- a/chapter05/src/main/java/com/seaofnodes/simple/type/TypeInteger.java +++ b/chapter05/src/main/java/com/seaofnodes/simple/type/TypeInteger.java @@ -7,6 +7,7 @@ public class TypeInteger extends Type { public final static TypeInteger TOP = new TypeInteger(false, 0); public final static TypeInteger BOT = new TypeInteger(false, 1); + public final static TypeInteger ZERO= new TypeInteger(true, 0); private final boolean _is_con; diff --git a/chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java b/chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java index bb95dc18..ea65900f 100644 --- a/chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java +++ b/chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java @@ -69,7 +69,13 @@ return c; StopNode stop = parser.parse(); assertEquals("return Phi(Region33,Phi(Region21,2,3),Phi(Region31,4,5));", stop.toString()); } - + + @Test + public void testChapter5True() { + StopNode stop = new Parser("return true;").parse(); + assertEquals("return 1;",stop.toString()); + } + @Test public void testChapter5HalfDef() { try { @@ -91,12 +97,6 @@ return c; } @Test - public void testChapter5True() { - StopNode stop = new Parser("return true;").parse(); - assertEquals("return 1;",stop.toString()); - } - - @Test public void testChapter5BadNum() { try { new Parser("return 1-;").parse(); @@ -135,6 +135,7 @@ return c; assertEquals("Syntax error, expected =: (",e.getMessage()); } } + @Test public void testChapter4Peephole() { Parser parser = new Parser("return 1+arg+2; #showGraph;"); |
