diff graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/GuardsTest.java @ 11439:efe58aa92f86

Truffle-DSL: guards can now be declared using any base type or interface of the target value type.
author Christian Humer <christian.humer@gmail.com>
date Tue, 27 Aug 2013 22:08:26 +0200
parents 79041ab43660
children d6a5ab791b0d
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/GuardsTest.java	Tue Aug 27 18:11:35 2013 +0200
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/GuardsTest.java	Tue Aug 27 22:08:26 2013 +0200
@@ -29,7 +29,16 @@
 
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.dsl.test.GuardsTestFactory.GlobalFlagGuardFactory;
+import com.oracle.truffle.api.dsl.test.GuardsTestFactory.GuardWithBaseClassFactory;
+import com.oracle.truffle.api.dsl.test.GuardsTestFactory.GuardWithBaseInterfaceFactory;
+import com.oracle.truffle.api.dsl.test.GuardsTestFactory.GuardWithBoxedPrimitiveFactory;
+import com.oracle.truffle.api.dsl.test.GuardsTestFactory.GuardWithObjectFactory;
 import com.oracle.truffle.api.dsl.test.GuardsTestFactory.InvocationGuardFactory;
+import com.oracle.truffle.api.dsl.test.GuardsTestFactory.TestGuardResolve1Factory;
+import com.oracle.truffle.api.dsl.test.GuardsTestFactory.TestGuardResolve2Factory;
+import com.oracle.truffle.api.dsl.test.GuardsTestFactory.TestGuardResolve3Factory;
+import com.oracle.truffle.api.dsl.test.NodeContainerTest.Str;
+import com.oracle.truffle.api.dsl.test.NodeContainerTest.StrBase;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode;
 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
 
@@ -107,4 +116,159 @@
         }
     }
 
+    @Test
+    public void testGuardWithBaseClass() {
+        TestRootNode<?> root = createRoot(GuardWithBaseClassFactory.getInstance());
+
+        assertEquals(42, executeWith(root, new Str("42")));
+    }
+
+    @NodeChild("expression")
+    public abstract static class GuardWithBaseClass extends ValueNode {
+
+        boolean baseGuard(StrBase base) {
+            return true;
+        }
+
+        @Specialization(guards = "baseGuard")
+        int doSpecialized(Str value0) {
+            return 42;
+        }
+    }
+
+    @Test
+    public void testGuardWithBaseInterface() {
+        TestRootNode<?> root = createRoot(GuardWithBaseInterfaceFactory.getInstance());
+
+        assertEquals(42, executeWith(root, "anything"));
+    }
+
+    @NodeChild("expression")
+    public abstract static class GuardWithBaseInterface extends ValueNode {
+
+        boolean baseGuard(CharSequence base) {
+            return true;
+        }
+
+        @Specialization(guards = "baseGuard")
+        int doSpecialized(String value0) {
+            return 42;
+        }
+    }
+
+    @Test
+    public void testGuardWithPrimitive() {
+        TestRootNode<?> root = createRoot(GuardWithBoxedPrimitiveFactory.getInstance());
+
+        assertEquals(42, executeWith(root, 42));
+    }
+
+    @NodeChild("expression")
+    public abstract static class GuardWithBoxedPrimitive extends ValueNode {
+
+        boolean baseGuard(Integer primitive) {
+            return true;
+        }
+
+        @Specialization(guards = "baseGuard")
+        int doSpecialized(int value0) {
+            return value0;
+        }
+    }
+
+    @Test
+    public void testGuardWithObject() {
+        TestRootNode<?> root = createRoot(GuardWithObjectFactory.getInstance());
+
+        assertEquals(42, executeWith(root, 42));
+    }
+
+    @NodeChild("expression")
+    public abstract static class GuardWithObject extends ValueNode {
+
+        boolean baseGuard(Object primitive) {
+            return true;
+        }
+
+        @Specialization(guards = "baseGuard")
+        int doSpecialized(int value0) {
+            return value0;
+        }
+    }
+
+    @Test
+    public void testGuardResolve1() {
+        TestRootNode<?> root = createRoot(TestGuardResolve1Factory.getInstance());
+
+        assertEquals(42, executeWith(root, 42));
+    }
+
+    @NodeChild("expression")
+    public abstract static class TestGuardResolve1 extends ValueNode {
+
+        boolean guard(Object primitive) {
+            return false;
+        }
+
+        boolean guard(int primitive) {
+            return true;
+        }
+
+        @Specialization(guards = "guard")
+        int doSpecialized(int value0) {
+            return value0;
+        }
+    }
+
+    @Test
+    public void testGuardResolve2() {
+        TestRootNode<?> root = createRoot(TestGuardResolve2Factory.getInstance());
+        assertEquals(42, executeWith(root, new Str("")));
+    }
+
+    @NodeChild("expression")
+    public abstract static class TestGuardResolve2 extends ValueNode {
+
+        boolean guard(Object primitive) {
+            return false;
+        }
+
+        boolean guard(StrBase primitive) {
+            return true;
+        }
+
+        @Specialization(guards = "guard")
+        int doSpecialized(Str value0) {
+            return 42;
+        }
+    }
+
+    @Test
+    public void testGuardResolve3() {
+        TestRootNode<?> root = createRoot(TestGuardResolve3Factory.getInstance());
+
+        assertEquals(42, executeWith(root, new Str("")));
+    }
+
+    @NodeChild("expression")
+    public abstract static class TestGuardResolve3 extends ValueNode {
+
+        boolean guard(Object primitive) {
+            return false;
+        }
+
+        boolean guard(StrBase primitive) {
+            return false;
+        }
+
+        boolean guard(Str primitive) {
+            return true;
+        }
+
+        @Specialization(guards = "guard")
+        int doSpecialized(Str value0) {
+            return 42;
+        }
+    }
+
 }