comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/SpecializedNodeFactory.java @ 18761:a665483c3881

Truffle-DSL: new node layout implementation.
author Christian Humer <christian.humer@gmail.com>
date Mon, 29 Dec 2014 23:38:54 +0100
parents 3912400fc33a
children a720bf2e2f43
comparison
equal deleted inserted replaced
18760:6fa3999631d8 18761:a665483c3881
52 public CodeTypeElement create() { 52 public CodeTypeElement create() {
53 TypeMirror baseType = node.getNodeType(); 53 TypeMirror baseType = node.getNodeType();
54 if (nodeGen != null) { 54 if (nodeGen != null) {
55 baseType = nodeGen.asType(); 55 baseType = nodeGen.asType();
56 } 56 }
57 CodeTypeElement clazz = GeneratorUtils.createClass(node, modifiers(PRIVATE, FINAL), nodeSpecializationClassName(specialization), baseType, false); 57 CodeTypeElement clazz = GeneratorUtils.createClass(node, null, modifiers(PRIVATE, FINAL), nodeSpecializationClassName(specialization), baseType);
58 58
59 if (specialization.isSpecialized() || specialization.isUninitialized()) { 59 if (specialization.isSpecialized() || specialization.isUninitialized()) {
60 clazz.add(createGetMetadata0(false)); 60 clazz.add(createGetMetadata0(false));
61 clazz.add(createMetadataLiteral()); 61 clazz.add(createMetadataLiteral());
62 } 62 }
63 63
64 NodeCost cost; 64 NodeCost cost;
65 if (specialization.isGeneric()) { 65 if (specialization.isFallback()) {
66 cost = NodeCost.MEGAMORPHIC; 66 cost = NodeCost.MEGAMORPHIC;
67 } else if (specialization.isUninitialized()) { 67 } else if (specialization.isUninitialized()) {
68 cost = NodeCost.UNINITIALIZED; 68 cost = NodeCost.UNINITIALIZED;
69 } else if (specialization.isPolymorphic()) { 69 } else if (specialization.isPolymorphic()) {
70 cost = NodeCost.POLYMORPHIC; 70 cost = NodeCost.POLYMORPHIC;
160 builder.typeLiteral(type); 160 builder.typeLiteral(type);
161 } 161 }
162 builder.end(); 162 builder.end();
163 } 163 }
164 164
165 return builder.getRoot(); 165 return builder.build();
166 } 166 }
167 167
168 private CodeTree createSpecializationListLiteral(CodeTreeBuilder parent, Set<SpecializationData> list) { 168 private CodeTree createSpecializationListLiteral(CodeTreeBuilder parent, Set<SpecializationData> list) {
169 ArrayType classArray = new ArrayCodeTypeMirror(context.getType(Class.class)); 169 ArrayType classArray = new ArrayCodeTypeMirror(context.getType(Class.class));
170 CodeTreeBuilder builder = parent.create(); 170 CodeTreeBuilder builder = parent.create();
173 builder.staticReference(context.getTruffleTypes().getDslMetadata(), EMPTY_CLASS_ARRAY); 173 builder.staticReference(context.getTruffleTypes().getDslMetadata(), EMPTY_CLASS_ARRAY);
174 } else { 174 } else {
175 builder.startNewArray(classArray, null); 175 builder.startNewArray(classArray, null);
176 for (SpecializationData current : list) { 176 for (SpecializationData current : list) {
177 SpecializationData s = current; 177 SpecializationData s = current;
178 if (s.isGeneric() || s.isPolymorphic()) { 178 if (s.isFallback() || s.isPolymorphic()) {
179 s = getSpecialization().getNode().getUninitializedSpecialization(); 179 s = getSpecialization().getNode().getUninitializedSpecialization();
180 } 180 }
181 builder.startGroup().string(nodeSpecializationClassName(s)).string(".class").end(); 181 builder.startGroup().string(nodeSpecializationClassName(s)).string(".class").end();
182 } 182 }
183 builder.end(); 183 builder.end();
184 } 184 }
185 185
186 return builder.getRoot(); 186 return builder.build();
187 } 187 }
188 188
189 protected CodeAnnotationMirror createNodeInfo(NodeCost cost) { 189 protected CodeAnnotationMirror createNodeInfo(NodeCost cost) {
190 String shortName = node.getShortName(); 190 String shortName = node.getShortName();
191 CodeAnnotationMirror nodeInfoMirror = new CodeAnnotationMirror(context.getTruffleTypes().getNodeInfoAnnotation()); 191 CodeAnnotationMirror nodeInfoMirror = new CodeAnnotationMirror(context.getTruffleTypes().getNodeInfoAnnotation());
293 builder.tree(createExecuteTree(builder, polymorphic, SpecializationGroup.create(specialization), new CodeBlock<SpecializationData>() { 293 builder.tree(createExecuteTree(builder, polymorphic, SpecializationGroup.create(specialization), new CodeBlock<SpecializationData>() {
294 294
295 public CodeTree create(CodeTreeBuilder b, SpecializationData current) { 295 public CodeTree create(CodeTreeBuilder b, SpecializationData current) {
296 return createGenericInvoke(b, polymorphic, current); 296 return createGenericInvoke(b, polymorphic, current);
297 } 297 }
298 }, elseBuilder.getRoot(), false, true, true, false)); 298 }, elseBuilder.build(), false, true, true, false));
299 } 299 }
300 clazz.add(executeMethod); 300 clazz.add(executeMethod);
301 } 301 }
302 302
303 private static CodeTree createDeoptimizeUninitialized(NodeData node, CodeTreeBuilder parent) { 303 private static CodeTree createDeoptimizeUninitialized(NodeData node, CodeTreeBuilder parent) {
307 builder.tree(createDeoptimize(builder)); 307 builder.tree(createDeoptimize(builder));
308 builder.end(); 308 builder.end();
309 } else { 309 } else {
310 builder.tree(createDeoptimize(builder)); 310 builder.tree(createDeoptimize(builder));
311 } 311 }
312 return builder.getRoot(); 312 return builder.build();
313 } 313 }
314 314
315 private CodeTree createExecuteBody(CodeTreeBuilder parent, ExecutableTypeData execType, List<ExecutableTypeData> primaryExecutes) { 315 private CodeTree createExecuteBody(CodeTreeBuilder parent, ExecutableTypeData execType, List<ExecutableTypeData> primaryExecutes) {
316 CodeTreeBuilder builder = new CodeTreeBuilder(parent); 316 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
317 317
322 builder.tree(createCastingExecute(builder, execType, primaryExecutes.get(0))); 322 builder.tree(createCastingExecute(builder, execType, primaryExecutes.get(0)));
323 } else { 323 } else {
324 return null; 324 return null;
325 } 325 }
326 326
327 return builder.getRoot(); 327 return builder.build();
328 } 328 }
329 329
330 private CodeExecutableElement createExecutableTypeOverride(ExecutableTypeData execType, boolean evaluated) { 330 private CodeExecutableElement createExecutableTypeOverride(ExecutableTypeData execType, boolean evaluated) {
331 CodeExecutableElement method = CodeExecutableElement.clone(context.getEnvironment(), execType.getMethod()); 331 CodeExecutableElement method = CodeExecutableElement.clone(context.getEnvironment(), execType.getMethod());
332 332
442 442
443 if (specialization.findNextSpecialization() != null) { 443 if (specialization.findNextSpecialization() != null) {
444 CodeTreeBuilder returnBuilder = new CodeTreeBuilder(builder); 444 CodeTreeBuilder returnBuilder = new CodeTreeBuilder(builder);
445 returnBuilder.tree(createDeoptimize(builder)); 445 returnBuilder.tree(createDeoptimize(builder));
446 returnBuilder.tree(createCallRewriteMonomorphic(builder, executable.hasUnexpectedValue(context), executable.getType(), null, "One of guards " + specialization.getGuards() + " failed")); 446 returnBuilder.tree(createCallRewriteMonomorphic(builder, executable.hasUnexpectedValue(context), executable.getType(), null, "One of guards " + specialization.getGuards() + " failed"));
447 returnSpecialized = returnBuilder.getRoot(); 447 returnSpecialized = returnBuilder.build();
448 } 448 }
449 449
450 builder.tree(createExecuteTree(builder, specialization, SpecializationGroup.create(specialization), new CodeBlock<SpecializationData>() { 450 builder.tree(createExecuteTree(builder, specialization, SpecializationGroup.create(specialization), new CodeBlock<SpecializationData>() {
451 451
452 public CodeTree create(CodeTreeBuilder b, SpecializationData current) { 452 public CodeTree create(CodeTreeBuilder b, SpecializationData current) {
453 return createExecute(b, executable); 453 return createExecute(b, executable);
454 } 454 }
455 }, returnSpecialized, false, false, false, false)); 455 }, returnSpecialized, false, false, false, false));
456 456
457 return builder.getRoot(); 457 return builder.build();
458 } 458 }
459 459
460 private CodeTree createExecute(CodeTreeBuilder parent, ExecutableTypeData executable) { 460 private CodeTree createExecute(CodeTreeBuilder parent, ExecutableTypeData executable) {
461 CodeTreeBuilder builder = new CodeTreeBuilder(parent); 461 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
462 if (!specialization.getExceptions().isEmpty() || !specialization.getAssumptions().isEmpty()) { 462 if (!specialization.getExceptions().isEmpty() || !specialization.getAssumptions().isEmpty()) {
488 TypeData targetType = node.getTypeSystem().findTypeData(builder.findMethod().getReturnType()); 488 TypeData targetType = node.getTypeSystem().findTypeData(builder.findMethod().getReturnType());
489 TypeData sourceType = specialization.getReturnType().getTypeSystemType(); 489 TypeData sourceType = specialization.getReturnType().getTypeSystemType();
490 490
491 builder.startReturn(); 491 builder.startReturn();
492 if (targetType == null || sourceType == null) { 492 if (targetType == null || sourceType == null) {
493 builder.tree(returnBuilder.getRoot()); 493 builder.tree(returnBuilder.build());
494 } else if (sourceType.needsCastTo(targetType)) { 494 } else if (sourceType.needsCastTo(targetType)) {
495 CodeTree cast; 495 CodeTree cast;
496 if (executable.hasUnexpectedValue(context)) { 496 if (executable.hasUnexpectedValue(context)) {
497 cast = TypeSystemCodeGenerator.expect(targetType, returnBuilder.getRoot()); 497 cast = TypeSystemCodeGenerator.expect(targetType, returnBuilder.build());
498 } else { 498 } else {
499 cast = TypeSystemCodeGenerator.cast(targetType, returnBuilder.getRoot()); 499 cast = TypeSystemCodeGenerator.cast(targetType, returnBuilder.build());
500 } 500 }
501 builder.tree(cast); 501 builder.tree(cast);
502 } else { 502 } else {
503 builder.tree(returnBuilder.getRoot()); 503 builder.tree(returnBuilder.build());
504 } 504 }
505 builder.end(); 505 builder.end();
506 } 506 }
507 507
508 if (!specialization.getExceptions().isEmpty()) { 508 if (!specialization.getExceptions().isEmpty()) {
517 builder.end().startCatchBlock(context.getTruffleTypes().getInvalidAssumption(), "ex"); 517 builder.end().startCatchBlock(context.getTruffleTypes().getInvalidAssumption(), "ex");
518 builder.tree(createCallRewriteMonomorphic(parent, executable.hasUnexpectedValue(context), executable.getType(), null, "Assumption failed")); 518 builder.tree(createCallRewriteMonomorphic(parent, executable.hasUnexpectedValue(context), executable.getType(), null, "Assumption failed"));
519 builder.end(); 519 builder.end();
520 } 520 }
521 521
522 return builder.getRoot(); 522 return builder.build();
523 } 523 }
524 524
525 private CodeExecutableElement createCopyConstructorFactoryMethod(CodeTypeElement clazz, TypeMirror baseType) { 525 private CodeExecutableElement createCopyConstructorFactoryMethod(CodeTypeElement clazz, TypeMirror baseType) {
526 List<Parameter> implicitTypeParams = getImplicitTypeParameters(specialization); 526 List<Parameter> implicitTypeParams = getImplicitTypeParameters(specialization);
527 String baseName = "current"; 527 String baseName = "current";