comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeFactoryFactory.java @ 19282:ae81dd154fb6

Truffle-DSL: remove old DSL layout; Make new layout the default.
author Christian Humer <christian.humer@gmail.com>
date Thu, 22 Jan 2015 20:44:24 +0100
parents 4ce856e65728
children
comparison
equal deleted inserted replaced
19281:92880b0f7fed 19282:ae81dd154fb6
29 29
30 import javax.lang.model.element.*; 30 import javax.lang.model.element.*;
31 import javax.lang.model.type.*; 31 import javax.lang.model.type.*;
32 32
33 import com.oracle.truffle.api.dsl.*; 33 import com.oracle.truffle.api.dsl.*;
34 import com.oracle.truffle.api.dsl.internal.*;
35 import com.oracle.truffle.dsl.processor.*; 34 import com.oracle.truffle.dsl.processor.*;
36 import com.oracle.truffle.dsl.processor.java.*; 35 import com.oracle.truffle.dsl.processor.java.*;
37 import com.oracle.truffle.dsl.processor.java.model.*; 36 import com.oracle.truffle.dsl.processor.java.model.*;
38 import com.oracle.truffle.dsl.processor.java.model.CodeTypeMirror.ArrayCodeTypeMirror; 37 import com.oracle.truffle.dsl.processor.java.model.CodeTypeMirror.ArrayCodeTypeMirror;
39 import com.oracle.truffle.dsl.processor.model.*; 38 import com.oracle.truffle.dsl.processor.model.*;
40 39
41 class NodeFactoryFactory { 40 class NodeFactoryFactory {
42 41
43 static final String FACTORY_METHOD_NAME = "create0"; 42 static final String EMPTY_CLASS_ARRAY = "EMPTY_CLASS_ARRAY";
44 43
45 private final ProcessorContext context; 44 private final ProcessorContext context;
46 private final NodeData node; 45 private final NodeData node;
47 private final TypeSystemData typeSystem;
48 private final DSLOptions options;
49 private final CodeTypeElement createdFactoryElement; 46 private final CodeTypeElement createdFactoryElement;
50 47
51 public NodeFactoryFactory(ProcessorContext context, NodeData node, CodeTypeElement createdClass) { 48 public NodeFactoryFactory(ProcessorContext context, NodeData node, CodeTypeElement createdClass) {
52 this.context = context; 49 this.context = context;
53 this.node = node; 50 this.node = node;
54 this.createdFactoryElement = createdClass; 51 this.createdFactoryElement = createdClass;
55 this.typeSystem = node.getTypeSystem();
56 this.options = typeSystem.getOptions();
57 } 52 }
58 53
59 public static String factoryClassName(NodeData node) { 54 public static String factoryClassName(NodeData node) {
60 return node.getNodeId() + "Factory"; 55 return node.getNodeId() + "Factory";
61 } 56 }
92 builder.typeLiteral(node.getNodeType()); 87 builder.typeLiteral(node.getNodeType());
93 88
94 // execution signature 89 // execution signature
95 builder.startGroup(); 90 builder.startGroup();
96 if (node.getChildExecutions().isEmpty()) { 91 if (node.getChildExecutions().isEmpty()) {
97 builder.staticReference(context.getTruffleTypes().getDslMetadata(), NodeBaseFactory.EMPTY_CLASS_ARRAY); 92 builder.staticReference(context.getTruffleTypes().getDslMetadata(), EMPTY_CLASS_ARRAY);
98 } else { 93 } else {
99 builder.startNewArray(new ArrayCodeTypeMirror(context.getType(Class.class)), null); 94 builder.startNewArray(new ArrayCodeTypeMirror(context.getType(Class.class)), null);
100 for (NodeExecutionData execution : node.getChildExecutions()) { 95 for (NodeExecutionData execution : node.getChildExecutions()) {
101 builder.typeLiteral(execution.getNodeType()); 96 builder.typeLiteral(execution.getNodeType());
102 } 97 }
105 builder.end(); 100 builder.end();
106 101
107 // node signatures 102 // node signatures
108 builder.startGroup(); 103 builder.startGroup();
109 builder.startNewArray(new ArrayCodeTypeMirror(new ArrayCodeTypeMirror(context.getType(Class.class))), null); 104 builder.startNewArray(new ArrayCodeTypeMirror(new ArrayCodeTypeMirror(context.getType(Class.class))), null);
110 List<ExecutableElement> constructors = NodeBaseFactory.findUserConstructors(createdFactoryElement.asType()); 105 List<ExecutableElement> constructors = GeneratorUtils.findUserConstructors(createdFactoryElement.asType());
111 for (ExecutableElement constructor : constructors) { 106 for (ExecutableElement constructor : constructors) {
112 builder.startGroup(); 107 builder.startGroup();
113 if (constructor.getParameters().isEmpty()) { 108 if (constructor.getParameters().isEmpty()) {
114 builder.staticReference(context.getTruffleTypes().getDslMetadata(), NodeBaseFactory.EMPTY_CLASS_ARRAY); 109 builder.staticReference(context.getTruffleTypes().getDslMetadata(), EMPTY_CLASS_ARRAY);
115 } else { 110 } else {
116 builder.startNewArray(new ArrayCodeTypeMirror(context.getType(Class.class)), null); 111 builder.startNewArray(new ArrayCodeTypeMirror(context.getType(Class.class)), null);
117 for (VariableElement var : constructor.getParameters()) { 112 for (VariableElement var : constructor.getParameters()) {
118 builder.typeLiteral(var.asType()); 113 builder.typeLiteral(var.asType());
119 } 114 }
133 CodeVariableElement arguments = new CodeVariableElement(context.getType(Object.class), "arguments"); 128 CodeVariableElement arguments = new CodeVariableElement(context.getType(Object.class), "arguments");
134 method.setVarArgs(true); 129 method.setVarArgs(true);
135 method.addParameter(arguments); 130 method.addParameter(arguments);
136 131
137 CodeTreeBuilder builder = method.createBuilder(); 132 CodeTreeBuilder builder = method.createBuilder();
138 List<ExecutableElement> signatures = NodeBaseFactory.findUserConstructors(createdFactoryElement.asType()); 133 List<ExecutableElement> signatures = GeneratorUtils.findUserConstructors(createdFactoryElement.asType());
139 boolean ifStarted = false; 134 boolean ifStarted = false;
140 135
141 for (ExecutableElement element : signatures) { 136 for (ExecutableElement element : signatures) {
142 ifStarted = builder.startIf(ifStarted); 137 ifStarted = builder.startIf(ifStarted);
143 builder.string("arguments.length == " + element.getParameters().size()); 138 builder.string("arguments.length == " + element.getParameters().size());
228 var.getModifiers().add(Modifier.STATIC); 223 var.getModifiers().add(Modifier.STATIC);
229 return var; 224 return var;
230 } 225 }
231 226
232 public void createFactoryMethods(CodeTypeElement clazz) { 227 public void createFactoryMethods(CodeTypeElement clazz) {
233 List<ExecutableElement> constructors = NodeBaseFactory.findUserConstructors(createdFactoryElement.asType()); 228 List<ExecutableElement> constructors = GeneratorUtils.findUserConstructors(createdFactoryElement.asType());
234 for (ExecutableElement constructor : constructors) { 229 for (ExecutableElement constructor : constructors) {
235 clazz.add(createCreateMethod(constructor)); 230 clazz.add(createCreateMethod(constructor));
236 if (constructor instanceof CodeExecutableElement) { 231 if (constructor instanceof CodeExecutableElement) {
237 ElementUtils.setVisibility(constructor.getModifiers(), Modifier.PRIVATE); 232 ElementUtils.setVisibility(constructor.getModifiers(), Modifier.PRIVATE);
238 } 233 }
250 CodeTreeBuilder body = method.createBuilder(); 245 CodeTreeBuilder body = method.createBuilder();
251 body.startReturn(); 246 body.startReturn();
252 if (node.getSpecializations().isEmpty()) { 247 if (node.getSpecializations().isEmpty()) {
253 body.nullLiteral(); 248 body.nullLiteral();
254 } else { 249 } else {
255 if (options.useNewLayout()) { 250 body.startNew(NodeGenFactory.nodeType(node));
256 body.startNew(NodeGenFactory.nodeType(node));
257 } else {
258 body.startCall(NodeBaseFactory.nodeSpecializationClassName(node.getSpecializations().get(0)), FACTORY_METHOD_NAME);
259 }
260 for (VariableElement var : method.getParameters()) { 251 for (VariableElement var : method.getParameters()) {
261 body.string(var.getSimpleName().toString()); 252 body.string(var.getSimpleName().toString());
262 } 253 }
263 body.end(); 254 body.end();
264 255