Mercurial > hg > graal-compiler
changeset 16830:c3c07046a74b
Truffle-DSL: fixed guard solve of guards for interfaces.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Thu, 14 Aug 2014 15:02:17 +0200 |
parents | e3724f25056a |
children | 217eee2ddead 13cf9b6b325c |
files | graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/MethodGuardsTest.java graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/TypeSystemTest.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/ElementUtils.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/GuardParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java |
diffstat | 5 files changed, 33 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- 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());
--- 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 { + } }
--- 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<TypeElement> types = getSuperTypes(fromTypeMirror(type)); + DeclaredType declaredType = (DeclaredType) type; + TypeElement typeElement = fromTypeMirror(declaredType); + List<TypeElement> types = getSuperTypes(typeElement); List<TypeMirror> 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 {
--- 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
--- 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<GuardData> matchingGuards = parser.parse(guardMethods); if (!matchingGuards.isEmpty()) { GuardData guard = matchingGuards.get(0);