summaryrefslogtreecommitdiff
path: root/chapter18/src/test/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-12-21 16:43:03 -0800
committerCliff Click <cliffc@acm.org>2025-01-15 15:07:30 -0800
commit8095c50f846699f7570bdea4c6517653c5795c2e (patch)
tree1d5ed8477dd796766a3a6aa7b6c5d2e6cb883946 /chapter18/src/test/java/com/seaofnodes
parentb0b26bd248fad6f6d2ac23f673ae73095cd5c3cb (diff)
downloadSimple-8095c50f846699f7570bdea4c6517653c5795c2e.tar.gz
Simple-8095c50f846699f7570bdea4c6517653c5795c2e.zip
All parsing null to be TFP or TMP
Insert a TypePtr/TypeNil around TypeMemPtr and TypeFunPtr in the lattice; allows the parsing of "null" to mean either a TMP or TFP null. Cleanup Type null checks and several prints. Drop Type.lub, Type.makeInit. Add a Parser NIL & ZERO. Clean up parser errors, track line numbers for future parser errors.
Diffstat (limited to 'chapter18/src/test/java/com/seaofnodes')
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/BrainFuckTest.java9
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter01Test.java2
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter03Test.java1
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter10Test.java6
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter12Test.java4
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter13Test.java4
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter14Test.java4
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter15Test.java4
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter17Test.java2
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java3
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/TypeTest.java52
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java3
-rw-r--r--chapter18/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java8
13 files changed, 56 insertions, 46 deletions
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/BrainFuckTest.java b/chapter18/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
index 88d79215..b1ca7da9 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/BrainFuckTest.java
@@ -23,7 +23,8 @@ public class BrainFuckTest {
Parser parser = new Parser(
encoded + """
-var d = 0;
+
+int d = 0;
u8[] !output = new u8[0];
u8[] !data = new u8[100];
@@ -41,14 +42,14 @@ for( int pc = 0; pc < program#; pc++ ) {
// Output a byte; increase the output array size
var old = output;
output = new u8[output# + 1];
- for( var i = 0; i < old#; i++ )
+ for( int i = 0; i < old#; i++ )
output[i] = old[i];
output[old#] = data[d]; // Add the extra byte on the end
} else if (command == 44) {
data[d] = 42;
} else if (command == 91) {
if (data[d] == 0) {
- for( var d = 1; d > 0; ) {
+ for( int d = 1; d > 0; ) {
command = program[++pc];
if (command == 91) d++;
if (command == 93) d--;
@@ -56,7 +57,7 @@ for( int pc = 0; pc < program#; pc++ ) {
}
} else if (command == 93) {
if (data[d]) {
- for( var d = 1; d > 0; ) {
+ for( int d = 1; d > 0; ) {
command = program[--pc];
if (command == 93) d++;
if (command == 91) d--;
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter01Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter01Test.java
index f7524c17..44f1af0d 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter01Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter01Test.java
@@ -93,7 +93,7 @@ public class Chapter01Test {
new Parser("return 1;}").parse();
fail();
} catch( RuntimeException e ) {
- assertEquals("Syntax error, unexpected }",e.getMessage());
+ assertEquals("Syntax error, unexpected: }",e.getMessage());
}
}
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter03Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter03Test.java
index 4525918c..62304b38 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter03Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter03Test.java
@@ -1,7 +1,6 @@
package com.seaofnodes.simple;
import com.seaofnodes.simple.node.*;
-import com.seaofnodes.simple.type.TypeInteger;
import org.junit.Test;
import static org.junit.Assert.*;
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter10Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter10Test.java
index d41c83d8..435a2012 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter10Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter10Test.java
@@ -117,7 +117,7 @@ bar.a = 1;
return bar.a;
""");
try { parser.parse().iterate(); fail(); }
- catch( Exception e ) { assertEquals("Type null is not of declared type *Bar",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Type nil is not of declared type *Bar",e.getMessage()); }
}
@Test
@@ -143,7 +143,7 @@ bar.a = 1;
return bar.a;
""");
try { parser.parse(); fail(); }
- catch( Exception e ) { assertEquals("Type null is not of declared type *Bar", e.getMessage()); }
+ catch( Exception e ) { assertEquals("Type nil is not of declared type *Bar", e.getMessage()); }
}
@Test
@@ -156,7 +156,7 @@ if( bar ) bar.a = 1;
return bar;
""");
StopNode stop = parser.parse(false).iterate();
- assertEquals("return Phi(Region,(*void)Phi(Region,null,Bar),null);", stop.toString());
+ assertEquals("return Phi(Region,nil,Bar);", stop.toString());
}
@Test
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter12Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter12Test.java
index a70a5f33..39824d39 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter12Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter12Test.java
@@ -43,7 +43,7 @@ while( 1 ) {
return guess;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return Phi(Loop,(flt)arg,(((ToFloat/Phi_guess)+Phi_guess)/2.0));", stop.toString());
+ assertEquals("return Phi(Loop,(flt)arg,(((ToFloat/Phi_guess)+Phi_guess)/2.0f));", stop.toString());
assertEquals(3.0, Evaluator.evaluate(stop, 9));
assertEquals(1.414213562373095, Evaluator.evaluate(stop, 2));
}
@@ -56,7 +56,7 @@ flt x = arg;
return x+1==x;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return ((flt)arg==(ToFloat+1.0));", stop.toString());
+ assertEquals("return ((flt)arg==(ToFloat+1.0f));", stop.toString());
assertEquals(0L, Evaluator.evaluate(stop, 1));
}
}
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter13Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter13Test.java
index 30d9b147..a3e7c47f 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter13Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter13Test.java
@@ -87,7 +87,7 @@ N n = new N;
return n.next;
""");
StopNode stop = parser.parse().iterate();
- assertEquals("return null;", stop.toString());
+ assertEquals("return nil;", stop.toString());
}
@Test
@@ -113,7 +113,7 @@ N n = new N { next = null; }
return n.next;
""");
try { parser.parse().iterate(); fail(); }
- catch( Exception e ) { assertEquals("Type null is not of declared type *M",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Type nil is not of declared type *M",e.getMessage()); }
}
@Test
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter14Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter14Test.java
index 23c82358..f4e35fe5 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter14Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter14Test.java
@@ -158,11 +158,11 @@ return (arg | 123 ^ 456) >>> 1;
Parser parser = new Parser(
"""
flt f = arg;
-arg = f & 0;
+arg = f & 1;
return arg;
""");
try { parser.parse().iterate(); fail(); }
- catch( Exception e ) { assertEquals("Cannot '&' FltBot",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Cannot '&' flt",e.getMessage()); }
}
@Test
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter15Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter15Test.java
index 4e2682dc..e7dec389 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter15Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter15Test.java
@@ -3,9 +3,7 @@ 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;
+import static org.junit.Assert.*;
public class Chapter15Test {
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter17Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter17Test.java
index 4a7e959a..9a2676d3 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter17Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter17Test.java
@@ -337,7 +337,7 @@ 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("return Phi(Region,1.0f,1.2);", stop.toString());
assertEquals(1.2, Evaluator.evaluate(stop, 0));
}
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java b/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java
index e39fc5d8..e9f8c367 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/Chapter18Test.java
@@ -11,7 +11,8 @@ public class Chapter18Test {
@Test
public void testJig() {
- Parser parser = new Parser("""
+ Parser parser = new Parser(
+"""
return 3.14;
""");
StopNode stop = parser.parse().iterate();
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/TypeTest.java b/chapter18/src/test/java/com/seaofnodes/simple/TypeTest.java
index 61103f54..0fb0d431 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/TypeTest.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/TypeTest.java
@@ -2,7 +2,6 @@ package com.seaofnodes.simple;
import com.seaofnodes.simple.type.*;
import org.junit.Assert;
-import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
@@ -12,19 +11,24 @@ public class TypeTest {
// Test basic properties and GLB
@Test
public void testTypeAdHoc() {
+ Assert.assertEquals( Type.BOTTOM, TypeInteger.TRUE.meet(TypeNil.NIL) );
+ Assert.assertEquals( Type.BOTTOM, TypeInteger.TOP.meet(TypeNil.NIL) );
+
+
TypeStruct s1 = TypeStruct.make("s1", new Field[]{
Field.make("a", TypeInteger.BOT,-1, false),
Field.make("b", TypeInteger.BOT,-2, false) });
TypeStruct s2 = TypeStruct.make("s2", new Field[]{
Field.make("a", TypeInteger.BOT,-3, false),
Field.make("b", TypeInteger.BOT,-4, false) });
- Assert.assertEquals(s1, s1.glb());
+ Assert.assertEquals(s1.makeRO(), s1.glb());
Assert.assertNotEquals(s1, s1.dual());
Assert.assertEquals(s1.makeRO(), s1.dual().glb());
- TypeMem m1 = TypeMem.make(1,TypeInteger.ZERO);
+ //TypeMem m1 = TypeMem.make(1,TypeInteger.ZERO);
+ TypeMem m1 = TypeMem.make(1,TypeNil.NIL);
TypeMem m2 = TypeMem.make(2,TypeInteger.U16);
- TypeMem m3 = TypeMem.make(3,TypeFloat.BOT);
+ TypeMem m3 = TypeMem.make(3,TypeFloat.F64);
TypeMem m4 = TypeMem.make(4,TypeInteger.BOT);
Assert.assertNotEquals(m1, m2);
@@ -32,47 +36,50 @@ public class TypeTest {
Assert.assertNotEquals(m3, m4);
Assert.assertEquals(TypeStruct.BOT, s1.meet(s2));
- Assert.assertEquals(TypeMem.make(0,TypeInteger.U16), m1.meet(m2));
- Assert.assertEquals(TypeMem .BOT, m2.meet(m3));
+ Assert.assertEquals(TypeMem .BOT, m1.meet(m2));
+ Assert.assertEquals(TypeMem.make(0,TypeFloat.F64), m1.meet(m3));
Assert.assertEquals(TypeMem .BOT, m3.meet(m4));
- Assert.assertEquals(TypeMem.make(1,TypeInteger.BOT), m1.glb());
- Assert.assertEquals(TypeMem.make(1,TypeInteger.ZERO), m1.dual());
+ Assert.assertEquals(m1, m1.glb());
+ //Assert.assertEquals(TypeMem.make(1,TypeInteger.ZERO), m1.dual());
+ Assert.assertEquals(TypeMem.make(1,Type.XNIL), m1.dual());
Assert.assertEquals(m4.dual(), m4.glb().dual());
- TypeMemPtr ptr1 = TypeMemPtr.make(s1);
+ TypeMemPtr ptr1 = TypeMemPtr.make((byte)2, s1);
Assert.assertEquals(s1, ptr1._obj);
- TypeMemPtr ptr2 = TypeMemPtr.make(s2);
+ TypeMemPtr ptr2 = TypeMemPtr.make((byte)2, s2);
Assert.assertEquals(s2, ptr2._obj);
- TypeMemPtr ptr1nil = TypeMemPtr.make(s1, true);
+ TypeMemPtr ptr1nil = TypeMemPtr.make(s1);
Assert.assertEquals(s1, ptr1nil._obj);
- Assert.assertTrue(ptr1nil._nil);
- Assert.assertFalse(ptr1nil._obj==null);
- TypeMemPtr ptr2nil = TypeMemPtr.make(s2, true);
+ assertEquals( 3, ptr1nil._nil );
+ Assert.assertNotNull( ptr1nil._obj );
+ TypeMemPtr ptr2nil = TypeMemPtr.make( s2);
Assert.assertEquals(s2, ptr2nil._obj);
Assert.assertNotEquals(ptr1, ptr2);
Assert.assertNotEquals(ptr1, ptr1.glb());
- Assert.assertEquals(ptr1nil, ptr1.glb());
+ Assert.assertEquals(ptr1nil.makeRO(), ptr1.glb());
Assert.assertEquals(ptr1, ptr1.dual().dual());
Assert.assertEquals(ptr1.glb().makeRO(), ptr1.dual().glb());
- Assert.assertEquals(TypeMemPtr.make(TypeStruct.BOT,true), ptr1.meet(ptr2nil));
- Assert.assertEquals(ptr1.glb(), ptr1.meet(TypeMemPtr.NULLPTR));
+ Assert.assertEquals(TypeMemPtr.make((byte)3,TypeStruct.BOT), ptr1.meet(ptr2nil));
+ //Assert.assertEquals(ptr1.glb(), ptr1.meet(TypeMemPtr.NULLPTR));
+ Assert.assertEquals(ptr1.glb(), ptr1.meet(TypeNil.NIL).makeRO());
TypeMemPtr TOP = TypeMemPtr.TOP;
- TypeMemPtr BOT = TypeMemPtr.make(TypeStruct.BOT,true );
- TypeMemPtr PTR = TypeMemPtr.make(TypeStruct.BOT,false);
- TypeMemPtr NULL = TypeMemPtr.NULLPTR;
+ TypeMemPtr BOT = TypeMemPtr.make((byte)3,TypeStruct.BOT);
+ TypeMemPtr PTR = TypeMemPtr.make((byte)2,TypeStruct.BOT);
+ //TypeMemPtr NULL = TypeMemPtr.NULLPTR;
+ Type NULL = TypeNil.NIL;
Type PTR_meet_NULL = NULL.meet(PTR);
Assert.assertEquals(BOT, PTR_meet_NULL);
Type ptr1_meet_ptr2 = ptr1.meet(ptr2);
Assert.assertEquals(PTR, ptr1_meet_ptr2);
Type NULL_join_ptr1 = NULL.join(ptr1);
- Assert.assertEquals(TOP, NULL_join_ptr1);
+ Assert.assertEquals(TypePtr.XNPTR, NULL_join_ptr1);
Type NULL_join_PTR = PTR.join(NULL);
- Assert.assertEquals(TOP, NULL_join_PTR);
+ Assert.assertEquals(TypePtr.XNPTR, NULL_join_PTR);
Type ptr1_dual = ptr1.dual();
Type nullableptr1_dual = ptr1nil.dual();
}
@@ -153,5 +160,4 @@ public class TypeTest {
assertSame(TypeStruct.S1,d1);
}
-
}
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java b/chapter18/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
index 72f84fa2..ac442585 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java
@@ -263,6 +263,7 @@ public class Evaluator {
private double vald(Node node) {
var v = val(node);
if (v instanceof Number n) return n.doubleValue();
+ if( v == null ) return 0;
throw new AssertionError("Not a double " + v);
}
@@ -270,7 +271,7 @@ public class Evaluator {
var type = cons.compute();
if (type instanceof TypeInteger i) return i.value();
if (type instanceof TypeFloat i) return i.value();
- assert type instanceof TypeMemPtr;
+ assert type == Type.NIL;
return null;
}
diff --git a/chapter18/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java b/chapter18/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
index 51e39cd0..e86fb7b8 100644
--- a/chapter18/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
+++ b/chapter18/src/test/java/com/seaofnodes/simple/fuzzer/Fuzzer.java
@@ -46,8 +46,8 @@ public class Fuzzer {
e.printStackTrace(System.out);
System.out.println("========== Seed ==========");
System.out.println(seed);
- System.out.println("========== Code ===========");
- System.out.println(script);
+ //System.out.println("========== Code ===========");
+ //System.out.println(script);
System.out.println("========= Reduced =========");
System.out.println(Reducer.reduce(script, e, reproducer));
System.out.println("===========================");
@@ -63,6 +63,10 @@ public class Fuzzer {
}
return false;
}
+ if( a==null && b == Long.valueOf(0) )
+ return false;
+ if( b==null && a == Long.valueOf(0) )
+ return false;
return true;
}