summaryrefslogtreecommitdiff
path: root/chapter10/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'chapter10/src/main/java')
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/AddNode.java10
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/BoolNode.java10
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/DivNode.java10
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/MulNode.java10
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/NotNode.java2
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java10
7 files changed, 37 insertions, 17 deletions
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/AddNode.java
index b88e13b5..de5044d7 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -19,12 +19,16 @@ public class AddNode extends Node {
@Override
public Type compute() {
- if( in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1 ) {
+ Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1==Type.TOP || t1==TypeInteger.TOP ||
+ t2==Type.TOP || t2==TypeInteger.TOP )
+ return TypeInteger.TOP;
+ if( t1 instanceof TypeInteger i0 &&
+ t2 instanceof TypeInteger i1 ) {
if (i0.isConstant() && i1.isConstant())
return TypeInteger.constant(i0.value()+i1.value());
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/BoolNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/BoolNode.java
index ab577aa6..bf0d3a84 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/BoolNode.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/BoolNode.java
@@ -26,12 +26,16 @@ abstract public class BoolNode extends Node {
@Override
public Type compute() {
- if( in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1 ) {
+ Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1==Type.TOP || t1==TypeInteger.TOP ||
+ t2==Type.TOP || t2==TypeInteger.TOP )
+ return TypeInteger.TOP;
+ if( t1 instanceof TypeInteger i0 &&
+ t2 instanceof TypeInteger i1 ) {
if (i0.isConstant() && i1.isConstant())
return TypeInteger.constant(doOp(i0.value(), i1.value()) ? 1 : 0);
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
abstract boolean doOp(long lhs, long rhs);
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/DivNode.java
index d6ecfb69..6cee90ad 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -19,14 +19,18 @@ public class DivNode extends Node {
@Override
public Type compute() {
- if (in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1) {
+ Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1==Type.TOP || t1==TypeInteger.TOP ||
+ t2==Type.TOP || t2==TypeInteger.TOP )
+ return TypeInteger.TOP;
+ if (t1 instanceof TypeInteger i0 &&
+ t2 instanceof TypeInteger i1) {
if (i0.isConstant() && i1.isConstant())
return i1.value() == 0
? TypeInteger.ZERO
: TypeInteger.constant(i0.value()/i1.value());
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index fa252903..8b1b73bf 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -20,7 +20,7 @@ public class MinusNode extends Node {
public Type compute() {
if (in(1)._type instanceof TypeInteger i0)
return i0.isConstant() ? TypeInteger.constant(-i0.value()) : i0;
- return TypeInteger.TOP.meet(in(1)._type);
+ return in(1)._type==Type.TOP ? TypeInteger.TOP : TypeInteger.BOT;
}
@Override
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/MulNode.java
index 6a6c82f9..97721ce3 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -19,12 +19,16 @@ public class MulNode extends Node {
@Override
public Type compute() {
- if (in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1) {
+ Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1==Type.TOP || t1==TypeInteger.TOP ||
+ t2==Type.TOP || t2==TypeInteger.TOP )
+ return TypeInteger.TOP;
+ if (t1 instanceof TypeInteger i0 &&
+ t2 instanceof TypeInteger i1) {
if (i0.isConstant() && i1.isConstant())
return TypeInteger.constant(i0.value()*i1.value());
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/NotNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/NotNode.java
index 3d85b220..83141836 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/NotNode.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/NotNode.java
@@ -33,7 +33,7 @@ public class NotNode extends Node {
if( t0.getClass() != Type.class )
// Only doing NOT on ints and ptrs
throw Utils.TODO();
- return t0==Type.TOP ? Type.TOP : Type.BOTTOM;
+ return t0==Type.TOP ? TypeInteger.TOP : TypeInteger.BOT;
}
}
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 8264b740..dfb4744d 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -19,16 +19,20 @@ public class SubNode extends Node {
@Override
public Type compute() {
+ Type t1 = in(1)._type, t2 = in(2)._type;
+ if( t1==Type.TOP || t1==TypeInteger.TOP ||
+ t2==Type.TOP || t2==TypeInteger.TOP )
+ return TypeInteger.TOP;
// Sub of same is 0
if( in(1)==in(2) )
return TypeInteger.ZERO;
- if (in(1)._type instanceof TypeInteger i0 &&
- in(2)._type instanceof TypeInteger i1) {
+ if (t1 instanceof TypeInteger i0 &&
+ t2 instanceof TypeInteger i1) {
if (i0.isConstant() && i1.isConstant())
return TypeInteger.constant(i0.value()-i1.value());
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
@Override