Mercurial > hg > graal-jvmci-8
comparison graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java @ 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 | 97ad6d3e7557 |
comparison
equal
deleted
inserted
replaced
9217:61ba6fc21ba4 | 9218:797bb88bf004 |
---|---|
1441 | 1441 |
1442 ExecutableTypeData targetExecutable = field.getNodeData().findExecutableType(targetType); | 1442 ExecutableTypeData targetExecutable = field.getNodeData().findExecutableType(targetType); |
1443 | 1443 |
1444 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); | 1444 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); |
1445 | 1445 |
1446 String targetVariableName; | 1446 String targetVariableName = null; |
1447 CodeTree executionExpression; | 1447 CodeTree executionExpression = null; |
1448 if (cast || sourceParameter != null) { | 1448 if (cast || sourceParameter != null) { |
1449 TypeData sourceType = sourceParameter.getTypeSystemType(); | 1449 TypeData sourceType = sourceParameter.getTypeSystemType(); |
1450 if (!sourceType.needsCastTo(targetType)) { | 1450 if (!sourceType.needsCastTo(targetType)) { |
1451 if (field.isShortCircuit() && sourceParameter != null) { | |
1452 builder.tree(createShortCircuitValue(builder, sourceExecutable, specialization, field, targetParameter.getPreviousParameter(), unexpectedParameter)); | |
1453 } | |
1451 continue; | 1454 continue; |
1452 } | 1455 } |
1453 executionExpression = createExpectType(sourceNode, targetExecutable, CodeTreeBuilder.singleString(valueName(targetParameter))); | 1456 executionExpression = createExpectType(sourceNode, targetExecutable, CodeTreeBuilder.singleString(valueName(targetParameter))); |
1454 targetVariableName = castValueName(targetParameter); | 1457 targetVariableName = castValueName(targetParameter); |
1455 } else { | 1458 } else if (sourceParameter == null) { |
1456 if (sourceExecutable.findParameter(targetParameter.getLocalName()) == null) { | 1459 targetVariableName = valueName(targetParameter); |
1457 executionExpression = createExecuteChildExpression(builder, field, targetParameter); | 1460 executionExpression = createExecuteChildExpression(builder, field, targetParameter); |
1458 targetVariableName = valueName(targetParameter); | |
1459 } else { | |
1460 continue; | |
1461 } | |
1462 } | 1461 } |
1463 | 1462 |
1464 CodeTreeVariable executionVar = new CodeTreeVariable(); | 1463 CodeTreeVariable executionVar = new CodeTreeVariable(); |
1465 CodeTree shortCircuitTree = createShortCircuitTree(builder, executionVar, targetVariableName, sourceExecutable, specialization, targetParameter, unexpectedParameter); | 1464 CodeTree shortCircuitTree = createShortCircuitTree(builder, executionVar, targetVariableName, sourceExecutable, specialization, targetParameter, unexpectedParameter); |
1466 CodeTree unexpectedTree = createCatchUnexpectedTree(builder, executionExpression, targetVariableName, specialization, sourceExecutable, targetExecutable, targetParameter, | 1465 CodeTree unexpectedTree = createCatchUnexpectedTree(builder, executionExpression, targetVariableName, specialization, sourceExecutable, targetExecutable, targetParameter, |
1559 return body; | 1558 return body; |
1560 } | 1559 } |
1561 | 1560 |
1562 ActualParameter shortCircuitParam = specialization.getPreviousParam(parameter); | 1561 ActualParameter shortCircuitParam = specialization.getPreviousParam(parameter); |
1563 | 1562 |
1563 builder.tree(createShortCircuitValue(builder, currentExecutable, specialization, forField, shortCircuitParam, exceptionParam)); | |
1564 | |
1565 builder.declaration(parameter.getType(), targetVariableName, CodeTreeBuilder.createBuilder().defaultValue(parameter.getType())); | |
1566 builder.startIf().string(shortCircuitParam.getLocalName()).end(); | |
1567 builder.startBlock(); | |
1568 builder.tree(body); | |
1569 builder.end(); | |
1570 | |
1571 return builder.getRoot(); | |
1572 } | |
1573 | |
1574 private CodeTree createShortCircuitValue(CodeTreeBuilder parent, ExecutableTypeData currentExecutable, SpecializationData specialization, NodeFieldData forField, | |
1575 ActualParameter shortCircuitParam, ActualParameter exceptionParam) { | |
1576 CodeTreeBuilder builder = new CodeTreeBuilder(parent); | |
1564 int shortCircuitIndex = 0; | 1577 int shortCircuitIndex = 0; |
1565 for (NodeFieldData field : specialization.getNode().getFields()) { | 1578 for (NodeFieldData field : specialization.getNode().getFields()) { |
1566 if (field.getExecutionKind() == ExecutionKind.SHORT_CIRCUIT) { | 1579 if (field.getExecutionKind() == ExecutionKind.SHORT_CIRCUIT) { |
1567 if (field == forField) { | 1580 if (field == forField) { |
1568 break; | 1581 break; |
1571 } | 1584 } |
1572 } | 1585 } |
1573 | 1586 |
1574 builder.startStatement().type(shortCircuitParam.getType()).string(" ").string(valueName(shortCircuitParam)).string(" = "); | 1587 builder.startStatement().type(shortCircuitParam.getType()).string(" ").string(valueName(shortCircuitParam)).string(" = "); |
1575 ShortCircuitData shortCircuitData = specialization.getShortCircuits().get(shortCircuitIndex); | 1588 ShortCircuitData shortCircuitData = specialization.getShortCircuits().get(shortCircuitIndex); |
1576 | |
1577 builder.tree(createTemplateMethodCall(builder, currentExecutable, shortCircuitData, exceptionParam != null ? exceptionParam.getLocalName() : null)); | 1589 builder.tree(createTemplateMethodCall(builder, currentExecutable, shortCircuitData, exceptionParam != null ? exceptionParam.getLocalName() : null)); |
1578 | |
1579 builder.end(); // statement | 1590 builder.end(); // statement |
1580 | |
1581 builder.declaration(parameter.getType(), targetVariableName, CodeTreeBuilder.createBuilder().defaultValue(parameter.getType())); | |
1582 builder.startIf().string(shortCircuitParam.getLocalName()).end(); | |
1583 builder.startBlock(); | |
1584 builder.tree(body); | |
1585 builder.end(); | |
1586 | 1591 |
1587 return builder.getRoot(); | 1592 return builder.getRoot(); |
1588 } | 1593 } |
1589 | 1594 |
1590 private CodeTree createReturnSpecializeAndExecute(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData nextSpecialization, ActualParameter exceptionParam) { | 1595 private CodeTree createReturnSpecializeAndExecute(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData nextSpecialization, ActualParameter exceptionParam) { |