From f48010ac0f0d47321c5f0fa98bb57dd2278b27a0 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sat, 4 Jan 2025 10:48:10 -0800 Subject: Add Call/CallEnd in many CFG walks Can store into an array. Check array is "of nullable" Add crazy closure test --- .../java/com/seaofnodes/simple/Chapter18Test.java | 34 +++++++++++++++++++++- .../src/test/java/com/seaofnodes/simple/Eval2.java | 2 +- 2 files changed, 34 insertions(+), 2 deletions(-) (limited to 'chapter18/src/test/java/com') diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java index aaeaab9e..39da0c72 100644 --- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java +++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java @@ -77,7 +77,8 @@ return sq(arg)+sq(3); assertEquals("13", Eval2.eval(code, 2)); } - @Ignore @Test + // Recursive factorial test + @Test public void testFcn2() { CodeGen code = new CodeGen("val fact = { int x -> x <= 1 ? 1 : x*fact(x-1); }; return fact(arg);"); code.parse().opto(); @@ -88,4 +89,35 @@ return sq(arg)+sq(3); assertEquals( "6", Eval2.eval(code, 3)); assertEquals("24", Eval2.eval(code, 4)); } + + + + @Ignore @Test + public void testFcn3() { + CodeGen code = new CodeGen( +""" +val counter = { -> + int cnt; + val rez = new {int}?[2]; + rez[0] = { -> cnt; }; + rez[1] = { -> ++cnt; }; + return rez; +}; +val A = counter(); +val B = counter(); +int[] rez = new int[5]; +rez[0] = A[0](); // Value of counter A +rez[1] = A[1](); // Increment counter A +rez[2] = B[0](); // Value of counter B +B[1](); // Increment B +B[1](); // Increment B +rez[3] = B[0](); // Value of counter B +rez[4] = A[0]() * 10 + B[0](); +return rez; +"""); + code.parse().opto(); + assertEquals("Stop[ return (const)[int]; return (const)[{ -> int #ALL}?]; return 0; return 1; ]", code._stop.toString()); + assertEquals("13", Eval2.eval(code, 0)); + } + } diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Eval2.java b/chapter18/src/test/java/com/seaofnodes/simple/Eval2.java index 181f3649..757699e4 100644 --- a/chapter18/src/test/java/com/seaofnodes/simple/Eval2.java +++ b/chapter18/src/test/java/com/seaofnodes/simple/Eval2.java @@ -330,7 +330,7 @@ public abstract class Eval2 { } else if (elem instanceof TypeFloat) { Arrays.fill( ary, 0D ); } else { - assert elem instanceof TypeMemPtr; + assert elem instanceof TypeMemPtr || elem instanceof TypeFunPtr; } return ary; } -- cgit v1.2.3