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);