diff options
| author | Cliff Click <cliffc@acm.org> | 2025-01-04 10:48:10 -0800 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-01-15 15:07:30 -0800 |
| commit | f48010ac0f0d47321c5f0fa98bb57dd2278b27a0 (patch) | |
| tree | 6139925385ea74000aa1535754365256e3deb601 /chapter18/src/test | |
| parent | 381227eeb0262378f44a68b4b39b8248399a02b6 (diff) | |
| download | Simple-f48010ac0f0d47321c5f0fa98bb57dd2278b27a0.tar.gz Simple-f48010ac0f0d47321c5f0fa98bb57dd2278b27a0.zip | |
Add Call/CallEnd in many CFG walks
Can store into an array.
Check array is "of nullable"
Add crazy closure test
Diffstat (limited to 'chapter18/src/test')
| -rw-r--r-- | chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java | 34 | ||||
| -rw-r--r-- | chapter18/src/test/java/com/seaofnodes/simple/Eval2.java | 2 |
2 files changed, 34 insertions, 2 deletions
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; } |
