Mercurial > hg > graal-compiler
comparison graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java @ 8242:ac4e8c16ffdf
Added new codegen api classes NodeId, NodeClass to codegen along with some refactorings.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 04 Mar 2013 15:14:11 +0100 |
parents | 6b74ffe38183 |
children | d81ff782fa1a |
comparison
equal
deleted
inserted
replaced
8241:91982900acee | 8242:ac4e8c16ffdf |
---|---|
69 } | 69 } |
70 | 70 |
71 private static String specializationId(SpecializationData specialization) { | 71 private static String specializationId(SpecializationData specialization) { |
72 String name = ""; | 72 String name = ""; |
73 NodeData node = specialization.getNode(); | 73 NodeData node = specialization.getNode(); |
74 if (node.getSpecializations().length > 1) { | 74 if (node.getSpecializations().size() > 1) { |
75 name = specialization.getMethodName(); | 75 name = specialization.getMethodName(); |
76 if (name.startsWith("do")) { | 76 if (name.startsWith("do")) { |
77 name = name.substring(2); | 77 name = name.substring(2); |
78 } | 78 } |
79 } | 79 } |
478 Modifier createVisibility = Utils.getVisibility(clazz.getModifiers()); | 478 Modifier createVisibility = Utils.getVisibility(clazz.getModifiers()); |
479 | 479 |
480 if (node.needsFactory()) { | 480 if (node.needsFactory()) { |
481 createFactoryMethods(node, clazz, createVisibility); | 481 createFactoryMethods(node, clazz, createVisibility); |
482 | 482 |
483 if (node.getSpecializations().length > 1) { | 483 if (node.getSpecializations().size() > 1) { |
484 clazz.add(createCreateSpecializedMethod(node, createVisibility)); | 484 clazz.add(createCreateSpecializedMethod(node, createVisibility)); |
485 } | 485 } |
486 | 486 |
487 if (node.needsRewrites(getContext())) { | 487 if (node.needsRewrites(getContext())) { |
488 clazz.add(createSpecializeMethod(node)); | 488 clazz.add(createSpecializeMethod(node)); |
779 method.getModifiers().add(Modifier.STATIC); | 779 method.getModifiers().add(Modifier.STATIC); |
780 method.setReturnType(node.getNodeType()); | 780 method.setReturnType(node.getNodeType()); |
781 | 781 |
782 CodeTreeBuilder body = method.createBuilder(); | 782 CodeTreeBuilder body = method.createBuilder(); |
783 body.startReturn(); | 783 body.startReturn(); |
784 if (node.getSpecializations().length == 0) { | 784 if (node.getSpecializations().isEmpty()) { |
785 body.null_(); | 785 body.null_(); |
786 } else { | 786 } else { |
787 body.startNew(nodeClassName(node.getSpecializations()[0])); | 787 body.startNew(nodeClassName(node.getSpecializations().get(0))); |
788 for (VariableElement var : method.getParameters()) { | 788 for (VariableElement var : method.getParameters()) { |
789 body.string(var.getSimpleName().toString()); | 789 body.string(var.getSimpleName().toString()); |
790 } | 790 } |
791 body.end(); | 791 body.end(); |
792 } | 792 } |
834 method.addParameter(new CodeVariableElement(node.getNodeType(), THIS_NODE_LOCAL_VAR_NAME)); | 834 method.addParameter(new CodeVariableElement(node.getNodeType(), THIS_NODE_LOCAL_VAR_NAME)); |
835 method.addParameter(new CodeVariableElement(getContext().getType(Class.class), "minimumState")); | 835 method.addParameter(new CodeVariableElement(getContext().getType(Class.class), "minimumState")); |
836 addValueParameters(method, node.getGenericSpecialization(), false); | 836 addValueParameters(method, node.getGenericSpecialization(), false); |
837 | 837 |
838 CodeTreeBuilder body = method.createBuilder(); | 838 CodeTreeBuilder body = method.createBuilder(); |
839 body.startStatement().string("boolean allowed = (minimumState == ").string(nodeClassName(node.getSpecializations()[0])).string(".class)").end(); | 839 body.startStatement().string("boolean allowed = (minimumState == ").string(nodeClassName(node.getSpecializations().get(0))).string(".class)").end(); |
840 | 840 |
841 for (int i = 1; i < node.getSpecializations().length; i++) { | 841 for (int i = 1; i < node.getSpecializations().size(); i++) { |
842 SpecializationData specialization = node.getSpecializations()[i]; | 842 SpecializationData specialization = node.getSpecializations().get(i); |
843 body.startStatement().string("allowed = allowed || (minimumState == ").string(nodeClassName(specialization)).string(".class)").end(); | 843 body.startStatement().string("allowed = allowed || (minimumState == ").string(nodeClassName(specialization)).string(".class)").end(); |
844 | 844 |
845 CodeTreeBuilder guarded = new CodeTreeBuilder(body); | 845 CodeTreeBuilder guarded = new CodeTreeBuilder(body); |
846 guarded.startReturn().startNew(nodeClassName(specialization)); | 846 guarded.startReturn().startNew(nodeClassName(specialization)); |
847 guarded.string(THIS_NODE_LOCAL_VAR_NAME); | 847 guarded.string(THIS_NODE_LOCAL_VAR_NAME); |
857 private List<CodeExecutableElement> createGeneratedGenericMethod(NodeData node) { | 857 private List<CodeExecutableElement> createGeneratedGenericMethod(NodeData node) { |
858 TypeMirror genericReturnType = node.getGenericSpecialization().getReturnType().getActualType(); | 858 TypeMirror genericReturnType = node.getGenericSpecialization().getReturnType().getActualType(); |
859 if (node.getGenericSpecialization().isUseSpecializationsForGeneric()) { | 859 if (node.getGenericSpecialization().isUseSpecializationsForGeneric()) { |
860 List<CodeExecutableElement> methods = new ArrayList<>(); | 860 List<CodeExecutableElement> methods = new ArrayList<>(); |
861 | 861 |
862 SpecializationData[] specializations = node.getSpecializations(); | 862 List<SpecializationData> specializations = node.getSpecializations(); |
863 SpecializationData prev = null; | 863 SpecializationData prev = null; |
864 for (int i = 0; i < specializations.length; i++) { | 864 for (int i = 0; i < specializations.size(); i++) { |
865 SpecializationData current = specializations[i]; | 865 SpecializationData current = specializations.get(i); |
866 SpecializationData next = i + 1 < specializations.length ? specializations[i + 1] : null; | 866 SpecializationData next = i + 1 < specializations.size() ? specializations.get(i + 1) : null; |
867 if (prev == null || current.isUninitialized()) { | 867 if (prev == null || current.isUninitialized()) { |
868 prev = current; | 868 prev = current; |
869 continue; | 869 continue; |
870 } else { | 870 } else { |
871 String methodName = generatedGenericMethodName(current); | 871 String methodName = generatedGenericMethodName(current); |
1193 | 1193 |
1194 builder.string(valueName(param)); | 1194 builder.string(valueName(param)); |
1195 builder.string(" = "); | 1195 builder.string(" = "); |
1196 ExecutableTypeData genericExecutableType = field.getNodeData().findGenericExecutableType(getContext(), param.getActualTypeData(node.getTypeSystem())); | 1196 ExecutableTypeData genericExecutableType = field.getNodeData().findGenericExecutableType(getContext(), param.getActualTypeData(node.getTypeSystem())); |
1197 if (genericExecutableType == null) { | 1197 if (genericExecutableType == null) { |
1198 throw new AssertionError("Must have generic executable type. Parser validation most likely failed. " + Arrays.toString(field.getNodeData().getExecutableTypes())); | 1198 throw new AssertionError("Must have generic executable type. Parser validation most likely failed. " + (field.getNodeData().getExecutableTypes())); |
1199 } | 1199 } |
1200 buildExecute(builder, param, field, genericExecutableType); | 1200 buildExecute(builder, param, field, genericExecutableType); |
1201 builder.end(); | 1201 builder.end(); |
1202 | 1202 |
1203 endShortCircuit(builder, shortCircuit); | 1203 endShortCircuit(builder, shortCircuit); |