From 162558e68e0f8c83ad42a2c1bc676ae0eef2464c Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Fri, 4 Oct 2024 14:18:47 -0700 Subject: Force arrays to have a safety check Improves BrainFuck --- chapter15/src/main/java/com/seaofnodes/simple/Parser.java | 15 ++++++++++++--- .../src/main/java/com/seaofnodes/simple/node/NewNode.java | 4 ++-- 2 files changed, 14 insertions(+), 5 deletions(-) (limited to 'chapter15/src/main/java') diff --git a/chapter15/src/main/java/com/seaofnodes/simple/Parser.java b/chapter15/src/main/java/com/seaofnodes/simple/Parser.java index 64cde40f..012a010e 100644 --- a/chapter15/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter15/src/main/java/com/seaofnodes/simple/Parser.java @@ -805,13 +805,22 @@ public class Parser { Node val = parseExpression(); // Auto-truncate when storing to narrow fields val = zsMask(val,f._type); - memAlias(f._alias, new StoreNode(name, f._alias, f._type, memAlias(f._alias), expr, off, val, false).peephole()); + Node st = new StoreNode(name, f._alias, f._type, memAlias(f._alias), expr, off, val, false); + // Arrays include control, as a proxy for a safety range check. + // Structs dont need this; they only need a NPE check which is + // done via the type system. + if( base.isAry() ) st.setDef(0,ctrl()); + memAlias(f._alias, st.peephole()); return val; // "obj.a = expr" returns the expression while updating memory } } - Node load = new LoadNode(name, f._alias, f._type, memAlias(f._alias), expr, off).peephole(); - return parsePostfix(load); + Node load = new LoadNode(name, f._alias, f._type, memAlias(f._alias), expr, off); + // Arrays include control, as a proxy for a safety range check + // Structs dont need this; they only need a NPE check which is + // done via the type system. + if( base.isAry() ) load.setDef(0,ctrl()); + return parsePostfix(load.peephole()); } diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/NewNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/NewNode.java index d7220bdc..f06564cd 100644 --- a/chapter15/src/main/java/com/seaofnodes/simple/node/NewNode.java +++ b/chapter15/src/main/java/com/seaofnodes/simple/node/NewNode.java @@ -38,10 +38,10 @@ public class NewNode extends Node implements MultiNode { @Override public TypeTuple compute() { - Type[] ts = new Type[nIns()]; + Field[] fs = _ptr._obj._fields; + Type[] ts = new Type[fs.length+2]; ts[0] = Type.CONTROL; ts[1] = _ptr; - Field[] fs = _ptr._obj._fields; for( int i=0; i