# HG changeset patch # User Christian Humer # Date 1408021337 -7200 # Node ID c3c07046a74b3de40596ac97b3594da0e9c91728 # Parent e3724f25056a652d49d2d35e318f6a9a4c19403a Truffle-DSL: fixed guard solve of guards for interfaces. diff -r e3724f25056a -r c3c07046a74b 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 Thu Aug 14 13:11:47 2014 +0200 +++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/MethodGuardsTest.java Thu Aug 14 15:02:17 2014 +0200 @@ -28,6 +28,7 @@ import org.junit.*; import com.oracle.truffle.api.dsl.*; +import com.oracle.truffle.api.dsl.test.BinaryNodeTest.*; import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GlobalFlagGuardFactory; import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardWithBaseClassFactory; import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.GuardWithBoxedPrimitiveFactory; @@ -37,11 +38,7 @@ import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.TestGuardResolve1Factory; import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.TestGuardResolve2Factory; import com.oracle.truffle.api.dsl.test.MethodGuardsTestFactory.TestGuardResolve3Factory; -import com.oracle.truffle.api.dsl.test.TypeSystemTest.Abstract; -import com.oracle.truffle.api.dsl.test.TypeSystemTest.BExtendsAbstract; -import com.oracle.truffle.api.dsl.test.TypeSystemTest.CExtendsAbstract; -import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode; -import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode; +import com.oracle.truffle.api.dsl.test.TypeSystemTest.*; @SuppressWarnings("unused") public class MethodGuardsTest { @@ -279,6 +276,19 @@ } } + @NodeChildren({@NodeChild("a"), @NodeChild("b")}) + abstract static class TestGuardResolve5 extends ValueNode { + + @Specialization(guards = "guard") + int add(Interface left, Interface right) { + return 42; + } + + boolean guard(Interface left, Object right) { + return true; + } + } + @Test public void testAbstractGuard1() { TestRootNode root = createRoot(TestAbstractGuard1Factory.getInstance()); diff -r e3724f25056a -r c3c07046a74b graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemTest.java --- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemTest.java Thu Aug 14 13:11:47 2014 +0200 +++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemTest.java Thu Aug 14 15:02:17 2014 +0200 @@ -31,7 +31,8 @@ public class TypeSystemTest { - @TypeSystem({int.class, double.class, boolean.class, BigInteger.class, String.class, CallTarget.class, BExtendsAbstract.class, CExtendsAbstract.class, Abstract.class, Object[].class}) + @TypeSystem({int.class, double.class, boolean.class, BigInteger.class, String.class, CallTarget.class, BExtendsAbstract.class, CExtendsAbstract.class, Abstract.class, Interface.class, + Object[].class}) static class SimpleTypes { static int intCheck; @@ -104,6 +105,10 @@ return SimpleTypesGen.SIMPLETYPES.expectDouble(execute(frame)); } + public Interface executeInterface(VirtualFrame frame) throws UnexpectedResultException { + return SimpleTypesGen.SIMPLETYPES.expectInterface(execute(frame)); + } + public Object execute(@SuppressWarnings("unused") VirtualFrame frame) { throw new UnsupportedOperationException(); } @@ -184,4 +189,6 @@ static final CExtendsAbstract INSTANCE = new CExtendsAbstract(); } + interface Interface { + } } diff -r e3724f25056a -r c3c07046a74b 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 Thu Aug 14 13:11:47 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java Thu Aug 14 15:02:17 2014 +0200 @@ -593,11 +593,16 @@ } else if (type.getKind() == TypeKind.ARRAY) { return Arrays.asList(type, context.getType(Object.class)); } else if (type.getKind() == TypeKind.DECLARED) { - List types = getSuperTypes(fromTypeMirror(type)); + DeclaredType declaredType = (DeclaredType) type; + TypeElement typeElement = fromTypeMirror(declaredType); + List types = getSuperTypes(typeElement); List mirrors = new ArrayList<>(types.size()); mirrors.add(type); - for (TypeElement typeElement : types) { - mirrors.add(typeElement.asType()); + for (TypeElement superTypeElement : types) { + mirrors.add(superTypeElement.asType()); + } + if (typeElement.getKind().isInterface()) { + mirrors.add(getType(context.getEnvironment(), Object.class)); } return mirrors; } else { diff -r e3724f25056a -r c3c07046a74b graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GuardParser.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GuardParser.java Thu Aug 14 13:11:47 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GuardParser.java Thu Aug 14 15:02:17 2014 +0200 @@ -90,7 +90,7 @@ @Override public boolean isParsable(ExecutableElement method) { - return guardNames.contains(method.getSimpleName().toString()); + return guardNames == null || guardNames.contains(method.getSimpleName().toString()); } @Override diff -r e3724f25056a -r c3c07046a74b graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java Thu Aug 14 13:11:47 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java Thu Aug 14 15:02:17 2014 +0200 @@ -881,7 +881,7 @@ for (GuardData guard : availableGuards) { guardMethods.add(guard.getMethod()); } - GuardParser parser = new GuardParser(context, node, source, new HashSet<>(Arrays.asList(expression.getGuardName()))); + GuardParser parser = new GuardParser(context, node, source, null); List matchingGuards = parser.parse(guardMethods); if (!matchingGuards.isEmpty()) { GuardData guard = matchingGuards.get(0);