diff options
| author | Cliff Click <cliffc@acm.org> | 2026-09-29 13:08:30 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-09-29 13:08:30 -0700 |
| commit | b475b072b38db7f46406ed6128fffe3e15a6e7ac (patch) | |
| tree | 4690b23b117f29003801212bbbf7d89322adb9a3 /chapter10a/src | |
| parent | a8558640bd9e3391134577db3c53737273135bf9 (diff) | |
| download | Simple-b475b072b38db7f46406ed6128fffe3e15a6e7ac.tar.gz Simple-b475b072b38db7f46406ed6128fffe3e15a6e7ac.zip | |
forward port lazy memory to ch11
Diffstat (limited to 'chapter10a/src')
4 files changed, 11 insertions, 6 deletions
diff --git a/chapter10a/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter10a/src/main/java/com/seaofnodes/simple/node/ReturnNode.java index f13f3708..96d58599 100644 --- a/chapter10a/src/main/java/com/seaofnodes/simple/node/ReturnNode.java +++ b/chapter10a/src/main/java/com/seaofnodes/simple/node/ReturnNode.java @@ -4,15 +4,16 @@ import com.seaofnodes.simple.type.*; import java.util.BitSet; -/** Keeps the return value and all preceding memory effects alive. */ +/** Keeps all preceding memory effects and the return value alive: {ctrl, $mem, value}. */ public class ReturnNode extends Node { public ReturnNode(Node ctrl, Node data, ScopeNode scope) { - super(ctrl, data, scope.lookup("$mem")); + super(ctrl, scope.lookup("$mem"), data); } public Node ctrl() { return in(0); } - public Node expr() { return in(1); } + public Node mem () { return in(1); } + public Node expr() { return in(2); } @Override public String label() { return "Return"; } @@ -28,7 +29,8 @@ public class ReturnNode extends Node { @Override public Type compute() { - return TypeTuple.make(ctrl()._type,expr()._type); + // Return exposes the complete memory state. + return TypeTuple.make(ctrl()._type,TypeMem.BOT,expr()._type); } @Override diff --git a/chapter10a/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java b/chapter10a/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java index 5e21c852..600e9c73 100644 --- a/chapter10a/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java +++ b/chapter10a/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java @@ -52,7 +52,7 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> { if( n instanceof ProjNode ) return n.isCFG() ? Role.CTRL : isMem(n) ? Role.MEM : Role.DATA; if( n instanceof RegionNode && i == 0 ) return Role.ASSOC; if( i == 0 || n instanceof RegionNode || n instanceof StopNode ) return Role.CTRL; - if( i == 1 && n instanceof MemOpNode || i == 2 && n instanceof ReturnNode ) return Role.MEM; + if( i == 1 && (n instanceof MemOpNode || n instanceof ReturnNode) ) return Role.MEM; Node def = n.in(i); if( def != null && isMem(def) ) return Role.MEM; return Role.DATA; diff --git a/chapter10a/src/test/java/com/seaofnodes/simple/Chapter04Test.java b/chapter10a/src/test/java/com/seaofnodes/simple/Chapter04Test.java index f1603cc4..edc62f50 100644 --- a/chapter10a/src/test/java/com/seaofnodes/simple/Chapter04Test.java +++ b/chapter10a/src/test/java/com/seaofnodes/simple/Chapter04Test.java @@ -85,6 +85,9 @@ public class Chapter04Test { ReturnNode ret = stop.ret(); assertTrue(ret.in(0) instanceof ProjNode); assertTrue(ret.in(1) instanceof ProjNode); + assertEquals(1, ((ProjNode)ret.in(1))._idx); + assertTrue(ret.in(2) instanceof ProjNode); + assertEquals(2, ((ProjNode)ret.in(2))._idx); } @Test diff --git a/chapter10a/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java b/chapter10a/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java index eaeb061b..bddcc596 100644 --- a/chapter10a/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java +++ b/chapter10a/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java @@ -162,7 +162,7 @@ public class Evaluator { case null: return Status.FALLTHROUGH; case ReturnNode ret: - return val(ret.in(1)); + return val(ret.expr()); case IfNode ifn: block = block.next()[isTrue(val(ifn.in(1))) ? 0 : 1]; if (block == null) return Status.FALLTHROUGH; |
