diff options
| author | Cliff Click <cliffc@acm.org> | 2026-09-14 10:58:28 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-09-14 10:58:28 -0700 |
| commit | 414931c8a940379d08fe15bf1491543bcddd8d0d (patch) | |
| tree | 22369ff1b7cd5647bbd3df987c81dd9935bfb86d | |
| parent | ccd14c5901c5eff7a4be463bf7cdd91b03e1ca38 (diff) | |
| download | Simple-414931c8a940379d08fe15bf1491543bcddd8d0d.tar.gz Simple-414931c8a940379d08fe15bf1491543bcddd8d0d.zip | |
Fix parser lifetime bug
| -rw-r--r-- | chapter25/src/main/java/com/seaofnodes/simple/Parser.java | 13 | ||||
| -rw-r--r-- | chapter25/src/test/java/com/seaofnodes/simple/FuzzerWrap.java | 1 |
2 files changed, 5 insertions, 9 deletions
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/Parser.java b/chapter25/src/main/java/com/seaofnodes/simple/Parser.java index 5453ee05..1dc50c75 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/Parser.java @@ -298,10 +298,6 @@ public class Parser { if( ctrl()._type==Type.CONTROL ) { // Constructors get special return types if( fun.isClz() ) { - // <clinit> only returns an integer, which becomes an OS exit code - // if the <clinit> is run directly - //if( !(last._type instanceof TypeInteger) ) - // last = _code.ZERO; assert last!=null; } else if( isCtor ) { last = fun.parm(3); @@ -1704,19 +1700,18 @@ public class Parser { // Compare Node rhs = parseShift().keep(); - Node cmp = makeCompBool(dir,lhs.unkeep(),rhs); // Convert to a bool + Node cmp = makeCompBool(dir,lhs.unkeep(),rhs).keep(); // Convert to a bool // Stacked compares? int dir0 = parseCompDir(); if( dir0 == 0 ) { - rhs.unkeep(); - if( rhs != cmp ) rhs.isKill(); - return cmp; + rhs.unkill(); + return cmp.unkeep(); } // rhs is keeped() and becomes lhs // cmp is NOT keeped() and is the last test - Node ifNode = new IfNode(ctrl(), cmp).peephole(); + Node ifNode = new IfNode(ctrl(), cmp.unkeep()).peephole(); Node ifT = new CProjNode(ifNode. keep(), 0, "True" ).peephole().keep(); Node ifF = new CProjNode(ifNode.unkeep(), 1, "False").peephole(); // False side does nothing but capture memory & side-effects diff --git a/chapter25/src/test/java/com/seaofnodes/simple/FuzzerWrap.java b/chapter25/src/test/java/com/seaofnodes/simple/FuzzerWrap.java index eb4454d5..a6378529 100644 --- a/chapter25/src/test/java/com/seaofnodes/simple/FuzzerWrap.java +++ b/chapter25/src/test/java/com/seaofnodes/simple/FuzzerWrap.java @@ -27,6 +27,7 @@ public class FuzzerWrap { -4022199781524079249L, // fuzzer regression 8824787517620928178L, // unknown-mode unary minus during SCCP -673501011619761901L, // peephole killed self + -8212834489697770130L, // bad keep/unkeep in parser }; private static final long[] OPEN_FAILING_SEEDS = { |
