Mercurial > hg > graal-jvmci-8
comparison 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 |
comparison
equal
deleted
inserted
replaced
16908:d3f282a9e287 | 16909:62cfffca9be2 |
---|---|
320 } | 320 } |
321 | 321 |
322 /** | 322 /** |
323 * <pre> | 323 * <pre> |
324 * variant1 $condition != null | 324 * variant1 $condition != null |
325 * | 325 * |
326 * $type $name = defaultValue($type); | 326 * $type $name = defaultValue($type); |
327 * if ($condition) { | 327 * if ($condition) { |
328 * $name = $value; | 328 * $name = $value; |
329 * } | 329 * } |
330 * | 330 * |
331 * variant2 $condition != null | 331 * variant2 $condition != null |
332 * $type $name = $value; | 332 * $type $name = $value; |
333 * </pre> | 333 * </pre> |
334 * | 334 * |
335 * . | 335 * . |
1743 emitEncounteredSynthetic(builder, current); | 1743 emitEncounteredSynthetic(builder, current); |
1744 } else { | 1744 } else { |
1745 builder.startReturn().tree(createTemplateMethodCall(builder, null, source, current, null)).end(); | 1745 builder.startReturn().tree(createTemplateMethodCall(builder, null, source, current, null)).end(); |
1746 } | 1746 } |
1747 | 1747 |
1748 return encloseThrowsWithFallThrough(current, builder.getRoot()); | 1748 return encloseThrowsWithFallThrough(parent, current, builder.getRoot()); |
1749 } | 1749 } |
1750 | 1750 |
1751 private CodeTree encloseThrowsWithFallThrough(SpecializationData current, CodeTree tree) { | 1751 private CodeTree encloseThrowsWithFallThrough(CodeTreeBuilder parent, SpecializationData current, CodeTree tree) { |
1752 if (current.getExceptions().isEmpty()) { | 1752 if (current.getExceptions().isEmpty()) { |
1753 return tree; | 1753 return tree; |
1754 } | 1754 } |
1755 CodeTreeBuilder builder = new CodeTreeBuilder(null); | 1755 CodeTreeBuilder builder = new CodeTreeBuilder(parent); |
1756 | 1756 |
1757 builder.startTryBlock(); | 1757 builder.startTryBlock(); |
1758 builder.tree(tree); | 1758 builder.tree(tree); |
1759 for (SpecializationThrowsData exception : current.getExceptions()) { | 1759 for (SpecializationThrowsData exception : current.getExceptions()) { |
1760 builder.end().startCatchBlock(exception.getJavaClass(), "rewriteEx"); | 1760 builder.end().startCatchBlock(exception.getJavaClass(), "rewriteEx"); |
1878 return targetExecutable; | 1878 return targetExecutable; |
1879 } | 1879 } |
1880 | 1880 |
1881 private CodeTree createExecuteChild(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter targetParameter, Parameter unexpectedParameter) { | 1881 private CodeTree createExecuteChild(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter targetParameter, Parameter unexpectedParameter) { |
1882 SpecializationData specialization = getModel(); | 1882 SpecializationData specialization = getModel(); |
1883 TreeSet<TypeData> possiblePolymorphicTypes = lookupPolymorphicTargetTypes(targetParameter); | 1883 if (specialization.isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null) { |
1884 if (specialization.isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null && possiblePolymorphicTypes.size() > 1) { | 1884 List<TypeData> possiblePolymorphicTypes = lookupPolymorphicTargetTypes(targetParameter); |
1885 | 1885 if (possiblePolymorphicTypes.size() > 1) { |
1886 CodeTreeBuilder builder = parent.create(); | 1886 CodeTreeBuilder builder = parent.create(); |
1887 | 1887 |
1888 boolean elseIf = false; | 1888 boolean elseIf = false; |
1889 for (TypeData possiblePolymoprhicType : possiblePolymorphicTypes) { | 1889 for (TypeData possiblePolymoprhicType : possiblePolymorphicTypes) { |
1890 if (possiblePolymoprhicType.isGeneric()) { | 1890 if (possiblePolymoprhicType.isGeneric()) { |
1891 continue; | 1891 continue; |
1892 } | 1892 } |
1893 elseIf = builder.startIf(elseIf); | 1893 elseIf = builder.startIf(elseIf); |
1894 | 1894 |
1895 Parameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); | 1895 Parameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); |
1896 TypeData sourceType = sourceParameter != null ? sourceParameter.getTypeSystemType() : null; | 1896 TypeData sourceType = sourceParameter != null ? sourceParameter.getTypeSystemType() : null; |
1897 builder.string(polymorphicTypeName(targetParameter.getSpecification().getExecution())).string(" == ").typeLiteral(possiblePolymoprhicType.getPrimitiveType()); | 1897 builder.string(polymorphicTypeName(targetParameter.getSpecification().getExecution())).string(" == ").typeLiteral(possiblePolymoprhicType.getPrimitiveType()); |
1898 builder.end().startBlock(); | 1898 builder.end().startBlock(); |
1899 builder.startStatement(); | 1899 builder.startStatement(); |
1900 builder.tree(createExecuteChildExpression(parent, execution, sourceType, new Parameter(targetParameter, possiblePolymoprhicType), unexpectedParameter, null)); | 1900 builder.tree(createExecuteChildExpression(parent, execution, sourceType, new Parameter(targetParameter, possiblePolymoprhicType), unexpectedParameter, null)); |
1901 builder.end(); | |
1902 builder.end(); | |
1903 } | |
1904 | |
1905 builder.startElseBlock(); | |
1906 builder.startStatement().tree(createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter)).end(); | |
1901 builder.end(); | 1907 builder.end(); |
1902 builder.end(); | 1908 |
1903 } | 1909 return builder.getRoot(); |
1904 | 1910 } |
1905 builder.startElseBlock(); | 1911 } |
1906 builder.startStatement().tree(createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter)).end(); | 1912 return createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter); |
1907 builder.end(); | |
1908 | |
1909 return builder.getRoot(); | |
1910 } else { | |
1911 return createExecuteChildImplicit(parent, execution, sourceExecutable, targetParameter, unexpectedParameter); | |
1912 } | |
1913 } | 1913 } |
1914 | 1914 |
1915 protected final List<Parameter> getImplicitTypeParameters(SpecializationData model) { | 1915 protected final List<Parameter> getImplicitTypeParameters(SpecializationData model) { |
1916 List<Parameter> parameter = new ArrayList<>(); | 1916 List<Parameter> parameter = new ArrayList<>(); |
1917 for (Parameter param : model.getSignatureParameters()) { | 1917 for (Parameter param : model.getSignatureParameters()) { |
1922 } | 1922 } |
1923 } | 1923 } |
1924 return parameter; | 1924 return parameter; |
1925 } | 1925 } |
1926 | 1926 |
1927 protected final TreeSet<TypeData> lookupPolymorphicTargetTypes(Parameter param) { | 1927 protected final List<TypeData> lookupPolymorphicTargetTypes(Parameter param) { |
1928 SpecializationData specialization = getModel(); | 1928 SpecializationData specialization = getModel(); |
1929 TreeSet<TypeData> possiblePolymorphicTypes = new TreeSet<>(); | 1929 Set<TypeData> possiblePolymorphicTypes = new HashSet<>(); |
1930 for (SpecializationData otherSpecialization : specialization.getNode().getSpecializations()) { | 1930 for (SpecializationData otherSpecialization : specialization.getNode().getSpecializations()) { |
1931 if (!otherSpecialization.isSpecialized()) { | 1931 if (!otherSpecialization.isSpecialized()) { |
1932 continue; | 1932 continue; |
1933 } | 1933 } |
1934 Parameter otherParameter = otherSpecialization.findParameter(param.getLocalName()); | 1934 Parameter otherParameter = otherSpecialization.findParameter(param.getLocalName()); |
1935 if (otherParameter != null) { | 1935 if (otherParameter != null) { |
1936 possiblePolymorphicTypes.add(otherParameter.getTypeSystemType()); | 1936 possiblePolymorphicTypes.add(otherParameter.getTypeSystemType()); |
1937 } | 1937 } |
1938 } | 1938 } |
1939 return possiblePolymorphicTypes; | 1939 List<TypeData> types = new ArrayList<>(possiblePolymorphicTypes); |
1940 Collections.sort(types); | |
1941 return types; | |
1940 } | 1942 } |
1941 | 1943 |
1942 private CodeTree createExecuteChildImplicit(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter param, Parameter unexpectedParameter) { | 1944 private CodeTree createExecuteChildImplicit(CodeTreeBuilder parent, NodeExecutionData execution, ExecutableTypeData sourceExecutable, Parameter param, Parameter unexpectedParameter) { |
1943 CodeTreeBuilder builder = parent.create(); | 1945 CodeTreeBuilder builder = parent.create(); |
1944 Parameter sourceParameter = sourceExecutable.findParameter(param.getLocalName()); | 1946 Parameter sourceParameter = sourceExecutable.findParameter(param.getLocalName()); |
2113 private boolean containsNewLine(CodeTree tree) { | 2115 private boolean containsNewLine(CodeTree tree) { |
2114 if (tree.getCodeKind() == CodeTreeKind.NEW_LINE) { | 2116 if (tree.getCodeKind() == CodeTreeKind.NEW_LINE) { |
2115 return true; | 2117 return true; |
2116 } | 2118 } |
2117 | 2119 |
2118 for (CodeTree codeTree : tree.getEnclosedElements()) { | 2120 List<CodeTree> enclosing = tree.getEnclosedElements(); |
2119 if (containsNewLine(codeTree)) { | 2121 if (enclosing != null) { |
2120 return true; | 2122 for (CodeTree codeTree : enclosing) { |
2123 if (containsNewLine(codeTree)) { | |
2124 return true; | |
2125 } | |
2121 } | 2126 } |
2122 } | 2127 } |
2123 return false; | 2128 return false; |
2124 } | 2129 } |
2125 | 2130 |
2126 private boolean hasUnexpected(Parameter sourceParameter, Parameter targetParameter, Parameter unexpectedParameter) { | 2131 private boolean hasUnexpected(Parameter sourceParameter, Parameter targetParameter, Parameter unexpectedParameter) { |
2127 NodeExecutionData execution = targetParameter.getSpecification().getExecution(); | 2132 NodeExecutionData execution = targetParameter.getSpecification().getExecution(); |
2128 | 2133 |
2129 if (getModel().isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null) { | 2134 if (getModel().isPolymorphic() && targetParameter.getTypeSystemType().isGeneric() && unexpectedParameter == null) { |
2130 // check for other polymorphic types | 2135 // check for other polymorphic types |
2131 TreeSet<TypeData> polymorphicTargetTypes = lookupPolymorphicTargetTypes(targetParameter); | 2136 List<TypeData> polymorphicTargetTypes = lookupPolymorphicTargetTypes(targetParameter); |
2132 if (polymorphicTargetTypes.size() > 1) { | 2137 if (polymorphicTargetTypes.size() > 1) { |
2133 for (TypeData polymorphicTargetType : polymorphicTargetTypes) { | 2138 for (TypeData polymorphicTargetType : polymorphicTargetTypes) { |
2134 if (hasUnexpectedType(execution, sourceParameter, polymorphicTargetType)) { | 2139 if (hasUnexpectedType(execution, sourceParameter, polymorphicTargetType)) { |
2135 return true; | 2140 return true; |
2136 } | 2141 } |