Mercurial > hg > graal-compiler
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 |