changeset 22300:c53c4de22c4f

Truffle/DSL: fix and tests for multiple assumptions expressions
author Benoit Daloze <benoit.daloze@jku.at>
date Sat, 10 Oct 2015 14:48:47 +0200
parents 93904485c5a5
children 26e79a4358fe
files truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/AssumptionsTest.java truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java
diffstat 2 files changed, 80 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/AssumptionsTest.java	Sat Oct 10 13:22:36 2015 +0200
+++ b/truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/AssumptionsTest.java	Sat Oct 10 14:48:47 2015 +0200
@@ -44,6 +44,8 @@
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.CacheAssumptionTestFactory;
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.FieldTestFactory;
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MethodTestFactory;
+import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionArraysTestFactory;
+import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionsTestFactory;
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.NodeFieldTest2Factory;
 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.StaticFieldTestFactory;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
@@ -206,6 +208,46 @@
     }
 
     @Test
+    public void testMultipleAssumptions() {
+        CallTarget root = createCallTarget(MultipleAssumptionsTestFactory.getInstance());
+        MultipleAssumptionsTest node = getNode(root);
+        node.assumption1 = Truffle.getRuntime().createAssumption();
+        node.assumption2 = Truffle.getRuntime().createAssumption();
+
+        assertEquals("do1", root.call(42));
+        node.assumption1.invalidate();
+        assertEquals("do2", root.call(42));
+
+        CallTarget root2 = createCallTarget(MultipleAssumptionsTestFactory.getInstance());
+        MultipleAssumptionsTest node2 = getNode(root2);
+        node2.assumption1 = Truffle.getRuntime().createAssumption();
+        node2.assumption2 = Truffle.getRuntime().createAssumption();
+
+        assertEquals("do1", root2.call(42));
+        node2.assumption2.invalidate();
+        assertEquals("do2", root2.call(42));
+    }
+
+    @NodeChild
+    @SuppressWarnings("unused")
+    static class MultipleAssumptionsTest extends ValueNode {
+
+        Assumption assumption1;
+        Assumption assumption2;
+
+        @Specialization(assumptions = {"assumption1", "assumption2"})
+        static String do1(int value) {
+            return "do1";
+        }
+
+        @Specialization
+        static String do2(int value) {
+            return "do2";
+        }
+
+    }
+
+    @Test
     public void testAssumptionArrays() {
         CallTarget root = createCallTarget(AssumptionArrayTestFactory.getInstance());
         AssumptionArrayTest node = getNode(root);
@@ -240,6 +282,43 @@
 
     }
 
+    @Test
+    public void testMultipleAssumptionArrays() {
+        CallTarget root = createCallTarget(MultipleAssumptionArraysTestFactory.getInstance());
+        MultipleAssumptionArraysTest node = getNode(root);
+
+        Assumption a1 = Truffle.getRuntime().createAssumption();
+        Assumption a2 = Truffle.getRuntime().createAssumption();
+
+        node.assumptions1 = new Assumption[]{a1};
+        node.assumptions2 = new Assumption[]{a2};
+
+        assertEquals("do1", root.call(42));
+
+        a2.invalidate();
+
+        assertEquals("do2", root.call(42));
+    }
+
+    @NodeChild
+    @SuppressWarnings("unused")
+    static class MultipleAssumptionArraysTest extends ValueNode {
+
+        Assumption[] assumptions1;
+        Assumption[] assumptions2;
+
+        @Specialization(assumptions = {"assumptions1", "assumptions2"})
+        static String do1(int value) {
+            return "do1";
+        }
+
+        @Specialization
+        static String do2(int value) {
+            return "do2";
+        }
+
+    }
+
     @NodeChild
     static class ErrorIncompatibleReturnType extends ValueNode {
         @ExpectError("Incompatible return type int. Assumptions must be assignable to Assumption or Assumption[].")
--- a/truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java	Sat Oct 10 13:22:36 2015 +0200
+++ b/truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java	Sat Oct 10 14:48:47 2015 +0200
@@ -1159,6 +1159,7 @@
                 assumptionExpression.addError("Error parsing expression '%s': %s", assumption, e.getMessage());
             }
             assumptionExpressions.add(assumptionExpression);
+            assumptionId++;
         }
         specialization.setAssumptionExpressions(assumptionExpressions);
     }