# HG changeset patch # User Christian Humer # Date 1366821581 -7200 # Node ID 39f08ef7b5d8a62470bc718423b614b9f13eff6c # Parent 90eb4bb7f7554a5eee18eae680c3d51dd0cdddcc Fixed bugs for execute evaluated generation. diff -r 90eb4bb7f755 -r 39f08ef7b5d8 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Wed Apr 24 18:30:50 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java Wed Apr 24 18:39:41 2013 +0200 @@ -67,6 +67,10 @@ return name; } + private static String valueNameEvaluated(ActualParameter targetParameter) { + return valueName(targetParameter) + "Evaluated"; + } + private static String valueName(ActualParameter param) { return param.getLocalName(); } @@ -304,14 +308,20 @@ // find out which values needs a cast valuesNeedsCast = new HashSet<>(); for (GuardData guard : targetSpecialization.getGuards()) { - for (ActualParameter parameter : guard.getParameters()) { - NodeChildData field = node.findChild(parameter.getSpecification().getName()); + for (ActualParameter targetParameter : guard.getParameters()) { + NodeChildData field = node.findChild(targetParameter.getSpecification().getName()); if (field == null) { continue; } - TypeData typeData = parameter.getTypeSystemType(); - if (typeData != null && !typeData.isGeneric()) { - valuesNeedsCast.add(parameter.getLocalName()); + TypeData targetType = targetParameter.getTypeSystemType(); + ActualParameter sourceParameter = sourceSpecialization.findParameter(targetParameter.getLocalName()); + if (sourceParameter == null) { + sourceParameter = targetParameter; + } + TypeData sourceType = sourceParameter.getTypeSystemType(); + + if (sourceType.needsCastTo(targetType)) { + valuesNeedsCast.add(targetParameter.getLocalName()); } } } @@ -353,7 +363,7 @@ return builder.getRoot(); } - private CodeTree createExplicitGuards(CodeTreeBuilder parent, String conditionPrefix, SpecializationData valueSpecialization, SpecializationData guardedSpecialization) { + private CodeTree createExplicitGuards(CodeTreeBuilder parent, String conditionPrefix, TemplateMethod valueSpecialization, SpecializationData guardedSpecialization) { CodeTreeBuilder builder = new CodeTreeBuilder(parent); String andOperator = conditionPrefix != null ? conditionPrefix + " && " : ""; if (guardedSpecialization.getGuards().size() > 0) { @@ -368,7 +378,7 @@ return builder.isEmpty() ? null : builder.getRoot(); } - private CodeTree createCasts(CodeTreeBuilder parent, Set castWhiteList, SpecializationData valueSpecialization, SpecializationData guardedSpecialization) { + private CodeTree createCasts(CodeTreeBuilder parent, Set castWhiteList, TemplateMethod valueSpecialization, SpecializationData guardedSpecialization) { CodeTreeBuilder builder = new CodeTreeBuilder(parent); // Implict guards based on method signature for (ActualParameter guardedParam : guardedSpecialization.getParameters()) { @@ -378,6 +388,14 @@ } ActualParameter valueParam = valueSpecialization.findParameter(guardedParam.getLocalName()); + if (valueParam == null) { + /* + * If used inside a function execute method. The value param may not exist. In that + * case it assumes that the value is already converted. + */ + valueParam = guardedParam; + } + if (castWhiteList != null && !castWhiteList.contains(guardedParam.getLocalName())) { continue; } @@ -419,6 +437,14 @@ } ActualParameter valueParam = valueSpecialization.findParameter(guardedParam.getLocalName()); + if (valueParam == null) { + /* + * If used inside a function execute method. The value param may not exist. In that + * case it assumes that the value is already converted. + */ + valueParam = guardedParam; + } + CodeTree implicitGuard = createImplicitGuard(builder, field, valueParam, guardedParam); if (implicitGuard == null) { continue; @@ -439,7 +465,7 @@ TypeData targetType = target.getTypeSystemType(); TypeData sourceType = source.getTypeSystemType(); - if (targetType.equalsType(sourceType) || targetType.isGeneric()) { + if (!sourceType.needsCastTo(targetType)) { return null; } @@ -1343,7 +1369,12 @@ int i = 0; for (VariableElement param : method.getParameters()) { CodeVariableElement var = CodeVariableElement.clone(param); - var.setName(valueName(execType.getParameters().get(i))); + ActualParameter actualParameter = execType.getParameters().get(i); + if (actualParameter.getSpecification().isSignature()) { + var.setName(valueNameEvaluated(actualParameter)); + } else { + var.setName(valueName(actualParameter)); + } method.getParameters().set(i, var); i++; } @@ -1413,11 +1444,7 @@ ActualParameter targetParameter = castExecutable.findParameter(sourceParameter.getLocalName()); if (targetParameter != null) { - TypeData sourceType = sourceParameter.getTypeSystemType(); - TypeData targetType = targetParameter.getTypeSystemType(); - if (sourceType.needsCastTo(targetType)) { - executeParameters.add(targetParameter); - } + executeParameters.add(targetParameter); } } @@ -1500,7 +1527,7 @@ CodeTree executeNode; if (specialization.isUninitialized()) { - builder.tree(createSpecializeCall(builder, executable, specialization)); + builder.tree(createSpecializeCall(builder, specialization)); } executeNode = createExecute(builder, executable, specialization); @@ -1522,7 +1549,7 @@ return builder.getRoot(); } - private CodeTree createSpecializeCall(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData specialization) { + private CodeTree createSpecializeCall(CodeTreeBuilder parent, SpecializationData specialization) { NodeData node = specialization.getNode(); CodeTreeBuilder builder = new CodeTreeBuilder(parent); @@ -1534,7 +1561,7 @@ builder.startCall(factoryClassName(node), "specialize"); builder.string("this"); builder.typeLiteral(builder.findMethod().getEnclosingElement().asType()); - addInternalValueParameterNames(builder, executable, specialization, null, true, true); + addInternalValueParameterNames(builder, specialization, specialization, null, true, true); builder.end(); // call replace, call specialize } else { builder.startCall(factoryClassName(node), "createSpecialized").string("this").string("null").end(); @@ -1562,7 +1589,7 @@ String genericMethodName = generatedGenericMethodName(null); returnBuilder.startCall(factoryClassName(node), genericMethodName); returnBuilder.string("this"); - addInternalValueParameterNames(returnBuilder, executable, specialization, null, true, true); + addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true); returnBuilder.end(); } else if (specialization.getMethod() == null && !node.needsRewrites(context)) { emitEncounteredSynthetic(builder); @@ -1576,10 +1603,10 @@ returnBuilder.startCall(factoryClassName(node), genericMethodName); returnBuilder.string("this"); - addInternalValueParameterNames(returnBuilder, executable, specialization, null, true, true); + addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true); returnBuilder.end(); } else { - returnBuilder.tree(createTemplateMethodCall(returnBuilder, executable, specialization, null)); + returnBuilder.tree(createTemplateMethodCall(returnBuilder, specialization, specialization, null)); } if (!returnBuilder.isEmpty()) { @@ -1631,30 +1658,35 @@ ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); - String targetVariableName = null; + String targetVariableName = valueName(targetParameter); 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)); + builder.tree(createShortCircuitValue(builder, specialization, field, targetParameter.getPreviousParameter(), unexpectedParameter)); } - continue; + builder.startStatement(); + builder.type(targetParameter.getType()).string(" "); + builder.string(valueName(targetParameter)).string(" = "); + builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter))); + builder.end(); + } else { + executionExpression = createExpectType(sourceNode, targetExecutable, CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter))); } - executionExpression = createExpectType(sourceNode, targetExecutable, CodeTreeBuilder.singleString(valueName(targetParameter))); - targetVariableName = castValueName(targetParameter); } else if (sourceParameter == null) { - targetVariableName = valueName(targetParameter); executionExpression = createExecuteChildExpression(builder, field, targetParameter); } - CodeTreeVariable executionVar = new CodeTreeVariable(); - CodeTree shortCircuitTree = createShortCircuitTree(builder, executionVar, targetVariableName, sourceExecutable, specialization, targetParameter, unexpectedParameter); - CodeTree unexpectedTree = createCatchUnexpectedTree(builder, executionExpression, targetVariableName, specialization, sourceExecutable, targetExecutable, targetParameter, - shortCircuitTree != executionVar); + if (executionExpression != null) { + CodeTreeVariable executionVar = new CodeTreeVariable(); + CodeTree shortCircuitTree = createShortCircuitTree(builder, executionVar, targetVariableName, specialization, targetParameter, unexpectedParameter); + CodeTree unexpectedTree = createCatchUnexpectedTree(builder, executionExpression, targetVariableName, specialization, sourceExecutable, targetExecutable, targetParameter, + shortCircuitTree != executionVar); - executionVar.set(unexpectedTree); - builder.tree(shortCircuitTree); + executionVar.set(unexpectedTree); + builder.tree(shortCircuitTree); + } } return builder.getRoot(); } @@ -1738,8 +1770,8 @@ return builder.getRoot(); } - private CodeTree createShortCircuitTree(CodeTreeBuilder parent, CodeTree body, String targetVariableName, ExecutableTypeData currentExecutable, SpecializationData specialization, - ActualParameter parameter, ActualParameter exceptionParam) { + private CodeTree createShortCircuitTree(CodeTreeBuilder parent, CodeTree body, String targetVariableName, SpecializationData specialization, ActualParameter parameter, + ActualParameter exceptionParam) { CodeTreeBuilder builder = new CodeTreeBuilder(parent); NodeChildData forField = specialization.getNode().findChild(parameter.getSpecification().getName()); @@ -1753,7 +1785,7 @@ ActualParameter shortCircuitParam = specialization.getPreviousParam(parameter); - builder.tree(createShortCircuitValue(builder, currentExecutable, specialization, forField, shortCircuitParam, exceptionParam)); + builder.tree(createShortCircuitValue(builder, specialization, forField, shortCircuitParam, exceptionParam)); builder.declaration(parameter.getType(), targetVariableName, CodeTreeBuilder.createBuilder().defaultValue(parameter.getType())); builder.startIf().string(shortCircuitParam.getLocalName()).end(); @@ -1764,8 +1796,7 @@ return builder.getRoot(); } - private CodeTree createShortCircuitValue(CodeTreeBuilder parent, ExecutableTypeData currentExecutable, SpecializationData specialization, NodeChildData forField, - ActualParameter shortCircuitParam, ActualParameter exceptionParam) { + private CodeTree createShortCircuitValue(CodeTreeBuilder parent, SpecializationData specialization, NodeChildData forField, ActualParameter shortCircuitParam, ActualParameter exceptionParam) { CodeTreeBuilder builder = new CodeTreeBuilder(parent); int shortCircuitIndex = 0; for (NodeChildData field : specialization.getNode().getChildren()) { @@ -1779,7 +1810,7 @@ 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.tree(createTemplateMethodCall(builder, specialization, shortCircuitData, exceptionParam != null ? exceptionParam.getLocalName() : null)); builder.end(); // statement return builder.getRoot(); @@ -1789,8 +1820,8 @@ CodeTreeBuilder specializeCall = new CodeTreeBuilder(parent); specializeCall.startCall("specializeAndExecute"); specializeCall.string(nodeSpecializationClassName(nextSpecialization) + ".class"); - addInternalValueParameterNames(specializeCall, executable, nextSpecialization.getNode().getGenericSpecialization(), exceptionParam != null ? exceptionParam.getLocalName() : null, true, - true); + addInternalValueParameterNames(specializeCall, nextSpecialization.getNode().getGenericSpecialization(), nextSpecialization.getNode().getGenericSpecialization(), + exceptionParam != null ? exceptionParam.getLocalName() : null, true, true); specializeCall.end().end(); CodeTreeBuilder builder = new CodeTreeBuilder(parent); diff -r 90eb4bb7f755 -r 39f08ef7b5d8 graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java --- a/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Wed Apr 24 18:30:50 2013 +0200 +++ b/graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeParser.java Wed Apr 24 18:39:41 2013 +0200 @@ -582,11 +582,10 @@ nodeData.setSplitByMethodName(splitByMethodName); nodeData.setTypeSystem(typeSystem); nodeData.setFields(parseFields(elements)); - nodeData.setExecutableTypes(groupExecutableTypes(new ExecutableTypeMethodParser(context, nodeData).parse(elements))); parsedNodes.put(Utils.getQualifiedName(templateType), nodeData); - // parseChildren invokes cyclic parsing. nodeData.setChildren(parseChildren(templateType, elements, lookupTypes)); + nodeData.setExecutableTypes(groupExecutableTypes(new ExecutableTypeMethodParser(context, nodeData).parse(elements))); return nodeData; }