Mercurial > hg > graal-compiler
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(); }