summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/Chapter15Test.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/seaofnodes/simple/Chapter15Test.java')
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter15Test.java89
1 files changed, 42 insertions, 47 deletions
diff --git a/src/test/java/com/seaofnodes/simple/Chapter15Test.java b/src/test/java/com/seaofnodes/simple/Chapter15Test.java
index 643b45e7..068f8f42 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter15Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter15Test.java
@@ -24,8 +24,8 @@ return 3.14;
public void testCyclic() {
Parser parser = new Parser(
"""
-struct C { C? l; };
-C c = new C;
+struct C { !C? !l; };
+!C !c = new C;
c.l = c;
return c;
""");
@@ -39,7 +39,7 @@ return c;
Parser parser = new Parser(
"""
u8[] old = new u8[0];
-u8[] output = new u8[1];
+u8[] !output = new u8[1];
int i = 0;
while (i < old#) {
output[i] = old[i];
@@ -82,7 +82,7 @@ return is[1];
public void testBasic3() {
Parser parser = new Parser(
"""
-int[] a = new int[2];
+int[] !a = new int[2];
a[0] = 1;
a[1] = 2;
return a[0];
@@ -97,7 +97,7 @@ return a[0];
Parser parser = new Parser(
"""
struct A { int i; };
-A?[] a = new A?[2];
+!A?[] !a = new !A?[2];
return a;
""");
StopNode stop = parser.parse().iterate();
@@ -111,16 +111,16 @@ return a;
"""
struct S { int x; flt y; };
// A new S
-S s = new S; s.x=99; s.y = 3.14;
+!S !s = new S; s.x=99; s.y = 3.14;
// Double-d array of Ss. Fill in one row.
-S?[]?[] iss = new S?[]?[2];
-iss[0] = new S?[7];
+!S?[]?[] !iss = new !S?[]?[2];
+iss[0] = new !S?[7];
iss[0][2] = s;
// Now pull out the filled-in value, with null checks
flt rez;
-S?[]? is = iss[arg];
+!S?[]? is = iss[arg];
if( !is ) rez = 1.2;
else {
S? i = is[2];
@@ -130,24 +130,22 @@ else {
return rez;
""");
StopNode stop = parser.parse().iterate();
- // Shared allocation memory prevents folding the field Store into New.
- assertEquals("return Phi(Region121,1.2,Phi(Region118,2.3,.y));", stop.toString());
+ assertEquals("return Phi(Region,1.2,Phi(Region,2.3,.y));", stop.toString());
assertEquals(3.14, Evaluator.evaluate(stop, 0));
assertEquals(1.2 , Evaluator.evaluate(stop, 1));
}
- @Ignore
@Test
public void testBasic6() {
Parser parser = new Parser(
"""
struct S { int x; flt y; };
// A new S
-S s = new S; s.x=99; s.y = 3.14;
+!S !s = new S; s.x=99; s.y = 3.14;
// Double-d array of Ss. Fill in one row.
-S?[]?[] iss = new S?[]?[2];
-iss[0] = new S?[7];
+!S?[]?[] iss = new !S?[]?[2];
+iss[0] = new !S?[7];
iss[0][2] = s;
// Now pull out the filled-in value, with null checks
@@ -157,9 +155,8 @@ if( iss[arg] )
rez = iss[arg][2].y;
return rez;
""");
- StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Region122,Phi(Region118,.y,1.2),1.2);", stop.toString());
- assertEquals(3.14, Evaluator.evaluate(stop, 0));
+ try { parser.parse().iterate(); fail(); }
+ catch( Exception e ) { assertEquals("Might be null accessing '[]'",e.getMessage()); }
}
@Test
@@ -167,9 +164,9 @@ return rez;
Parser parser = new Parser(
"""
// Can we define a forward-reference array?
-struct Tree { Tree?[]? _kids; };
-Tree root = new Tree;
-root._kids = new Tree?[2];
+struct Tree { !Tree?[]? !_kids; };
+!Tree !root = new Tree;
+root._kids = new !Tree?[2]; // NO BANG SO ARRAY IS OF IMMUTABLE TREES????
root._kids[0] = new Tree;
return root;
""");
@@ -182,7 +179,7 @@ return root;
public void testNestedStructAddMemProj() {
Parser parser = new Parser(
"""
-struct S { int a; int[] b; };
+struct S { int a; int[] !b; };
return 0;
""");
StopNode stop = parser.parse();
@@ -193,7 +190,7 @@ return 0;
public void testRollingSum() {
Parser parser = new Parser(
"""
-int[] ary = new int[arg];
+int[] !ary = new int[arg];
// Fill [0,1,2,3,4,...]
int i=0;
while( i < ary# ) {
@@ -217,44 +214,42 @@ return ary[1] * 1000 + ary[3]; // 1 * 1000 + 6
public void sieveOEratosthenes() {
Parser parser = new Parser(
"""
-int[] ary = new int[arg];
-int[] primes = new int[arg];
-int nprimes = 0;
-// Find primes
-int j=2;
-while( j*j < arg ) {
- while( ary[j]==1 ) j = j + 1;
- // j is now a prime
- primes[nprimes] = j; nprimes = nprimes + 1;
+int[] !ary = new int[arg], !primes = new int[arg];
+int nprimes = 0, p=2;
+// Find primes while p^2 < arg
+while( p*p < arg ) {
+ // skip marked non-primes
+ while( ary[p]==1 ) p = p + 1;
+ // p is now a prime
+ primes[nprimes] = p; nprimes = nprimes + 1;
// Mark out the rest non-primes
- int i = j + j;
+ int i = p + p;
while( i < ary# ) {
ary[i] = 1;
- i = i + j;
+ i = i + p;
}
- j = j + 1;
+ p = p + 1;
}
-// Now just collect the remaining primes
-while( j < arg ) {
- if( ary[j] == 0 ) {
- primes[nprimes] = j; nprimes = nprimes + 1;
+// Now just collect the remaining primes, no more marking
+while( p < arg ) {
+ if( ary[p] == 0 ) {
+ primes[nprimes] = p; nprimes = nprimes + 1;
}
- j = j + 1;
+ p = p + 1;
}
-// Shrink the result array to size
-int[] rez = new int[nprimes];
-j = 0;
+// Copy/shrink the result array
+int[] !rez = new int[nprimes];
+int j = 0;
while( j < nprimes ) {
rez[j] = primes[j];
j = j + 1;
}
-
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());
+ 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++ )
@@ -266,8 +261,8 @@ return rez;
Parser parser = new Parser(
"""
struct S {int i; flt f;};
-S s1 = new S;
-S s2 = new S;
+!S !s1 = new S;
+!S !s2 = new S;
s2.i = 3;
s2.f = 2.0;
if (arg) s1 = new S;