From ecd82ce8ebbefef223cd934cd87802f4d03c1867 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Mon, 10 Aug 2026 11:11:18 -0700 Subject: Chapter 26: Construction and Private Memory Co-authored-by: Hsiang-Ying Fu <66062782+fuhsnn@users.noreply.github.com> Co-authored-by: fuhsnn <66062782+fuhsnn@users.noreply.github.com> Co-authored-by: Symious <14933944+symious@users.noreply.github.com> Co-authored-by: Jun Kawasaki Co-authored-by: Claude Opus 5 --- src/main/java/com/seaofnodes/simple/codegen/CodeGen.java | 1 - src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java | 2 +- src/main/java/com/seaofnodes/simple/codegen/InstSelect.java | 1 + src/main/java/com/seaofnodes/simple/codegen/Opto.java | 4 ++-- src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java | 5 +++++ 5 files changed, 9 insertions(+), 4 deletions(-) (limited to 'src/main/java/com/seaofnodes/simple/codegen') diff --git a/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java b/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java index b79eb73d..a49299e1 100644 --- a/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java +++ b/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java @@ -154,7 +154,6 @@ public class CodeGen { private int _fidx =0; public TypeFunPtr makeFun( TypeFunPtr fun ) { int fidx = _fidx++; - assert fidx<64; // TODO: need a larger FIDX space return fun.makeFrom(fidx); } // Signature for MAIN diff --git a/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java b/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java index da45db4f..9be662e8 100644 --- a/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java +++ b/src/main/java/com/seaofnodes/simple/codegen/GlobalCodeMotion.java @@ -251,7 +251,7 @@ public abstract class GlobalCodeMotion { visit.set(def._nid); for( Node out : def._outputs ) if( out instanceof MemOpNode ld && ld._isLoad && late[ld._nid]==null ) work.push(ld); - if( def instanceof MemMergeNode ) + if( def instanceof MemMergeNode || def instanceof EscapeNode ) for( int i=1; i=0; fidx=XInt.next(tfp.fidxs(),fidx) ) { FunNode fun = code.link(fidx); // null here means an external function; i.e. this Call // calls to an outside library and all its arguments escape. diff --git a/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java b/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java index bc698e19..7dadb4d2 100644 --- a/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java +++ b/src/main/java/com/seaofnodes/simple/codegen/TypeCheck.java @@ -14,6 +14,11 @@ abstract class TypeCheck { }); if( errs.isEmpty() ) return; + // Publication is a producer check. Report an incomplete object before + // its users complain about values or permissions inherited from it. + for( Node n : errs ) + if( n instanceof EscapeNode ) throw n.err(); + // A bad Load now produces BOTTOM. Report the bad access before a // Convert or arithmetic use that merely received its failed result. Node first = errs.at(0); -- cgit v1.2.3