diff graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ImplicitCastTest.java @ 12392:4e26955b6da2

Truffle-DSL: new implicit cast code generation layout supports now executeWith.
author Christian Humer <christian.humer@gmail.com>
date Thu, 03 Oct 2013 18:07:59 +0200
parents 7aa2a8c69ba3
children 7cce548b0b60
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ImplicitCastTest.java	Thu Oct 03 16:31:09 2013 +0200
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ImplicitCastTest.java	Thu Oct 03 18:07:59 2013 +0200
@@ -26,6 +26,8 @@
 
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.dsl.test.ImplicitCastTestFactory.ImplicitCast0NodeFactory;
+import com.oracle.truffle.api.dsl.test.ImplicitCastTestFactory.ImplicitCast1NodeFactory;
+import com.oracle.truffle.api.dsl.test.ImplicitCastTestFactory.ImplicitCast2NodeFactory;
 import com.oracle.truffle.api.dsl.test.NodeContainerTest.Str;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
@@ -54,12 +56,12 @@
 
         public abstract Object executeEvaluated(VirtualFrame frame, Object value2);
 
-        @Specialization
+        @Specialization(order = 1)
         public String op1(String value) {
             return value;
         }
 
-        @Specialization
+        @Specialization(order = 2)
         public boolean op1(boolean value) {
             return value;
         }
@@ -77,40 +79,81 @@
         Assert.assertEquals(true, root.getNode().executeEvaluated(null, true));
     }
 
-// @TypeSystemReference(ImplicitCast0Types.class)
-// @NodeChild(value = "operand", type = ImplicitCast0Node.class)
-// abstract static class ImplicitCast1Node extends ValueNode {
-//
-// @Specialization
-// public String op0(String value) {
-// return value;
-// }
-//
-// @Specialization(order = 1, rewriteOn = RuntimeException.class)
-// public boolean op1(@SuppressWarnings("unused") boolean value) throws RuntimeException {
-// throw new RuntimeException();
-// }
-//
-// @Specialization(order = 2)
-// public boolean op2(boolean value) {
-// return value;
-// }
-//
-// }
-//
-// @Test
-// public void testImplicitCast1() {
-// ImplicitCast0Node node = ImplicitCast0NodeFactory.create(null);
-// TestRootNode<ImplicitCast0Node> root = new TestRootNode<>(node);
-// Assert.assertEquals("2", root.getNode().executeEvaluated(null, "2"));
-// Assert.assertEquals(true, root.getNode().executeEvaluated(null, 1));
-// Assert.assertEquals("1", root.getNode().executeEvaluated(null, "1"));
-// Assert.assertEquals(true, root.getNode().executeEvaluated(null, 1));
-// Assert.assertEquals(true, root.getNode().executeEvaluated(null, true));
-// }
+    @TypeSystemReference(ImplicitCast0Types.class)
+    @NodeChild(value = "operand", type = ImplicitCast1Node.class)
+    // TODO temporary workaround
+    @PolymorphicLimit(1)
+    abstract static class ImplicitCast1Node extends ValueNode {
+
+        public abstract Object executeEvaluated(VirtualFrame frame, Object operand);
+
+        @Specialization(order = 0)
+        public String op0(String value) {
+            return value;
+        }
+
+        @Specialization(order = 1, rewriteOn = RuntimeException.class)
+        public boolean op1(@SuppressWarnings("unused") boolean value) throws RuntimeException {
+            throw new RuntimeException();
+        }
+
+        @Specialization(order = 2)
+        public boolean op2(boolean value) {
+            return value;
+        }
+
+    }
+
+    @Test
+    public void testImplicitCast1() {
+        ImplicitCast1Node node = ImplicitCast1NodeFactory.create(null);
+        TestRootNode<ImplicitCast1Node> root = new TestRootNode<>(node);
+        Assert.assertEquals("2", root.getNode().executeEvaluated(null, "2"));
+        Assert.assertEquals(true, root.getNode().executeEvaluated(null, 1));
+        Assert.assertEquals("1", root.getNode().executeEvaluated(null, "1"));
+        Assert.assertEquals(true, root.getNode().executeEvaluated(null, 1));
+        Assert.assertEquals(true, root.getNode().executeEvaluated(null, true));
+    }
 
-    // TODO assert implicit casts only in one direction
+    @TypeSystemReference(ImplicitCast0Types.class)
+    @NodeChildren({@NodeChild(value = "operand0", type = ImplicitCast2Node.class), @NodeChild(value = "operand1", type = ImplicitCast2Node.class, executeWith = "operand0")})
+    // TODO temporary workaround
+    @PolymorphicLimit(1)
+    abstract static class ImplicitCast2Node extends ValueNode {
+
+        @Specialization(order = 0)
+        public String op0(String v0, String v1) {
+            return v0 + v1;
+        }
+
+        @SuppressWarnings("unused")
+        @Specialization(order = 1, rewriteOn = RuntimeException.class)
+        public boolean op1(boolean v0, boolean v1) throws RuntimeException {
+            throw new RuntimeException();
+        }
 
-    // test example that covers the most cases
+        @Specialization(order = 2)
+        public boolean op2(boolean v0, boolean v1) {
+            return v0 && v1;
+        }
+
+        public abstract Object executeEvaluated(VirtualFrame frame, Object v1);
+
+        public abstract Object executeEvaluated(VirtualFrame frame, Object v1, Object v2);
+
+        public abstract Object executeEvaluated(VirtualFrame frame, boolean v1, boolean v2);
+
+    }
+
+    @Test
+    public void testImplicitCast2() {
+        ImplicitCast2Node node = ImplicitCast2NodeFactory.create(null, null);
+        TestRootNode<ImplicitCast2Node> root = new TestRootNode<>(node);
+        Assert.assertEquals("2", root.getNode().executeEvaluated(null, "2"));
+        Assert.assertEquals(true, root.getNode().executeEvaluated(null, 1));
+        Assert.assertEquals("1", root.getNode().executeEvaluated(null, "1"));
+        Assert.assertEquals(true, root.getNode().executeEvaluated(null, 1));
+        Assert.assertEquals(true, root.getNode().executeEvaluated(null, true));
+    }
 
 }