From 71f9707231aca6edbfd7db3363d39929f265792d Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sun, 27 Apr 2025 14:41:00 -0700 Subject: Evil test case for self-reference --- .../main/java/com/seaofnodes/simple/Parser.java | 10 ++-- .../java/com/seaofnodes/simple/Chapter22Test.java | 59 ++++++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 chapter22/src/test/java/com/seaofnodes/simple/Chapter22Test.java (limited to 'chapter22/src') diff --git a/chapter22/src/main/java/com/seaofnodes/simple/Parser.java b/chapter22/src/main/java/com/seaofnodes/simple/Parser.java index b68c7f1f..d7f5087d 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/Parser.java @@ -783,10 +783,11 @@ public class Parser { StructNode s = new StructNode(); Ary fs = new Ary<>(Field.class); for( int i=lexlen; i>3; + if( delta==0 ) delta = 1; + if( spills != -1 ) + assertEquals("Expect spills:",spills,code._regAlloc._spillScaled,delta); + if( stop != null ) + assertEquals(stop, code._stop.toString()); + } + + + @Test + public void testCoRecur() { + String src = """ +struct A { B? b; C? c; i64 ax; val az = x*2; }; +struct B { A? a; C? c; f32 bx; val bz = x*3; }; +struct C { A? a; B? b; f64 cx; val cz = x*x; }; +A !aa = new A{ ax=17; }; +B !bb = new B{ bx=3.14; a = aa; }; +C !cc = new C{ cx=2.73; a = aa; b = bb; }; +aa.b = bb; +aa.c = cc; +bb.c = cc; +val x = 5; // aa.az; // Error to self-define forward ref +return cc.cz; +"""; + CodeGen code = new CodeGen(src).parse().opto().typeCheck(); + assertEquals("return 25;", code._stop.toString()); + assertEquals("25", Eval2.eval(code, 0)); + } + + + @Test @Ignore + public void testHelloWorld() throws IOException { + TestC.run("helloWorld", 9); + } + + +} -- cgit v1.2.3