Mercurial > hg > truffle
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java @ 16909:62cfffca9be2
Truffle-DSL: some more performance optimizations.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Sat, 23 Aug 2014 19:31:18 +0200 |
parents | 2db61eddcb97 |
children | 6ee7afea175a |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java Sat Aug 23 19:31:13 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java Sat Aug 23 19:31:18 2014 +0200 @@ -322,12 +322,12 @@ /** * <pre> * variant1 $condition != null - * + * * $type $name = defaultValue($type); * if ($condition) { * $name = $value; * } - * + * * variant2 $condition != null * $type $name = $value; * </pre> @@ -1745,14 +1745,14 @@ builder.startReturn().tree(createTemplateMethodCall(builder, null, source, current, null)).end(); } - return encloseThrowsWithFallThrough(current, builder.getRoot()); + return encloseThrowsWithFallThrough(parent, current, builder.getRoot()); } - private CodeTree encloseThrowsWithFallThrough(SpecializationData current, CodeTree tree) { + private CodeTree encloseThrowsWithFallThrough(CodeTreeBuilder parent, SpecializationData current, CodeTree tree) { if (current.getExceptions().isEmpty()) { return tree; } - CodeTreeBuilder builder = new CodeTreeBuilder(null); + CodeTreeBuilder builder = new CodeTreeBuilder(parent); builder.startTryBlock(); builder.tree(tree); @@ -1880,36 +1880,36 @@ private CodeTree createExecuteChild(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter targetParameter, Parameter unexpectedParameter) { SpecializationData specialization = getModel(); - TreeSet<TypeData> possiblePolymorphicTypes = lookupPolymorphicTargetTypes(targetParameter); - if (specialization.isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null && possiblePolymorphicTypes.size() > 1) { - - CodeTreeBuilder builder = parent.create(); - - boolean elseIf = false; - for (TypeData possiblePolymoprhicType : possiblePolymorphicTypes) { - if (possiblePolymoprhicType.isGeneric()) { - continue; + if (specialization.isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null) { + List<TypeData> possiblePolymorphicTypes = lookupPolymorphicTargetTypes(targetParameter); + if (possiblePolymorphicTypes.size() > 1) { + CodeTreeBuilder builder = parent.create(); + + boolean elseIf = false; + for (TypeData possiblePolymoprhicType : possiblePolymorphicTypes) { + if (possiblePolymoprhicType.isGeneric()) { + continue; + } + elseIf = builder.startIf(elseIf); + + Parameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); + TypeData sourceType = sourceParameter != null ? sourceParameter.getTypeSystemType() : null; + builder.string(polymorphicTypeName(targetParameter.getSpecification().getExecution())).string(" == ").typeLiteral(possiblePolymoprhicType.getPrimitiveType()); + builder.end().startBlock(); + builder.startStatement(); + builder.tree(createExecuteChildExpression(parent, execution, sourceType, new Parameter(targetParameter, possiblePolymoprhicType), unexpectedParameter, null)); + builder.end(); + builder.end(); } - elseIf = builder.startIf(elseIf); - - Parameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); - TypeData sourceType = sourceParameter != null ? sourceParameter.getTypeSystemType() : null; - builder.string(polymorphicTypeName(targetParameter.getSpecification().getExecution())).string(" == ").typeLiteral(possiblePolymoprhicType.getPrimitiveType()); - builder.end().startBlock(); - builder.startStatement(); - builder.tree(createExecuteChildExpression(parent, execution, sourceType, new Parameter(targetParameter, possiblePolymoprhicType), unexpectedParameter, null)); - builder.end(); + + builder.startElseBlock(); + builder.startStatement().tree(createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter)).end(); builder.end(); + + return builder.getRoot(); } - - builder.startElseBlock(); - builder.startStatement().tree(createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter)).end(); - builder.end(); - - return builder.getRoot(); - } else { - return createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter); } + return createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter); } protected final List<Parameter> getImplicitTypeParameters(SpecializationData model) { @@ -1924,9 +1924,9 @@ return parameter; } - protected final TreeSet<TypeData> lookupPolymorphicTargetTypes(Parameter param) { + protected final List<TypeData> lookupPolymorphicTargetTypes(Parameter param) { SpecializationData specialization = getModel(); - TreeSet<TypeData> possiblePolymorphicTypes = new TreeSet<>(); + Set<TypeData> possiblePolymorphicTypes = new HashSet<>(); for (SpecializationData otherSpecialization : specialization.getNode().getSpecializations()) { if (!otherSpecialization.isSpecialized()) { continue; @@ -1936,7 +1936,9 @@ possiblePolymorphicTypes.add(otherParameter.getTypeSystemType()); } } - return possiblePolymorphicTypes; + List<TypeData> types = new ArrayList<>(possiblePolymorphicTypes); + Collections.sort(types); + return types; } private CodeTree createExecuteChildImplicit(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter param, Parameter unexpectedParameter) { @@ -2115,9 +2117,12 @@ return true; } - for (CodeTree codeTree : tree.getEnclosedElements()) { - if (containsNewLine(codeTree)) { - return true; + List<CodeTree> enclosing = tree.getEnclosedElements(); + if (enclosing != null) { + for (CodeTree codeTree : enclosing) { + if (containsNewLine(codeTree)) { + return true; + } } } return false; @@ -2128,7 +2133,7 @@ if (getModel().isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null) { // check for other polymorphic types - TreeSet<TypeData> polymorphicTargetTypes = lookupPolymorphicTargetTypes(targetParameter); + List<TypeData> polymorphicTargetTypes = lookupPolymorphicTargetTypes(targetParameter); if (polymorphicTargetTypes.size() > 1) { for (TypeData polymorphicTargetType : polymorphicTargetTypes) { if (hasUnexpectedType(execution, sourceParameter, polymorphicTargetType)) {