changeset 9218:797bb88bf004

Fixed evaluated execute generation for short circuit definitions.
author Christian Humer <christian.humer@gmail.com>
date Tue, 16 Apr 2013 11:03:08 +0200
parents 61ba6fc21ba4
children 1964871a642d
files graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java
diffstat 1 files changed, 22 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java	Mon Apr 15 18:50:19 2013 +0200
+++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java	Tue Apr 16 11:03:08 2013 +0200
@@ -1443,22 +1443,21 @@
 
                 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName());
 
-                String targetVariableName;
-                CodeTree executionExpression;
+                String targetVariableName = null;
+                CodeTree executionExpression = null;
                 if (cast || sourceParameter != null) {
                     TypeData sourceType = sourceParameter.getTypeSystemType();
                     if (!sourceType.needsCastTo(targetType)) {
+                        if (field.isShortCircuit() && sourceParameter != null) {
+                            builder.tree(createShortCircuitValue(builder, sourceExecutable, specialization, field, targetParameter.getPreviousParameter(), unexpectedParameter));
+                        }
                         continue;
                     }
                     executionExpression = createExpectType(sourceNode, targetExecutable, CodeTreeBuilder.singleString(valueName(targetParameter)));
                     targetVariableName = castValueName(targetParameter);
-                } else {
-                    if (sourceExecutable.findParameter(targetParameter.getLocalName()) == null) {
-                        executionExpression = createExecuteChildExpression(builder, field, targetParameter);
-                        targetVariableName = valueName(targetParameter);
-                    } else {
-                        continue;
-                    }
+                } else if (sourceParameter == null) {
+                    targetVariableName = valueName(targetParameter);
+                    executionExpression = createExecuteChildExpression(builder, field, targetParameter);
                 }
 
                 CodeTreeVariable executionVar = new CodeTreeVariable();
@@ -1561,6 +1560,20 @@
 
             ActualParameter shortCircuitParam = specialization.getPreviousParam(parameter);
 
+            builder.tree(createShortCircuitValue(builder, currentExecutable, specialization, forField, shortCircuitParam, exceptionParam));
+
+            builder.declaration(parameter.getType(), targetVariableName, CodeTreeBuilder.createBuilder().defaultValue(parameter.getType()));
+            builder.startIf().string(shortCircuitParam.getLocalName()).end();
+            builder.startBlock();
+            builder.tree(body);
+            builder.end();
+
+            return builder.getRoot();
+        }
+
+        private CodeTree createShortCircuitValue(CodeTreeBuilder parent, ExecutableTypeData currentExecutable, SpecializationData specialization, NodeFieldData forField,
+                        ActualParameter shortCircuitParam, ActualParameter exceptionParam) {
+            CodeTreeBuilder builder = new CodeTreeBuilder(parent);
             int shortCircuitIndex = 0;
             for (NodeFieldData field : specialization.getNode().getFields()) {
                 if (field.getExecutionKind() == ExecutionKind.SHORT_CIRCUIT) {
@@ -1573,17 +1586,9 @@
 
             builder.startStatement().type(shortCircuitParam.getType()).string(" ").string(valueName(shortCircuitParam)).string(" = ");
             ShortCircuitData shortCircuitData = specialization.getShortCircuits().get(shortCircuitIndex);
-
             builder.tree(createTemplateMethodCall(builder, currentExecutable, shortCircuitData, exceptionParam != null ? exceptionParam.getLocalName() : null));
-
             builder.end(); // statement
 
-            builder.declaration(parameter.getType(), targetVariableName, CodeTreeBuilder.createBuilder().defaultValue(parameter.getType()));
-            builder.startIf().string(shortCircuitParam.getLocalName()).end();
-            builder.startBlock();
-            builder.tree(body);
-            builder.end();
-
             return builder.getRoot();
         }