summaryrefslogtreecommitdiff
path: root/chapter02/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'chapter02/src/main/java/com')
-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
2 files changed, 7 insertions, 3 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
*/