changeset 20170:953c813b8e7a

DSL: allow comparison of different integral types.
author Chris Seaton <chris.seaton@oracle.com>
date Sun, 05 Apr 2015 20:40:52 +0100
parents 65d29fa81397
children 9ca538e3e46e
files graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/MethodGuardsTest.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java
diffstat 3 files changed, 59 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/MethodGuardsTest.java	Sun Apr 05 19:51:46 2015 +0100
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/MethodGuardsTest.java	Sun Apr 05 20:40:52 2015 +0100
@@ -34,6 +34,8 @@
 import com.oracle.truffle.api.dsl.test.LimitTestFactory.MethodLimitTestFactory;
 import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardCompareWithFieldTestFactory;
 import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardComplexTestFactory;
+import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardEqualIntLongTestFactory;
+import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardEqualLongIntTestFactory;
 import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardEqualTestFactory;
 import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardFieldTestFactory;
 import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardGreaterEqualTestFactory;
@@ -74,6 +76,48 @@
     }
 
     @Test
+    public void testGuardEqualIntLong() {
+        CallTarget root = createCallTarget(GuardEqualIntLongTestFactory.getInstance());
+        assertEquals("do1", root.call(1));
+        assertEquals("do2", root.call(2));
+        assertEquals("do1", root.call(1));
+    }
+
+    @NodeChild
+    static class GuardEqualIntLongTest extends ValueNode {
+        @Specialization(guards = "value == 1")
+        static String do1(long value) {
+            return "do1";
+        }
+
+        @Specialization
+        static String do2(long value) {
+            return "do2";
+        }
+    }
+
+    @Test
+    public void testGuardEqualLongInt() {
+        CallTarget root = createCallTarget(GuardEqualLongIntTestFactory.getInstance());
+        assertEquals("do1", root.call(1));
+        assertEquals("do2", root.call(2));
+        assertEquals("do1", root.call(1));
+    }
+
+    @NodeChild
+    static class GuardEqualLongIntTest extends ValueNode {
+        @Specialization(guards = "1 == value")
+        static String do1(long value) {
+            return "do1";
+        }
+
+        @Specialization
+        static String do2(long value) {
+            return "do2";
+        }
+    }
+
+    @Test
     public void testGuardLessEqual() {
         CallTarget root = createCallTarget(GuardLessEqualTestFactory.getInstance());
         assertEquals("do1", root.call(1));
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java	Sun Apr 05 19:51:46 2015 +0100
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java	Sun Apr 05 20:40:52 2015 +0100
@@ -104,7 +104,7 @@
         String operator = binary.getOperator();
         TypeMirror leftType = binary.getLeft().getResolvedType();
         TypeMirror rightType = binary.getRight().getResolvedType();
-        if (!ElementUtils.typeEquals(leftType, rightType)) {
+        if (!ElementUtils.typeCompatible(leftType, rightType)) {
             throw new InvalidExpressionException(String.format("Incompatible operand types %s and %s.", ElementUtils.getSimpleName(leftType), ElementUtils.getSimpleName(rightType)));
         }
 
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java	Sun Apr 05 19:51:46 2015 +0100
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java	Sun Apr 05 20:40:52 2015 +0100
@@ -934,6 +934,20 @@
         }
     }
 
+    public static boolean typeCompatible(TypeMirror type1, TypeMirror type2) {
+        if (typeEquals(type1, type2)) {
+            return true;
+        } else if (kindIsIntegral(type1.getKind())) {
+            return kindIsIntegral(type2.getKind());
+        } else {
+            return false;
+        }
+    }
+
+    private static boolean kindIsIntegral(TypeKind kind) {
+        return kind == TypeKind.BYTE || kind == TypeKind.SHORT || kind == TypeKind.INT || kind == TypeKind.LONG;
+    }
+
     public static List<String> getUniqueIdentifiers(List<TypeMirror> typeMirror) {
         List<String> ids = new ArrayList<>();
         for (TypeMirror type : typeMirror) {