comparison graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java @ 9536:238431ec62a2

Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
author Christian Humer <christian.humer@gmail.com>
date Fri, 03 May 2013 14:28:32 +0200
parents 86d981cd8e22
children 0e4db5ee0695
comparison
equal deleted inserted replaced
9530:2777aafe689b 9536:238431ec62a2
1458 boolean needsTry = castExecutable.hasUnexpectedValue(getContext()); 1458 boolean needsTry = castExecutable.hasUnexpectedValue(getContext());
1459 boolean returnVoid = type.isVoid(); 1459 boolean returnVoid = type.isVoid();
1460 1460
1461 List<ActualParameter> executeParameters = new ArrayList<>(); 1461 List<ActualParameter> executeParameters = new ArrayList<>();
1462 for (ActualParameter sourceParameter : executable.getParameters()) { 1462 for (ActualParameter sourceParameter : executable.getParameters()) {
1463 NodeChildData field = specialization.getNode().findChild(sourceParameter.getSpecification().getName()); 1463 if (!sourceParameter.getSpecification().isSignature()) {
1464 if (field == null) {
1465 continue; 1464 continue;
1466 } 1465 }
1467 1466
1468 ActualParameter targetParameter = castExecutable.findParameter(sourceParameter.getLocalName()); 1467 ActualParameter targetParameter = castExecutable.findParameter(sourceParameter.getLocalName());
1469 if (targetParameter != null) { 1468 if (targetParameter != null) {
1643 1642
1644 CodeTreeBuilder builder = new CodeTreeBuilder(parent); 1643 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
1645 1644
1646 for (ActualParameter targetParameter : targetParameters) { 1645 for (ActualParameter targetParameter : targetParameters) {
1647 NodeChildData field = sourceNode.findChild(targetParameter.getSpecification().getName()); 1646 NodeChildData field = sourceNode.findChild(targetParameter.getSpecification().getName());
1648 if (field == null) { 1647 if (!targetParameter.getSpecification().isSignature()) {
1649 continue; 1648 continue;
1650 } 1649 }
1650
1651 TypeData targetType = targetParameter.getTypeSystemType(); 1651 TypeData targetType = targetParameter.getTypeSystemType();
1652 1652 ExecutableTypeData targetExecutable = null;
1653 ExecutableTypeData targetExecutable = field.findExecutableType(getContext(), targetType); 1653 if (field != null) {
1654 targetExecutable = field.findExecutableType(getContext(), targetType);
1655 }
1654 1656
1655 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); 1657 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName());
1656 1658
1657 String targetVariableName = valueName(targetParameter); 1659 String targetVariableName = valueName(targetParameter);
1658 CodeTree executionExpression = null; 1660 CodeTree executionExpression = null;
1659 if (cast || sourceParameter != null) { 1661 if ((sourceParameter != null && cast) || sourceParameter != null) {
1660 TypeData sourceType = sourceParameter.getTypeSystemType(); 1662 TypeData sourceType = sourceParameter.getTypeSystemType();
1661 if (!sourceType.needsCastTo(getContext(), targetType)) { 1663 if (targetExecutable == null || !sourceType.needsCastTo(getContext(), targetType)) {
1662 if (field.isShortCircuit() && sourceParameter != null) { 1664 if (field != null && field.isShortCircuit() && sourceParameter != null) {
1663 builder.tree(createShortCircuitValue(builder, specialization, field, targetParameter.getPreviousParameter(), unexpectedParameter)); 1665 builder.tree(createShortCircuitValue(builder, specialization, field, targetParameter.getPreviousParameter(), unexpectedParameter));
1664 } 1666 }
1665 builder.startStatement(); 1667 builder.startStatement();
1666 builder.type(targetParameter.getType()).string(" "); 1668 builder.type(targetParameter.getType()).string(" ");
1667 builder.string(valueName(targetParameter)).string(" = "); 1669 builder.string(valueName(targetParameter)).string(" = ");
1668 builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter))); 1670 builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)));
1669 builder.end(); 1671 builder.end();
1672 continue;
1670 } else { 1673 } else {
1671 executionExpression = createExpectExecutableType(sourceNode, sourceType, targetExecutable, CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter))); 1674 CodeTree valueTree = CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter));
1675 executionExpression = createExpectExecutableType(sourceNode, sourceType, targetExecutable, valueTree);
1672 } 1676 }
1673 } else if (sourceParameter == null) { 1677 } else if (sourceParameter == null) {
1674 executionExpression = createExecuteChildExpression(builder, field, targetParameter, unexpectedParameter); 1678 executionExpression = createExecuteChildExpression(builder, field, targetParameter, unexpectedParameter);
1675 } 1679 }
1676 1680