summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java8
-rw-r--r--chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java2
-rw-r--r--chapter03/src/main/java/com/seaofnodes/simple/node/DivNode.java8
-rw-r--r--chapter03/src/main/java/com/seaofnodes/simple/type/TypeInteger.java2
-rw-r--r--chapter04/src/main/java/com/seaofnodes/simple/node/DivNode.java9
-rw-r--r--chapter04/src/main/java/com/seaofnodes/simple/type/TypeInteger.java1
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/Parser.java8
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java9
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/type/TypeInteger.java1
-rw-r--r--chapter05/src/test/java/com/seaofnodes/simple/Chapter05Test.java15
10 files changed, 36 insertions, 27 deletions
diff --git a/chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java
index bc129690..0056c42d 100644
--- a/chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -22,9 +22,11 @@ public class DivNode extends Node {
@Override
public Type compute() {
if (in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1) {
- if (i1._con == 0)
- throw new IllegalArgumentException("Divide by zero");
+ in(2)._type instanceof TypeInteger i1) {
+ if (i0.isConstant() && i1.isConstant())
+ return i1._con == 0
+ ? TypeInteger.ZERO
+ : new TypeInteger(i0._con/i1._con);
return new TypeInteger(i0._con / i1._con);
}
return TypeBot.BOTTOM;
diff --git a/chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java b/chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
index db3d4c46..06cac15e 100644
--- a/chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
+++ b/chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
@@ -5,6 +5,8 @@ package com.seaofnodes.simple.type;
*/
public class TypeInteger extends Type {
+ public final static TypeInteger ZERO= new TypeInteger(0);
+
/**
* The constant value observed for this type
*/
diff --git a/chapter03/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter03/src/main/java/com/seaofnodes/simple/node/DivNode.java
index bc129690..0056c42d 100644
--- a/chapter03/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter03/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -22,9 +22,11 @@ public class DivNode extends Node {
@Override
public Type compute() {
if (in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1) {
- if (i1._con == 0)
- throw new IllegalArgumentException("Divide by zero");
+ in(2)._type instanceof TypeInteger i1) {
+ if (i0.isConstant() && i1.isConstant())
+ return i1._con == 0
+ ? TypeInteger.ZERO
+ : new TypeInteger(i0._con/i1._con);
return new TypeInteger(i0._con / i1._con);
}
return TypeBot.BOTTOM;
diff --git a/chapter03/src/main/java/com/seaofnodes/simple/type/TypeInteger.java b/chapter03/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
index db3d4c46..06cac15e 100644
--- a/chapter03/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
+++ b/chapter03/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
@@ -5,6 +5,8 @@ package com.seaofnodes.simple.type;
*/
public class TypeInteger extends Type {
+ public final static TypeInteger ZERO= new TypeInteger(0);
+
/**
* The constant value observed for this type
*/
diff --git a/chapter04/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter04/src/main/java/com/seaofnodes/simple/node/DivNode.java
index 22167a87..1f562378 100644
--- a/chapter04/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter04/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/chapter04/src/main/java/com/seaofnodes/simple/type/TypeInteger.java b/chapter04/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
index e23840e0..b53b1b29 100644
--- a/chapter04/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
+++ b/chapter04/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/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;");