From 799ba3a8d2603a51fc5b860f7845e72e6af61c38 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Thu, 25 Jul 2024 23:46:39 +0300 Subject: Float bugs Fix bug infinite loop finding. Fix inf loops before printing graph. Missing float unary negate . Generator makes float exprs Fix missing dep in LCA finding --- .../java/com/seaofnodes/simple/Chapter11Test.java | 6 +++--- .../java/com/seaofnodes/simple/Chapter12Test.java | 20 +++++++++++++++---- .../java/com/seaofnodes/simple/FuzzerWrap.java | 1 - .../com/seaofnodes/simple/evaluator/Evaluator.java | 7 ++++--- .../seaofnodes/simple/fuzzer/ScriptGenerator.java | 23 +++++++++++++--------- 5 files changed, 37 insertions(+), 20 deletions(-) (limited to 'chapter12/src/test/java/com/seaofnodes') diff --git a/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java index 9b05d66c..6c1f7938 100644 --- a/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java +++ b/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java @@ -292,7 +292,7 @@ else { } """); StopNode stop = parser.parse(false).iterate(false); - assertEquals("Stop[ return 9; return 0; return 0; ]", stop.toString()); + assertEquals("Stop[ return 9; return 0; return 0; return 0; return 0; ]", stop.toString()); } @@ -433,8 +433,8 @@ while( -arg ) while(1) arg = arg+ptr.v; """); - StopNode stop = parser.parse(false).iterate(false); - assertEquals("return 0;", stop.toString()); + StopNode stop = parser.parse(false).iterate(true); + assertEquals("Stop[ return 0; return 0; ]", stop.toString()); } @Test diff --git a/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java b/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java index bfd6c309..af8fdfe9 100644 --- a/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java +++ b/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java @@ -6,15 +6,27 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; public class Chapter12Test { + @Test + public void testJig() { + Parser parser = new Parser( +""" +return 3.14; +"""); + StopNode stop = parser.parse(false).iterate(false); + assertEquals("return 3.14;", stop.toString()); + assertEquals(3.14, Evaluator.evaluate(stop, 0)); + } + @Test public void testFloat() { Parser parser = new Parser( """ return 3.14; """); - StopNode stop = parser.parse(false).iterate(true); + StopNode stop = parser.parse(false).iterate(false); assertEquals("return 3.14;", stop.toString()); assertEquals(3.14, Evaluator.evaluate(stop, 0)); } @@ -31,7 +43,7 @@ while( 1 ) { } return guess; """); - StopNode stop = parser.parse(false).iterate(true); + StopNode stop = parser.parse(false).iterate(false); assertEquals("return Phi(Loop9,(flt)arg,(((ToFloat/Phi_guess)+Phi_guess)/2.0));", stop.toString()); assertEquals(3.0, Evaluator.evaluate(stop, 9)); assertEquals(1.414213562373095, Evaluator.evaluate(stop, 2)); @@ -44,8 +56,8 @@ return guess; flt x = arg; return x+1==x; """); - StopNode stop = parser.parse(false).iterate(true); - assertEquals("return (((flt)arg+1.0)==ToFloat);", stop.toString()); + StopNode stop = parser.parse(false).iterate(false); + assertEquals("return ((flt)arg==(ToFloat+1.0));", stop.toString()); assertEquals(0L, Evaluator.evaluate(stop, 1)); } diff --git a/chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java b/chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java index 699711fc..efd76481 100644 --- a/chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java +++ b/chapter12/src/test/java/com/seaofnodes/simple/FuzzerWrap.java @@ -14,7 +14,6 @@ import static org.junit.Assert.assertTrue; */ public class FuzzerWrap { - @Ignore @Test public void fuzzPeeps() { var fuzzer = new Fuzzer(); diff --git a/chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java b/chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java index 09bda290..ab5c9bbd 100644 --- a/chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java +++ b/chapter12/src/test/java/com/seaofnodes/simple/evaluator/Evaluator.java @@ -135,15 +135,16 @@ public class Evaluator { case ConstantNode cons -> cons(cons); case AddNode add -> vall(add.in(1)) + vall(add.in(2)); case AddFNode add -> vald(add.in(1)) + vald(add.in(2)); - case BoolNode.EQ eq -> Objects.equals(val(eq.in(1)), val(eq.in(2))) ? 1L : 0L; - case BoolNode.LE le -> vall(le.in(1)) <= vall(le.in(2)) ? 1L : 0L; - case BoolNode.LT lt -> vall(lt.in(1)) < vall(lt.in(2)) ? 1L : 0L; case BoolNode.EQF eq -> Objects.equals(val(eq.in(1)), val(eq.in(2))) ? 1L : 0L; case BoolNode.LEF le -> vald(le.in(1)) <= vald(le.in(2)) ? 1L : 0L; case BoolNode.LTF lt -> vald(lt.in(1)) < vald(lt.in(2)) ? 1L : 0L; + case BoolNode.EQ eq -> Objects.equals(val(eq.in(1)), val(eq.in(2))) ? 1L : 0L; + case BoolNode.LE le -> vall(le.in(1)) <= vall(le.in(2)) ? 1L : 0L; + case BoolNode.LT lt -> vall(lt.in(1)) < vall(lt.in(2)) ? 1L : 0L; case DivNode div -> div(div); case DivFNode div -> div(div); case MinusNode minus -> -vall(minus.in(1)); + case MinusFNode minus -> -vald(minus.in(1)); case MulNode mul -> vall(mul.in(1)) * vall(mul.in(2)); case MulFNode mul -> vald(mul.in(1)) * vald(mul.in(2)); case NotNode not -> isTrue(val(not.in(1))) ? 0L : 1L; diff --git a/chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java b/chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java index 155063ab..053be297 100644 --- a/chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java +++ b/chapter12/src/test/java/com/seaofnodes/simple/fuzzer/ScriptGenerator.java @@ -90,6 +90,7 @@ public class ScriptGenerator { } private static final Type TYPE_INT = new Type("int"); + private static final Type TYPE_FLT = new Type("flt"); private static class Variable { @@ -343,7 +344,9 @@ public class ScriptGenerator { * @return A random type */ private Type getType() { - if (structs.isEmpty() || random.nextBoolean()) return TYPE_INT; + int t = random.nextInt(10); + if( t<5 || structs.isEmpty() ) return TYPE_INT; + if( t<7 ) return TYPE_FLT; var idx = random.nextInt(structs.size()); TypeStruct struct = structs.get(idx); if (random.nextBoolean()) return struct.nullable; @@ -415,7 +418,7 @@ public class ScriptGenerator { indentation += INDENTATION; for (int i=0; i0) { - genUnary(TYPE_INT); + genUnary(type); sb.append(BINARY_OP[random.nextInt(BINARY_OP.length)]); } - genUnary(TYPE_INT); + genUnary(type); } /** @@ -696,7 +699,7 @@ public class ScriptGenerator { */ public void genUnary(Type type) { if (generateInvalid()) type = getType(); - if (type != TYPE_INT) { + if (type != TYPE_INT && type != TYPE_FLT) { genSuffix(type); return; } @@ -704,7 +707,7 @@ public class ScriptGenerator { while(num-->0) { sb.append(UNARY_OP[random.nextInt(UNARY_OP.length)]); } - genSuffix(TYPE_INT); + genSuffix(type); } /** @@ -712,7 +715,7 @@ public class ScriptGenerator { */ public void genSuffix(Type type) { if (generateInvalid()) type = getType(); - if (type == TYPE_INT && random.nextBoolean()) { + if ((type == TYPE_INT || type == TYPE_FLT) && random.nextBoolean()) { var t = getType(); if (generateInvalid()) { var field = getRandomName(); @@ -721,7 +724,7 @@ public class ScriptGenerator { return; } else if (t instanceof TypeStruct s && s.fields.length > 0) { var field = s.fields[random.nextInt(s.fields.length)]; - if (field.type == TYPE_INT) { + if (field.type == TYPE_INT || field.type == TYPE_FLT) { genPrimary(t); sb.append(".").append(field.name); return; @@ -762,6 +765,8 @@ public class ScriptGenerator { case 1 -> sb.append("false"); default -> sb.append(random.nextInt(1<<(rand-2))); } + } else if (type == TYPE_FLT) { + sb.append(random.nextFloat()); } else if (type instanceof TypeNullable n) { if (random.nextBoolean()) { sb.append("null"); -- cgit v1.2.3