# HG changeset patch # User Chris Seaton # Date 1428262852 -3600 # Node ID 953c813b8e7aa191622236b43f119deeb01a3d43 # Parent 65d29fa813977f5ba065559d6c6ebf8afa50948e DSL: allow comparison of different integral types. diff -r 65d29fa81397 -r 953c813b8e7a graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/MethodGuardsTest.java --- 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)); diff -r 65d29fa81397 -r 953c813b8e7a graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java --- 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))); } diff -r 65d29fa81397 -r 953c813b8e7a graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java --- 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 getUniqueIdentifiers(List typeMirror) { List ids = new ArrayList<>(); for (TypeMirror type : typeMirror) {