# HG changeset patch # User Christian Humer # Date 1377708332 -7200 # Node ID 5fbd1ba4a5f3514cdb9448dd1033d56b0fac4439 # Parent 89febfdb81d2d4a39893db0c23d3866184034c5f Truffle-DSL: execute evaluated methods can now be declared using any type in the typesystem as parameters. diff -r 89febfdb81d2 -r 5fbd1ba4a5f3 graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/ExecuteEvaluatedTest.java --- 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 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; + } + } + } diff -r 89febfdb81d2 -r 5fbd1ba4a5f3 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/ExecutableTypeMethodParser.java --- 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 requiredSpecs = new ArrayList<>(spec.getRequired()); spec.getRequired().clear(); + List 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); diff -r 89febfdb81d2 -r 5fbd1ba4a5f3 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java --- 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) {