comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java @ 11445:5fbd1ba4a5f3

Truffle-DSL: execute evaluated methods can now be declared using any type in the typesystem as parameters.
author Christian Humer <christian.humer@gmail.com>
date Wed, 28 Aug 2013 18:45:32 +0200
parents b33783cbd8ce
children e6645c18d154
comparison
equal deleted inserted replaced
11444:89febfdb81d2 11445:5fbd1ba4a5f3
1763 if (targetParameter != null) { 1763 if (targetParameter != null) {
1764 executeParameters.add(targetParameter); 1764 executeParameters.add(targetParameter);
1765 } 1765 }
1766 } 1766 }
1767 1767
1768 // execute names are enforced no cast
1769 String[] executeParameterNames = new String[executeParameters.size()];
1770 for (int i = 0; i < executeParameterNames.length; i++) {
1771 executeParameterNames[i] = valueName(executeParameters.get(i));
1772 }
1773
1768 builder.tree(createExecuteChildren(builder, executable, specialization, executeParameters, null, true)); 1774 builder.tree(createExecuteChildren(builder, executable, specialization, executeParameters, null, true));
1769 1775
1770 CodeTree primaryExecuteCall = createTemplateMethodCall(builder, null, executable, castExecutable, null); 1776 CodeTree primaryExecuteCall = createTemplateMethodCall(builder, null, executable, castExecutable, null, executeParameterNames);
1771 if (needsTry) { 1777 if (needsTry) {
1772 if (!returnVoid) { 1778 if (!returnVoid) {
1773 builder.declaration(primaryType.getPrimitiveType(), "value"); 1779 builder.declaration(primaryType.getPrimitiveType(), "value");
1774 } 1780 }
1775 builder.startTryBlock(); 1781 builder.startTryBlock();
1856 } 1862 }
1857 1863
1858 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName()); 1864 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName());
1859 1865
1860 String targetVariableName = valueName(targetParameter); 1866 String targetVariableName = valueName(targetParameter);
1867
1861 CodeTree executionExpression = null; 1868 CodeTree executionExpression = null;
1862 if ((sourceParameter != null && cast) || sourceParameter != null) { 1869 if ((sourceParameter != null && cast) || sourceParameter != null) {
1863 TypeData sourceType = sourceParameter.getTypeSystemType(); 1870 TypeData sourceType = sourceParameter.getTypeSystemType();
1864 if (targetExecutable == null || !sourceType.needsCastTo(getContext(), targetType)) { 1871 if (targetExecutable == null || !sourceType.needsCastTo(getContext(), targetType)) {
1865 if (field != null && field.isShortCircuit() && sourceParameter != null) { 1872 if (field != null && field.isShortCircuit() && sourceParameter != null) {
1866 builder.tree(createShortCircuitValue(builder, specialization, field, targetParameter.getPreviousParameter(), unexpectedParameter)); 1873 builder.tree(createShortCircuitValue(builder, specialization, field, targetParameter.getPreviousParameter(), unexpectedParameter));
1867 } 1874 }
1868 builder.startStatement(); 1875 builder.startStatement();
1869 builder.type(targetParameter.getType()).string(" "); 1876 builder.type(targetParameter.getType()).string(" ");
1870 builder.string(valueName(targetParameter)).string(" = "); 1877 builder.string(targetVariableName).string(" = ");
1871 builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter))); 1878 builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)));
1872 builder.end(); 1879 builder.end();
1873 continue; 1880 continue;
1874 } else { 1881 } else {
1875 CodeTree valueTree = CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)); 1882 CodeTree valueTree = CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter));
1898 boolean unexpected = targetExecutable.hasUnexpectedValue(getContext()); 1905 boolean unexpected = targetExecutable.hasUnexpectedValue(getContext());
1899 boolean cast = false; 1906 boolean cast = false;
1900 if (targetExecutable.getType().needsCastTo(getContext(), param.getTypeSystemType())) { 1907 if (targetExecutable.getType().needsCastTo(getContext(), param.getTypeSystemType())) {
1901 unexpected = true; 1908 unexpected = true;
1902 cast = true; 1909 cast = true;
1903 }
1904
1905 if (specialization.isGeneric() && unexpected) {
1906 throw new AssertionError("Generic has unexpected parameters. " + specialization.toString());
1907 } 1910 }
1908 1911
1909 builder.startStatement(); 1912 builder.startStatement();
1910 1913
1911 if (!shortCircuit) { 1914 if (!shortCircuit) {