summaryrefslogtreecommitdiff
path: root/chapter24/src/main/java/com
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-28 09:23:27 -0700
committerCliff Click <cliffc@acm.org>2026-09-28 09:23:27 -0700
commit8212a66ff27e56531e0b48807088f1c544d75756 (patch)
treed1a1cdbf1ae790ddd8378714d4325a84b90bfc17 /chapter24/src/main/java/com
parent3d226b49e1cd23b41fd9baf3917f751973c1ad11 (diff)
downloadSimple-8212a66ff27e56531e0b48807088f1c544d75756.tar.gz
Simple-8212a66ff27e56531e0b48807088f1c544d75756.zip
Check un-init not-null constructor fields
Propagate BOT inputs; Arith, Load. CallEnd inlining, the FUnPtr dies early. Load asserts when loading against uninit not-null field. Keep not-nill state for storage class. Clean up Node.peep as constant.
Diffstat (limited to 'chapter24/src/main/java/com')
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/ArithFNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/ArithNode.java4
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/LoadNode.java1
3 files changed, 4 insertions, 3 deletions
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/ArithFNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/ArithFNode.java
index 7fa428c6..3c20fa6e 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/ArithFNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/ArithFNode.java
@@ -20,7 +20,7 @@ public abstract class ArithFNode extends Node {
public Type compute() {
Type t1 = in(1)._type, t2 = in(2)._type;
if( t1.isHigh() || t2.isHigh() )
- return TypeFloat.TOP;
+ return Type.TOP;
if( t1 instanceof TypeFloat f1 &&
t2 instanceof TypeFloat f2 ) {
if( f1.isConstant() && f2.isConstant() )
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/ArithNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/ArithNode.java
index 6c147fe8..e9a60f50 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/ArithNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/ArithNode.java
@@ -26,10 +26,10 @@ public abstract class ArithNode extends Node {
// Generic airthmetic op math: high returns high; low returns low; 2
// constants fold; only 2 non-constants call specialized math.
@Override
- public final TypeInteger compute() {
+ public final Type compute() {
Type t1 = in(1)._type, t2 = in(2)._type;
if( t1.isHigh() || t2.isHigh() )
- return TypeInteger.TOP;
+ return Type.TOP;
if( t1 instanceof TypeInteger x &&
t2 instanceof TypeInteger y )
return x.isConstant() && y.isConstant()
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index b32484c2..5f28a39b 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -174,6 +174,7 @@ public class LoadNode extends MemOpNode {
private Node zero(NewNode nnn) {
TypeStruct ts = nnn._ptr._obj;
Type zero = ts._fields[ts.findAlias(_alias)]._t.makeZero();
+ assert zero.isa(_type); // Catch an uninitialized non-null field
return castRO(new ConstantNode(zero).peephole());
}