changeset 11445:5fbd1ba4a5f3

Truffle-DSL: execute evaluated methods can now be declared using any type in the typesystem as parameters.
author Christian Humer <christian.humer@gmail.com>
date Wed, 28 Aug 2013 18:45:32 +0200
parents 89febfdb81d2
children 124662d7d103 e55e24cc3e7b
files graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ExecuteEvaluatedTest.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/ExecutableTypeMethodParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java
diffstat 3 files changed, 41 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ExecuteEvaluatedTest.java	Wed Aug 28 18:18:40 2013 +0200
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ExecuteEvaluatedTest.java	Wed Aug 28 18:45:32 2013 +0200
@@ -26,13 +26,8 @@
 
 import com.oracle.truffle.api.*;
 import com.oracle.truffle.api.dsl.*;
-import com.oracle.truffle.api.dsl.test.ExecuteEvaluatedTestFactory.DoubleEvaluatedNodeFactory;
-import com.oracle.truffle.api.dsl.test.ExecuteEvaluatedTestFactory.EvaluatedNodeFactory;
-import com.oracle.truffle.api.dsl.test.ExecuteEvaluatedTestFactory.UseDoubleEvaluatedNodeFactory;
-import com.oracle.truffle.api.dsl.test.ExecuteEvaluatedTestFactory.UseEvaluatedNodeFactory;
-import com.oracle.truffle.api.dsl.test.TypeSystemTest.ArgumentNode;
-import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestArguments;
-import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode;
+import com.oracle.truffle.api.dsl.test.ExecuteEvaluatedTestFactory.*;
+import com.oracle.truffle.api.dsl.test.TypeSystemTest.*;
 import com.oracle.truffle.api.frame.*;
 import com.oracle.truffle.api.nodes.*;
 
@@ -104,4 +99,31 @@
         }
     }
 
+    @Test
+    public void testEvaluatedGeneration() throws UnexpectedResultException {
+        TestRootNode<TestEvaluatedGeneration> root = TestHelper.createRoot(TestEvaluatedGenerationFactory.getInstance());
+
+        Assert.assertEquals(42, root.getNode().executeEvaluated1(null, 42));
+        Assert.assertEquals(42, root.getNode().executeEvaluated2(null, 42));
+        Assert.assertEquals(42, root.getNode().executeEvaluated3(null, 42));
+        Assert.assertEquals(42, root.getNode().executeEvaluated4(null, 42));
+    }
+
+    @NodeChildren({@NodeChild("exp0")})
+    abstract static class TestEvaluatedGeneration extends ValueNode {
+
+        public abstract Object executeEvaluated1(VirtualFrame frame, Object value);
+
+        public abstract Object executeEvaluated2(VirtualFrame frame, int value);
+
+        public abstract int executeEvaluated3(VirtualFrame frame, Object value) throws UnexpectedResultException;
+
+        public abstract int executeEvaluated4(VirtualFrame frame, int value) throws UnexpectedResultException;
+
+        @Specialization
+        int call(int exp0) {
+            return exp0;
+        }
+    }
+
 }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/ExecutableTypeMethodParser.java	Wed Aug 28 18:18:40 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/ExecutableTypeMethodParser.java	Wed Aug 28 18:45:32 2013 +0200
@@ -47,12 +47,13 @@
         List<ParameterSpec> requiredSpecs = new ArrayList<>(spec.getRequired());
         spec.getRequired().clear();
 
+        List<TypeMirror> allowedTypes = getNode().getTypeSystem().getPrimitiveTypeMirrors();
         for (ParameterSpec originalSpec : requiredSpecs) {
-            spec.addRequired(new ParameterSpec(originalSpec, Arrays.asList(getNode().getTypeSystem().getGenericType())));
+            spec.addRequired(new ParameterSpec(originalSpec, allowedTypes));
         }
 
         spec.setVariableRequiredArguments(true);
-        ParameterSpec other = new ParameterSpec("other", Arrays.asList(getNode().getTypeSystem().getGenericType()));
+        ParameterSpec other = new ParameterSpec("other", allowedTypes);
         other.setCardinality(Cardinality.MANY);
         other.setSignature(true);
         other.setIndexed(true);
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java	Wed Aug 28 18:18:40 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java	Wed Aug 28 18:45:32 2013 +0200
@@ -1765,9 +1765,15 @@
                 }
             }
 
+            // execute names are enforced no cast
+            String[] executeParameterNames = new String[executeParameters.size()];
+            for (int i = 0; i < executeParameterNames.length; i++) {
+                executeParameterNames[i] = valueName(executeParameters.get(i));
+            }
+
             builder.tree(createExecuteChildren(builder, executable, specialization, executeParameters, null, true));
 
-            CodeTree primaryExecuteCall = createTemplateMethodCall(builder, null, executable, castExecutable, null);
+            CodeTree primaryExecuteCall = createTemplateMethodCall(builder, null, executable, castExecutable, null, executeParameterNames);
             if (needsTry) {
                 if (!returnVoid) {
                     builder.declaration(primaryType.getPrimitiveType(), "value");
@@ -1858,6 +1864,7 @@
                 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName());
 
                 String targetVariableName = valueName(targetParameter);
+
                 CodeTree executionExpression = null;
                 if ((sourceParameter != null && cast) || sourceParameter != null) {
                     TypeData sourceType = sourceParameter.getTypeSystemType();
@@ -1867,7 +1874,7 @@
                         }
                         builder.startStatement();
                         builder.type(targetParameter.getType()).string(" ");
-                        builder.string(valueName(targetParameter)).string(" = ");
+                        builder.string(targetVariableName).string(" = ");
                         builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)));
                         builder.end();
                         continue;
@@ -1902,10 +1909,6 @@
                 cast = true;
             }
 
-            if (specialization.isGeneric() && unexpected) {
-                throw new AssertionError("Generic has unexpected parameters. " + specialization.toString());
-            }
-
             builder.startStatement();
 
             if (!shortCircuit) {