From 8212a66ff27e56531e0b48807088f1c544d75756 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Mon, 28 Sep 2026 09:23:27 -0700 Subject: 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. --- chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java | 1 + chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java | 2 ++ 2 files changed, 3 insertions(+) (limited to 'chapter21/src/main/java') diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java index 80bf989c..c8cca355 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/LoadNode.java @@ -139,6 +139,7 @@ public class LoadNode extends MemOpNode { private Node zero(NewNode nnn) { TypeStruct ts = nnn._ptr._obj; Type zero = ts._fields[ts.findAlias(_alias)]._type.makeZero(); + assert zero.isa(_type); // Catch an uninitialized non-null field return castRO(new ConstantNode(zero).peephole()); } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java index 8878193c..f15ff9bb 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/StoreNode.java @@ -106,6 +106,8 @@ public class StoreNode extends MemOpNode { public Parser.ParseException err() { Parser.ParseException err = super.err(); if( err != null ) return err; + if( ptr()._type == Type.TOP ) + return null; // Dead store TypeMemPtr tmp = (TypeMemPtr)ptr()._type; if( tmp._obj.field(_name)._final && !_init ) return Parser.error("Cannot modify final field '"+_name+"'",_loc); -- cgit v1.2.3