Mercurial > hg > graal-compiler
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 |