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) {