comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeBaseFactory.java @ 18758:3912400fc33a

Truffle-DSL: remove type system singleton
author Christian Humer <christian.humer@gmail.com>
date Mon, 29 Dec 2014 23:38:42 +0100
parents 59bf50cc5a32
children a665483c3881
comparison
equal deleted inserted replaced
18757:0ec5f5a2e720 18758:3912400fc33a
929 } 929 }
930 return false; 930 return false;
931 } 931 }
932 932
933 private CodeTree createTypeGuard(CodeTreeBuilder parent, NodeExecutionData execution, Parameter source, TypeData targetType, boolean typedCasts) { 933 private CodeTree createTypeGuard(CodeTreeBuilder parent, NodeExecutionData execution, Parameter source, TypeData targetType, boolean typedCasts) {
934 NodeData childNode = execution.getChild().getNodeData();
935
936 CodeTreeBuilder builder = new CodeTreeBuilder(parent); 934 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
937 935
938 TypeData sourceType = source.getTypeSystemType(); 936 TypeData sourceType = source.getTypeSystemType();
939 937
940 if (!sourceType.needsCastTo(targetType)) { 938 if (!sourceType.needsCastTo(targetType)) {
949 builder.string("("); 947 builder.string("(");
950 builder.string("!").string(valueName(shortCircuit)); 948 builder.string("!").string(valueName(shortCircuit));
951 builder.string(" || "); 949 builder.string(" || ");
952 } 950 }
953 951
954 String castMethodName;
955 String castTypeName = null;
956 List<TypeData> types = getSpecialization().getNode().getTypeSystem().lookupSourceTypes(targetType); 952 List<TypeData> types = getSpecialization().getNode().getTypeSystem().lookupSourceTypes(targetType);
957 if (types.size() > 1) { 953 if (types.size() > 1) {
958 castMethodName = TypeSystemCodeGenerator.isImplicitTypeMethodName(targetType); 954 String castTypeName = null;
959 if (typedCasts) { 955 if (typedCasts) {
960 castTypeName = implicitTypeName(source); 956 castTypeName = implicitTypeName(source);
961 } 957 }
958 CodeTree check;
959 if (castTypeName == null) {
960 check = TypeSystemCodeGenerator.implicitCheck(targetType, valueName(source), null);
961 } else {
962 check = TypeSystemCodeGenerator.implicitCheck(targetType, valueName(source), castTypeName);
963 }
964 builder.tree(check);
962 } else { 965 } else {
963 castMethodName = TypeSystemCodeGenerator.isTypeMethodName(targetType); 966 builder.tree(TypeSystemCodeGenerator.check(targetType, valueName(source)));
964 } 967 }
965
966 startCallTypeSystemMethod(builder, childNode.getTypeSystem(), castMethodName);
967 builder.string(valueName(source));
968 if (castTypeName != null) {
969 builder.string(castTypeName);
970 }
971 builder.end().end(); // call
972 968
973 if (execution.isShortCircuit()) { 969 if (execution.isShortCircuit()) {
974 builder.string(")"); 970 builder.string(")");
975 } 971 }
976 972
979 return builder.getRoot(); 975 return builder.getRoot();
980 } 976 }
981 977
982 // TODO merge redundancies with #createTypeGuard 978 // TODO merge redundancies with #createTypeGuard
983 private CodeTree createCast(CodeTreeBuilder parent, NodeExecutionData execution, Parameter source, TypeData targetType, boolean typedCasts) { 979 private CodeTree createCast(CodeTreeBuilder parent, NodeExecutionData execution, Parameter source, TypeData targetType, boolean typedCasts) {
984 NodeData childNode = execution.getChild().getNodeData();
985 TypeData sourceType = source.getTypeSystemType(); 980 TypeData sourceType = source.getTypeSystemType();
986 981
987 if (!sourceType.needsCastTo(targetType)) { 982 if (!sourceType.needsCastTo(targetType)) {
988 return null; 983 return null;
989 } 984 }
993 Parameter shortCircuit = source.getPreviousParameter(); 988 Parameter shortCircuit = source.getPreviousParameter();
994 assert shortCircuit != null; 989 assert shortCircuit != null;
995 condition = CodeTreeBuilder.singleString(valueName(shortCircuit)); 990 condition = CodeTreeBuilder.singleString(valueName(shortCircuit));
996 } 991 }
997 992
998 String castMethodName; 993 CodeTree cast;
999 String castTypeName = null;
1000 List<TypeData> types = getSpecialization().getNode().getTypeSystem().lookupSourceTypes(targetType); 994 List<TypeData> types = getSpecialization().getNode().getTypeSystem().lookupSourceTypes(targetType);
1001 if (types.size() > 1) { 995 if (types.size() > 1) {
1002 castMethodName = TypeSystemCodeGenerator.asImplicitTypeMethodName(targetType); 996 String castTypeName = null;
1003 if (typedCasts) { 997 if (typedCasts) {
1004 castTypeName = implicitTypeName(source); 998 castTypeName = implicitTypeName(source);
1005 } 999 }
1000 cast = TypeSystemCodeGenerator.implicitCast(targetType, valueName(source), castTypeName);
1006 } else { 1001 } else {
1007 castMethodName = TypeSystemCodeGenerator.asTypeMethodName(targetType); 1002 cast = TypeSystemCodeGenerator.cast(targetType, valueName(source));
1008 } 1003 }
1009
1010 List<CodeTree> args = new ArrayList<>();
1011 args.add(CodeTreeBuilder.singleString(valueName(source)));
1012 if (castTypeName != null) {
1013 args.add(CodeTreeBuilder.singleString(castTypeName));
1014 }
1015
1016 CodeTree cast = createCallTypeSystemMethod(parent, childNode, castMethodName, args.toArray(new CodeTree[0]));
1017 1004
1018 CodeTreeBuilder builder = parent.create(); 1005 CodeTreeBuilder builder = parent.create();
1019 builder.tree(createLazyAssignment(parent, castValueName(source), targetType.getPrimitiveType(), condition, cast)); 1006 builder.tree(createLazyAssignment(parent, castValueName(source), targetType.getPrimitiveType(), condition, cast));
1020 1007
1021 return builder.getRoot(); 1008 return builder.getRoot();
1030 } 1017 }
1031 1018
1032 CodeTreeBuilder builder = parent.create(); 1019 CodeTreeBuilder builder = parent.create();
1033 List<TypeData> types = getSpecialization().getNode().getTypeSystem().lookupSourceTypes(targetType); 1020 List<TypeData> types = getSpecialization().getNode().getTypeSystem().lookupSourceTypes(targetType);
1034 if (types.size() > 1) { 1021 if (types.size() > 1) {
1035 CodeTree castType = createCallTypeSystemMethod(parent, execution.getChild().getNodeData(), TypeSystemCodeGenerator.getImplicitClass(targetType), 1022 CodeTree castType = TypeSystemCodeGenerator.implicitType(targetType, valueName(source));
1036 CodeTreeBuilder.singleString(valueName(source)));
1037 builder.tree(createLazyAssignment(builder, implicitTypeName(source), context.getType(Class.class), condition, castType)); 1023 builder.tree(createLazyAssignment(builder, implicitTypeName(source), context.getType(Class.class), condition, castType));
1038 } 1024 }
1039 return builder.getRoot(); 1025 return builder.getRoot();
1040 } 1026 }
1041 1027
1125 builder.end().startCatchBlock(getUnexpectedValueException(), "ex"); 1111 builder.end().startCatchBlock(getUnexpectedValueException(), "ex");
1126 if (returnVoid) { 1112 if (returnVoid) {
1127 builder.string("// ignore").newLine(); 1113 builder.string("// ignore").newLine();
1128 } else { 1114 } else {
1129 builder.startReturn(); 1115 builder.startReturn();
1130 builder.tree(createExpectExecutableType(node, specialization.getNode().getTypeSystem().getGenericTypeData(), hasUnexpected, executable.getType(), 1116 builder.tree(createExpectExecutableType(specialization.getNode().getTypeSystem().getGenericTypeData(), hasUnexpected, executable.getType(),
1131 CodeTreeBuilder.singleString("ex.getResult()"))); 1117 CodeTreeBuilder.singleString("ex.getResult()")));
1132 builder.end(); 1118 builder.end();
1133 } 1119 }
1134 builder.end(); 1120 builder.end();
1135 1121
1136 if (!returnVoid) { 1122 if (!returnVoid) {
1137 builder.startReturn(); 1123 builder.startReturn();
1138 builder.tree(createExpectExecutableType(node, castExecutable.getReturnType().getTypeSystemType(), hasUnexpected, executable.getType(), CodeTreeBuilder.singleString("value"))); 1124 builder.tree(createExpectExecutableType(castExecutable.getReturnType().getTypeSystemType(), hasUnexpected, executable.getType(), CodeTreeBuilder.singleString("value")));
1139 builder.end(); 1125 builder.end();
1140 } 1126 }
1141 } else { 1127 } else {
1142 if (returnVoid) { 1128 if (returnVoid) {
1143 builder.statement(primaryExecuteCall); 1129 builder.statement(primaryExecuteCall);
1144 } else { 1130 } else {
1145 builder.startReturn(); 1131 builder.startReturn();
1146 builder.tree(createExpectExecutableType(node, castExecutable.getReturnType().getTypeSystemType(), hasUnexpected, executable.getType(), primaryExecuteCall)); 1132 builder.tree(createExpectExecutableType(castExecutable.getReturnType().getTypeSystemType(), hasUnexpected, executable.getType(), primaryExecuteCall));
1147 builder.end(); 1133 builder.end();
1148 } 1134 }
1149 } 1135 }
1150 1136
1151 return builder.getRoot(); 1137 return builder.getRoot();
1152 } 1138 }
1153 1139
1154 private static CodeTree createExpectExecutableType(NodeData node, TypeData sourceType, boolean hasUnexpected, TypeData exepctedType, CodeTree value) { 1140 private static CodeTree createExpectExecutableType(TypeData sourceType, boolean hasUnexpected, TypeData exepctedType, CodeTree value) {
1155 return createCastType(node.getTypeSystem(), sourceType, exepctedType, hasUnexpected, value); 1141 return createCastType(sourceType, exepctedType, hasUnexpected, value);
1156 } 1142 }
1157 1143
1158 protected CodeTree createExecuteChildren(CodeTreeBuilder parent, ExecutableTypeData sourceExecutable, SpecializationData currentSpecialization, List<Parameter> targetParameters, 1144 protected CodeTree createExecuteChildren(CodeTreeBuilder parent, ExecutableTypeData sourceExecutable, SpecializationData currentSpecialization, List<Parameter> targetParameters,
1159 Parameter unexpectedParameter) { 1145 Parameter unexpectedParameter) {
1160 CodeTreeBuilder builder = parent.create(); 1146 CodeTreeBuilder builder = parent.create();
1397 } else { 1383 } else {
1398 expression = CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)); 1384 expression = CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter));
1399 } 1385 }
1400 1386
1401 // target = expectTargetType(implicitCast(expectCastSourceType(source))) 1387 // target = expectTargetType(implicitCast(expectCastSourceType(source)))
1402 TypeSystemData typeSystem = execution.getChild().getNodeData().getTypeSystem(); 1388 expression = createExpectType(sourceType, castSourceType, expression);
1403 expression = createExpectType(typeSystem, sourceType, castSourceType, expression); 1389 expression = createImplicitCast(cast, expression);
1404 expression = createImplicitCast(parent, typeSystem, cast, expression); 1390 expression = createExpectType(castTargetType, targetType, expression);
1405 expression = createExpectType(typeSystem, castTargetType, targetType, expression);
1406 1391
1407 CodeTreeBuilder builder = parent.create(); 1392 CodeTreeBuilder builder = parent.create();
1408 builder.string(valueName(targetParameter)); 1393 builder.string(valueName(targetParameter));
1409 builder.string(" = "); 1394 builder.string(" = ");
1410 builder.tree(expression); 1395 builder.tree(expression);
1411 return builder.getRoot(); 1396 return builder.getRoot();
1412 } 1397 }
1413 1398
1414 private static CodeTree createImplicitCast(CodeTreeBuilder parent, TypeSystemData typeSystem, ImplicitCastData cast, CodeTree expression) { 1399 private static CodeTree createImplicitCast(ImplicitCastData cast, CodeTree expression) {
1415 if (cast == null) { 1400 if (cast == null) {
1416 return expression; 1401 return expression;
1417 } 1402 }
1418 CodeTreeBuilder builder = parent.create(); 1403 return TypeSystemCodeGenerator.invokeImplicitCast(cast, expression);
1419 startCallTypeSystemMethod(builder, typeSystem, cast.getMethodName());
1420 builder.tree(expression);
1421 builder.end().end();
1422 return builder.getRoot();
1423 } 1404 }
1424 1405
1425 private boolean containsNewLine(CodeTree tree) { 1406 private boolean containsNewLine(CodeTree tree) {
1426 if (tree.getCodeKind() == CodeTreeKind.NEW_LINE) { 1407 if (tree.getCodeKind() == CodeTreeKind.NEW_LINE) {
1427 return true; 1408 return true;
1538 addInternalValueParameterNames(execute, currentSpecialization, polymorphic, param.getLocalName(), true, false, null); 1519 addInternalValueParameterNames(execute, currentSpecialization, polymorphic, param.getLocalName(), true, false, null);
1539 execute.end(); 1520 execute.end();
1540 1521
1541 TypeData sourceType = polymorphic.getReturnType().getTypeSystemType(); 1522 TypeData sourceType = polymorphic.getReturnType().getTypeSystemType();
1542 1523
1543 builder.tree(createExpectExecutableType(node, sourceType, currentExecutable.hasUnexpectedValue(context), currentExecutable.getType(), execute.getRoot())); 1524 builder.tree(createExpectExecutableType(sourceType, currentExecutable.hasUnexpectedValue(context), currentExecutable.getType(), execute.getRoot()));
1544 1525
1545 builder.end(); 1526 builder.end();
1546 return builder.getRoot(); 1527 return builder.getRoot();
1547 } 1528 }
1548 1529
1586 } 1567 }
1587 1568
1588 CodeTree value = CodeTreeBuilder.singleString(localName); 1569 CodeTree value = CodeTreeBuilder.singleString(localName);
1589 1570
1590 if (sourceType.needsCastTo(targetType)) { 1571 if (sourceType.needsCastTo(targetType)) {
1591 value = createCallTypeSystemMethod(builder, getSpecialization().getNode(), TypeSystemCodeGenerator.asTypeMethodName(targetType), value); 1572 value = TypeSystemCodeGenerator.cast(targetType, value);
1592 } 1573 }
1593 builder.tree(value); 1574 builder.tree(value);
1594 } else { 1575 } else {
1595 builder.defaultValue(parameter.getType()); 1576 builder.defaultValue(parameter.getType());
1596 } 1577 }
1655 specializeCall.end().end(); 1636 specializeCall.end().end();
1656 1637
1657 CodeTreeBuilder builder = new CodeTreeBuilder(parent); 1638 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
1658 1639
1659 builder.startReturn(); 1640 builder.startReturn();
1660 builder.tree(createExpectExecutableType(node, generic.getReturnType().getTypeSystemType(), hasUnexpected, returnType, specializeCall.getRoot())); 1641 builder.tree(createExpectExecutableType(generic.getReturnType().getTypeSystemType(), hasUnexpected, returnType, specializeCall.getRoot()));
1661 builder.end(); 1642 builder.end();
1662 1643
1663 return builder.getRoot(); 1644 return builder.getRoot();
1664 } 1645 }
1665 1646
1850 public static String baseClassName(NodeData node) { 1831 public static String baseClassName(NodeData node) {
1851 String nodeid = resolveNodeId(node); 1832 String nodeid = resolveNodeId(node);
1852 String name = ElementUtils.firstLetterUpperCase(nodeid); 1833 String name = ElementUtils.firstLetterUpperCase(nodeid);
1853 name += "NodeGen"; 1834 name += "NodeGen";
1854 return name; 1835 return name;
1855 }
1856
1857 static CodeTree createCallTypeSystemMethod(CodeTreeBuilder parent, NodeData node, String methodName, CodeTree... args) {
1858 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
1859 startCallTypeSystemMethod(builder, node.getTypeSystem(), methodName);
1860 for (CodeTree arg : args) {
1861 builder.tree(arg);
1862 }
1863 builder.end().end();
1864 return builder.getRoot();
1865 }
1866
1867 private static void startCallTypeSystemMethod(CodeTreeBuilder body, TypeSystemData typeSystem, String methodName) {
1868 GeneratedTypeMirror typeMirror = new GeneratedTypeMirror(ElementUtils.getPackageName(typeSystem.getTemplateType()), TypeSystemCodeGenerator.typeName(typeSystem));
1869 body.startGroup();
1870 body.staticReference(typeMirror, TypeSystemCodeGenerator.singletonName(typeSystem));
1871 body.string(".").startCall(methodName);
1872 } 1836 }
1873 1837
1874 /** 1838 /**
1875 * <pre> 1839 * <pre>
1876 * variant1 $condition != null 1840 * variant1 $condition != null
1970 nodeid = nodeid.substring(0, nodeid.length() - 4); 1934 nodeid = nodeid.substring(0, nodeid.length() - 4);
1971 } 1935 }
1972 return nodeid; 1936 return nodeid;
1973 } 1937 }
1974 1938
1975 private static CodeTree createCastType(TypeSystemData typeSystem, TypeData sourceType, TypeData targetType, boolean expect, CodeTree value) { 1939 private static CodeTree createCastType(TypeData sourceType, TypeData targetType, boolean expect, CodeTree value) {
1976 if (targetType == null) { 1940 if (targetType == null) {
1977 return value; 1941 return value;
1978 } else if (sourceType != null && !sourceType.needsCastTo(targetType)) { 1942 } else if (sourceType != null && !sourceType.needsCastTo(targetType)) {
1979 return value; 1943 return value;
1980 } 1944 }
1981 1945
1982 CodeTreeBuilder builder = CodeTreeBuilder.createBuilder();
1983 String targetMethodName;
1984 if (expect) { 1946 if (expect) {
1985 targetMethodName = TypeSystemCodeGenerator.expectTypeMethodName(targetType); 1947 return TypeSystemCodeGenerator.expect(targetType, value);
1986 } else { 1948 } else {
1987 targetMethodName = TypeSystemCodeGenerator.asTypeMethodName(targetType); 1949 return TypeSystemCodeGenerator.cast(targetType, value);
1988 } 1950 }
1989 startCallTypeSystemMethod(builder, typeSystem, targetMethodName); 1951 }
1990 builder.tree(value); 1952
1991 builder.end().end(); 1953 private static CodeTree createExpectType(TypeData sourceType, TypeData targetType, CodeTree expression) {
1992 return builder.getRoot(); 1954 return createCastType(sourceType, targetType, true, expression);
1993 }
1994
1995 private static CodeTree createExpectType(TypeSystemData typeSystem, TypeData sourceType, TypeData targetType, CodeTree expression) {
1996 return createCastType(typeSystem, sourceType, targetType, true, expression);
1997 } 1955 }
1998 1956
1999 static CodeTree createDeoptimize(CodeTreeBuilder parent) { 1957 static CodeTree createDeoptimize(CodeTreeBuilder parent) {
2000 CodeTreeBuilder builder = new CodeTreeBuilder(parent); 1958 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
2001 builder.startStatement(); 1959 builder.startStatement();