summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/Chapter17Test.java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-11-26 11:01:47 -0800
committerCliff Click <cliffc@acm.org>2025-01-14 15:17:03 -0800
commiteee5b806fabae0b480ff7d41159369c5a457d014 (patch)
tree576e6ed318eea76aa9e0de9e95af7616a0b8475a /src/test/java/com/seaofnodes/simple/Chapter17Test.java
parentc07510c1d75020d23d688f7f184149c57b13a39a (diff)
downloadSimple-linear-chapter18.tar.gz
Simple-linear-chapter18.zip
Chapter 18: Functionslinear-chapter18
Diffstat (limited to 'src/test/java/com/seaofnodes/simple/Chapter17Test.java')
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter17Test.java359
1 files changed, 196 insertions, 163 deletions
diff --git a/src/test/java/com/seaofnodes/simple/Chapter17Test.java b/src/test/java/com/seaofnodes/simple/Chapter17Test.java
index 4a7e959a..98c30721 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter17Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter17Test.java
@@ -1,9 +1,6 @@
package com.seaofnodes.simple;
-import com.seaofnodes.simple.evaluator.Evaluator;
-import com.seaofnodes.simple.node.StopNode;
import org.junit.Test;
-import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@@ -11,187 +8,202 @@ public class Chapter17Test {
@Test
public void testJig() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
int i = 0;
i=i=1;
return i;
//return 3.14;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 1;", stop.toString());
- assertEquals(1L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return 1;", code.print());
+ assertEquals("1", Eval2.eval(code, 0));
}
// ---------------------------------------------------------------
@Test
public void testInc0() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
return arg++;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return arg;", stop.toString());
- assertEquals(0L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return arg;", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
}
@Test
public void testInc1() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
return arg+++arg++;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return ((arg*2)+1);", stop.toString());
- assertEquals(1L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return ((arg*2)+1);", code.print());
+ assertEquals("1", Eval2.eval(code, 0));
}
@Test
public void testInc2() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
// -(arg--)-(arg--)
return -arg---arg--;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return (-((arg*2)+-1));", stop.toString());
- assertEquals(1L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return (-((arg*2)+-1));", code.print());
+ assertEquals("1", Eval2.eval(code, 0));
}
@Test
public void testInc3() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
int[] !xs = new int[arg];
xs[0]++;
xs[1]++;
return xs[0];
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 1;", stop.toString());
- assertEquals(1L, Evaluator.evaluate(stop, 2));
+ code.parse().opto();
+ assertEquals("return 1;", code.print());
+ assertEquals("1", Eval2.eval(code, 2));
}
@Test
public void testInc4() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
u8[] !xs = new u8[1];
xs[0]--;
return xs[0];
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 255;", stop.toString());
- assertEquals(255L, Evaluator.evaluate(stop, 2));
+ code.parse().opto();
+ assertEquals("return 255;", code.print());
+ assertEquals("255", Eval2.eval(code, 2));
}
@Test
public void testInc5() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct S { u16 x; };
S !s = new S;
s.x--;
return s.x;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 65535;", stop.toString());
- assertEquals(65535L, Evaluator.evaluate(stop, 2));
+ code.parse().opto();
+ assertEquals("return 65535;", code.print());
+ assertEquals("65535", Eval2.eval(code, 2));
}
@Test
public void testInc6() {
- Parser parser = new Parser("return --arg;");
- StopNode stop = parser.parse().iterate();
- assertEquals("return (arg+-1);", stop.toString());
- assertEquals(-1L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("return --arg;");
+ code.parse().opto();
+ assertEquals("return (arg+-1);", code.print());
+ assertEquals("-1", Eval2.eval(code, 0));
}
@Test
public void testInc7() {
- Parser parser = new Parser("u8 x=0; return --x;");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 255;", stop.toString());
- assertEquals(255L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("u8 x=0; return --x;");
+ code.parse().opto();
+ assertEquals("return 255;", code.print());
+ assertEquals("255", Eval2.eval(code, 0));
}
@Test
public void testInc8() {
- Parser parser = new Parser("int x; x+=2; return x+=3;");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 5;", stop.toString());
- assertEquals(5L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("int x; x+=2; return x+=3;");
+ code.parse().opto();
+ assertEquals("return 5;", code.print());
+ assertEquals("5", Eval2.eval(code, 0));
}
+ @Test
+ public void testInc9() {
+ CodeGen code = new CodeGen("flt x = 1.5; x++; return x;");
+ code.parse().opto();
+ assertEquals("return 2.5f;", code.print());
+ assertEquals("2.5", Eval2.eval(code, 0));
+ }
+
+ @Test public void testInt10() {
+ CodeGen code = new CodeGen("flt x = 1.5; x++; int i = x; return i;");
+ try { code.parse().opto(); fail(); }
+ catch( Exception e ) { assertEquals("Type 2.5f is not of declared type int",e.getMessage()); }
+ }
+
+
// ---------------------------------------------------------------
@Test public void testVar0() {
- Parser parser = new Parser("var d; return d;");
- try { parser.parse().iterate(); fail(); }
+ CodeGen code = new CodeGen("var d; return d;");
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("Syntax error, expected =expression: ;",e.getMessage()); }
}
@Test public void testVar1() {
- Parser parser = new Parser("val d; return d;");
- try { parser.parse().iterate(); fail(); }
+ CodeGen code = new CodeGen("val d; return d;");
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("Syntax error, expected =expression: ;",e.getMessage()); }
}
@Test public void testVar2() {
- Parser parser = new Parser("int x; x=3; x++; return x; // Ok, no initializer so x is mutable ");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 4;", stop.toString());
- assertEquals(4L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("int x; x=3; x++; return x; // Ok, no initializer so x is mutable ");
+ code.parse().opto();
+ assertEquals("return 4;", code.print());
+ assertEquals("4", Eval2.eval(code, 0));
}
@Test public void testVar3() {
- Parser parser = new Parser("int x=3; x++; return x; // Ok, primitive so x is mutable despite initializer ");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 4;", stop.toString());
- assertEquals(4L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("int x=3; x++; return x; // Ok, primitive so x is mutable despite initializer ");
+ code.parse().opto();
+ assertEquals("return 4;", code.print());
+ assertEquals("4", Eval2.eval(code, 0));
}
@Test public void testVar4() {
- Parser parser = new Parser("struct S{int x;}; S s; s=new S; s.x++; return s.x; // Ok, no initializer so x is mutable ");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 1;", stop.toString());
- assertEquals(1L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("struct S{int x;}; S s; s=new S; s.x++; return s.x; // Ok, no initializer so x is mutable ");
+ code.parse().opto();
+ assertEquals("return 1;", code.print());
+ assertEquals("1", Eval2.eval(code, 0));
}
@Test public void testVar5() {
- Parser parser = new Parser("struct S{int x;}; S s; s=new S{x=3;}; s.x++; return s.x; // Ok, no initializer so x is mutable ");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 4;", stop.toString());
- assertEquals(4L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("struct S{int x;}; S s; s=new S{x=3;}; s.x++; return s.x; // Ok, no initializer so x is mutable ");
+ code.parse().opto();
+ assertEquals("return 4;", code.print());
+ assertEquals("4", Eval2.eval(code, 0));
}
@Test public void testVar6() {
- Parser parser = new Parser("struct S{int x;}; S s=new S; s.x++; return s.x; // Error initializer so x is immutable ");
- try { parser.parse().iterate(); fail(); }
+ CodeGen code = new CodeGen("struct S{int x;}; S s=new S; s.x++; return s.x; // Error initializer so x is immutable ");
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test public void testVar7() {
- Parser parser = new Parser("struct S{int x;}; S s=new S{x=3;}; s.x++; return s.x; // Error initializer so x is immutable ");
- try { parser.parse().iterate(); fail(); }
+ CodeGen code = new CodeGen("struct S{int x;}; S s=new S{x=3;}; s.x++; return s.x; // Error initializer so x is immutable ");
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test public void testVar8() {
- Parser parser = new Parser("struct S{int x;}; S !s=new S; s.x++; return s.x; // Ok, has '!' so s.x is mutable ");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 1;", stop.toString());
- assertEquals(1L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("struct S{int x;}; S !s=new S; s.x++; return s.x; // Ok, has '!' so s.x is mutable ");
+ code.parse().opto();
+ assertEquals("return 1;", code.print());
+ assertEquals("1", Eval2.eval(code, 0));
}
@Test public void testVar9() {
- Parser parser = new Parser("struct S{int x;}; var s=new S; s.x++; return s.x; // Ok, has var so s.x is mutable ");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 1;", stop.toString());
- assertEquals(1L, Evaluator.evaluate(stop, 0));
+ CodeGen code = new CodeGen("struct S{int x;}; var s=new S; s.x++; return s.x; // Ok, has var so s.x is mutable ");
+ code.parse().opto();
+ assertEquals("return 1;", code.print());
+ assertEquals("1", Eval2.eval(code, 0));
}
@Test public void testVar10() {
- Parser parser = new Parser("struct S{int x;}; val s=new S; s.x++; return s.x; // Error, has val so x is immutable ");
- try { parser.parse().iterate(); fail(); }
+ CodeGen code = new CodeGen("struct S{int x;}; val s=new S; s.x++; return s.x; // Error, has val so x is immutable ");
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test public void testVar11() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct Bar { int x; };
Bar !bar = new Bar;
bar.x = 3; // Ok, bar is mutable
@@ -204,12 +216,12 @@ foo.bar.x++; // Ok foo and foo.bar and foo.bar.x are all mutable
val xfoo = foo; // Throw away mutability
xfoo.bar.x++; // Error, cannot mutate through xfoo
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Cannot modify final field 'x'",e.getMessage()); }
}
@Test public void testVar12() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct Bar { int x; };
Bar !bar = new Bar;
bar.x = 3; // Ok, bar is mutable
@@ -225,24 +237,24 @@ foo.bar.x++; // Bumps to 5
int x5 = xfoo.bar.x; // Ok to read through xfoo, gets 5
return x4*10+x5;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 45;", stop.toString());
- assertEquals(45L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return 45;", code.print());
+ assertEquals("45", Eval2.eval(code, 0));
}
@Test
public void testVar13() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
int i,i++;
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto().typeCheck(); fail(); }
catch( Exception e ) { assertEquals("Redefining name 'i'",e.getMessage()); }
}
@Test
public void testVar14() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct B {};
struct A { B b; };
A x = new A {
@@ -250,127 +262,153 @@ A x = new A {
b = new B;
};
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("Cannot read uninitialized field 'b'",e.getMessage()); }
}
@Test
public void testVar15() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct B {};
struct A { B b; };
return new A {
if (arg) b = new B; // Constructor ends with partial init of b
}.b;
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("'A' is not fully initialized, field 'b' needs to be set in a constructor",e.getMessage()); }
}
+ @Test
+ public void testVar16() {
+ CodeGen code = new CodeGen(
+"""
+struct S{};
+val x = 1;
+val s = new S{x = 2;};
+return x;
+"""
+);
+ try { code.parse().opto().typeCheck(); fail(); }
+ catch( Exception e ) { assertEquals("Cannot reassign final 'x'",e.getMessage()); }
+ }
+
+
// ---------------------------------------------------------------
@Test
public void testTrinary0() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
return arg ? 1 : 2;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region,1,2);", stop.toString());
- assertEquals(2L, Evaluator.evaluate(stop, 0));
- assertEquals(1L, Evaluator.evaluate(stop, 1));
+ code.parse().opto();
+ assertEquals("return Phi(Region,1,2);", code.print());
+ assertEquals("2", Eval2.eval(code, 0));
+ assertEquals("1", Eval2.eval(code, 1));
}
@Test
public void testTrinary1() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
return arg ? 0 : arg;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return 0;", stop.toString());
- assertEquals(0L, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return 0;", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
}
@Test
public void testTrinary2() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct Bar { int x; };
var b = arg ? new Bar : null;
return b ? b.x++ + b.x++ : -1;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region,1,-1);", stop.toString());
- assertEquals(-1L, Evaluator.evaluate(stop, 0));
- assertEquals( 1L, Evaluator.evaluate(stop, 1));
+ code.parse().opto();
+ assertEquals("return Phi(Region,((.x*2)+1),-1);", code.print());
+ assertEquals("-1", Eval2.eval(code, 0));
+ assertEquals("1", Eval2.eval(code, 1));
}
@Test
public void testTrinary3() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct Bar { int x; };
var b = arg ? new Bar;
return b ? b.x++ + b.x++ : -1;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region,1,-1);", stop.toString());
- assertEquals(-1L, Evaluator.evaluate(stop, 0));
- assertEquals( 1L, Evaluator.evaluate(stop, 1));
+ code.parse().opto();
+ assertEquals("return Phi(Region,((.x*2)+1),-1);", code.print());
+ assertEquals("-1", Eval2.eval(code, 0));
+ assertEquals("1", Eval2.eval(code, 1));
}
@Test
public void testTrinary4() {
// This test case will benefit from an unzipping transformation
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct Bar { Bar? next; int x; };
var b = arg ? new Bar { next = (arg==2) ? new Bar{x=2;}; x=1; };
return b ? b.next ? b.next.x : b.x; // parses "b ? (b.next ? b.next.x : b.x) : 0"
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region,Phi(Region,.x,.x),0);", stop.toString());
- assertEquals( 0L, Evaluator.evaluate(stop, 0));
- assertEquals( 1L, Evaluator.evaluate(stop, 1));
- assertEquals( 2L, Evaluator.evaluate(stop, 2));
+ code.parse().opto();
+ assertEquals("return Phi(Region,Phi(Region,.x,.x),0);", code.print());
+ assertEquals("0", Eval2.eval(code, 0));
+ assertEquals("1", Eval2.eval(code, 1));
+ assertEquals("2", Eval2.eval(code, 2));
}
@Test
public void testTrinary5() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
flt f=arg?1:1.2;
return f; // missing widening
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region,1.0,1.2);", stop.toString());
- assertEquals(1.2, Evaluator.evaluate(stop, 0));
+ code.parse().opto();
+ assertEquals("return Phi(Region,1.0f,1.2);", code.print());
+ assertEquals("1.2", Eval2.eval(code, 0));
+ }
+
+
+ @Test
+ public void testTrinary6() {
+ CodeGen code = new CodeGen("""
+struct S{};
+return arg ? 7 : new S;
+""");
+ try { code.parse().opto().typeCheck(); fail(); }
+ catch( Exception e ) { assertEquals("No common type amongst int and reference",e.getMessage()); }
}
// ---------------------------------------------------------------
@Test
public void testFor0() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
int sum=0;
for( int i=0; i<arg; i++ )
sum += i;
return sum;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", stop.toString());
- assertEquals(3L, Evaluator.evaluate(stop, 3));
- assertEquals(45L, Evaluator.evaluate(stop, 10));
+ code.parse().opto();
+ assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", code.print());
+ assertEquals("3", Eval2.eval(code, 3));
+ assertEquals("45", Eval2.eval(code, 10));
}
@Test
public void testFor1() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
int sum=0, i=0;
for( ; i<arg; i++ )
sum += i;
return sum;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", stop.toString());
- assertEquals(3L, Evaluator.evaluate(stop, 3));
- assertEquals(45L, Evaluator.evaluate(stop, 10));
+ code.parse().opto();
+ assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", code.print());
+ assertEquals("3", Eval2.eval(code, 3));
+ assertEquals("45", Eval2.eval(code, 10));
}
@Test
public void testFor2() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
int sum=0;
for( int i=0; ; i++ ) {
if( i>=arg ) break;
@@ -378,41 +416,41 @@ for( int i=0; ; i++ ) {
}
return sum;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", stop.toString());
- assertEquals(3L, Evaluator.evaluate(stop, 3));
- assertEquals(45L, Evaluator.evaluate(stop, 10));
+ code.parse().opto();
+ assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", code.print());
+ assertEquals("3", Eval2.eval(code, 3));
+ assertEquals("45", Eval2.eval(code, 10));
}
@Test
public void testFor3() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
int sum=0;
for( int i=0; i<arg; )
sum += i++;
return sum;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", stop.toString());
- assertEquals(3L, Evaluator.evaluate(stop, 3));
- assertEquals(45L, Evaluator.evaluate(stop, 10));
+ code.parse().opto();
+ assertEquals("return Phi(Loop,0,(Phi_sum+Phi(Loop,0,(Phi_i+1))));", code.print());
+ assertEquals("3", Eval2.eval(code, 3));
+ assertEquals("45", Eval2.eval(code, 10));
}
@Test
public void testFor4() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
int sum=0;
for( int i=0; i<arg; i++ )
sum += i;
return i;
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("Undefined name 'i'",e.getMessage()); }
}
@Test
public void testFor5() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
for(;;arg++;) {}
""");
- try { parser.parse().iterate(); fail(); }
+ try { code.parse().opto(); fail(); }
catch( Exception e ) { assertEquals("Syntax error, expected Unexpected code after expression: ;",e.getMessage()); }
}
@@ -421,36 +459,36 @@ for(;;arg++;) {}
// ---------------------------------------------------------------
@Test
public void testForward0() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct A{
B? f1;
B? f2;
};
return new A;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return A;", stop.toString());
- assertEquals("Obj<A>{f1=null,f2=null}", Evaluator.evaluate(stop).toString());
+ code.parse().opto();
+ assertEquals("return A;", code.print());
+ assertEquals("A{f1=null,f2=null}", Eval2.eval(code,0));
}
@Test
public void testForward1() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct A{
B?[]? nil_array_of_b;
B?[] not_array_of_b = new B?[0];
};
return new A.not_array_of_b;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return (const)[*B?];", stop.toString());
- assertEquals("Obj<[*B?]>{#=0,[]=[]}", Evaluator.evaluate(stop).toString());
+ code.parse().opto();
+ assertEquals("return (const)[*B?];", code.print());
+ assertEquals("*B?[]", Eval2.eval(code,0));
}
// ---------------------------------------------------------------
@Test
public void testLinkedList2() {
- Parser parser = new Parser("""
+ CodeGen code = new CodeGen("""
struct LLI { LLI? next; int i; };
LLI? !head = null;
while( arg-- )
@@ -461,14 +499,14 @@ for( ; ptr; ptr = ptr.next )
sum += ptr.i;
return sum;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop,0,(Phi_sum+.i));", stop.toString());
- assertEquals(45L, Evaluator.evaluate(stop, 10));
+ code.parse().opto();
+ assertEquals("return Phi(Loop,0,(Phi_sum+.i));", code.print());
+ assertEquals("45", Eval2.eval(code, 10));
}
@Test
public void sieveOfEratosthenes() {
- Parser parser = new Parser(
+ CodeGen code = new CodeGen(
"""
var ary = new bool[arg], primes = new int[arg];
var nprimes=0, p=0;
@@ -492,14 +530,9 @@ for( int j=0; j<nprimes; j++ )
rez[j] = primes[j];
return rez;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return [int];", stop.toString());
- Evaluator.Obj obj = (Evaluator.Obj)Evaluator.evaluate(stop, 20);
- assertEquals("[int] {int #; int ![]; }",obj.struct().toString());
- long nprimes = (Long)obj.fields()[0];
- long[] primes = new long[]{2,3,5,7,11,13,17,19};
- for( int i=0; i<nprimes; i++ )
- assertEquals(primes[i],(long)(Long)obj.fields()[i+1]);
+ code.parse().opto().typeCheck().GCM();
+ assertEquals("return [int];", code.print());
+ assertEquals("int[ 2,3,5,7,11,13,17,19]",Eval2.eval(code, 20));
}
}