# HG changeset patch # User Christian Humer # Date 1366102988 -7200 # Node ID 797bb88bf00447a8d5fda2ce4f29b8ec669bef75 # Parent 61ba6fc21ba431b787c5f87b5e302b0f958f2f17 Fixed evaluated execute generation for short circuit definitions. diff -r 61ba6fc21ba4 -r 797bb88bf004 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java --- 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(); }