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