Mercurial > hg > truffle
comparison truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java @ 22508:a619835e6709
SpecializationNode refactoring: update root field through generated setter
author | Andreas Woess <andreas.woess@oracle.com> |
---|---|
date | Thu, 17 Dec 2015 16:16:10 +0100 |
parents | dc83cc1f94f2 |
children | 60c68f691534 |
comparison
equal
deleted
inserted
replaced
22507:23bdb1a46d0c | 22508:a619835e6709 |
---|---|
20 * or visit www.oracle.com if you need additional information or have any | 20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. | 21 * questions. |
22 */ | 22 */ |
23 package com.oracle.truffle.dsl.processor.generator; | 23 package com.oracle.truffle.dsl.processor.generator; |
24 | 24 |
25 import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.createClass; | |
26 import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.createTransferToInterpreterAndInvalidate; | |
27 import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.isTypeBoxingOptimized; | |
28 import static com.oracle.truffle.dsl.processor.java.ElementUtils.compareType; | |
29 import static com.oracle.truffle.dsl.processor.java.ElementUtils.fromTypeMirror; | |
30 import static com.oracle.truffle.dsl.processor.java.ElementUtils.getTypeId; | |
31 import static com.oracle.truffle.dsl.processor.java.ElementUtils.isObject; | |
32 import static com.oracle.truffle.dsl.processor.java.ElementUtils.isSubtypeBoxed; | |
33 import static com.oracle.truffle.dsl.processor.java.ElementUtils.isVoid; | |
34 import static com.oracle.truffle.dsl.processor.java.ElementUtils.modifiers; | |
35 import static com.oracle.truffle.dsl.processor.java.ElementUtils.needsCastTo; | |
36 import static com.oracle.truffle.dsl.processor.java.ElementUtils.setVisibility; | |
37 import static com.oracle.truffle.dsl.processor.java.ElementUtils.typeEquals; | |
38 import static javax.lang.model.element.Modifier.ABSTRACT; | |
39 import static javax.lang.model.element.Modifier.FINAL; | |
40 import static javax.lang.model.element.Modifier.PRIVATE; | |
41 import static javax.lang.model.element.Modifier.PROTECTED; | |
42 import static javax.lang.model.element.Modifier.PUBLIC; | |
43 import static javax.lang.model.element.Modifier.STATIC; | |
44 | |
45 import java.util.ArrayList; | |
46 import java.util.Arrays; | |
47 import java.util.Collection; | |
48 import java.util.Collections; | |
49 import java.util.Comparator; | |
50 import java.util.HashMap; | |
51 import java.util.HashSet; | |
52 import java.util.LinkedHashMap; | |
53 import java.util.List; | |
54 import java.util.ListIterator; | |
55 import java.util.Map; | |
56 import java.util.Objects; | |
57 import java.util.Set; | |
58 | |
59 import javax.lang.model.element.Element; | |
60 import javax.lang.model.element.ExecutableElement; | |
61 import javax.lang.model.element.Modifier; | |
62 import javax.lang.model.element.TypeElement; | |
63 import javax.lang.model.element.VariableElement; | |
64 import javax.lang.model.type.ArrayType; | |
65 import javax.lang.model.type.DeclaredType; | |
66 import javax.lang.model.type.TypeMirror; | |
67 import javax.lang.model.util.ElementFilter; | |
68 | |
25 import com.oracle.truffle.api.CompilerDirectives; | 69 import com.oracle.truffle.api.CompilerDirectives; |
26 import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; | 70 import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; |
27 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; | 71 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; |
28 import com.oracle.truffle.api.dsl.Cached; | 72 import com.oracle.truffle.api.dsl.Cached; |
29 import com.oracle.truffle.api.dsl.UnsupportedSpecializationException; | 73 import com.oracle.truffle.api.dsl.UnsupportedSpecializationException; |
41 import com.oracle.truffle.api.nodes.NodeCost; | 85 import com.oracle.truffle.api.nodes.NodeCost; |
42 import com.oracle.truffle.api.nodes.UnexpectedResultException; | 86 import com.oracle.truffle.api.nodes.UnexpectedResultException; |
43 import com.oracle.truffle.dsl.processor.ProcessorContext; | 87 import com.oracle.truffle.dsl.processor.ProcessorContext; |
44 import com.oracle.truffle.dsl.processor.expression.DSLExpression; | 88 import com.oracle.truffle.dsl.processor.expression.DSLExpression; |
45 import com.oracle.truffle.dsl.processor.expression.DSLExpression.Variable; | 89 import com.oracle.truffle.dsl.processor.expression.DSLExpression.Variable; |
46 import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.createClass; | |
47 import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.createTransferToInterpreterAndInvalidate; | |
48 import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.isTypeBoxingOptimized; | |
49 import com.oracle.truffle.dsl.processor.java.ElementUtils; | 90 import com.oracle.truffle.dsl.processor.java.ElementUtils; |
50 import static com.oracle.truffle.dsl.processor.java.ElementUtils.compareType; | |
51 import static com.oracle.truffle.dsl.processor.java.ElementUtils.fromTypeMirror; | |
52 import static com.oracle.truffle.dsl.processor.java.ElementUtils.getTypeId; | |
53 import static com.oracle.truffle.dsl.processor.java.ElementUtils.isObject; | |
54 import static com.oracle.truffle.dsl.processor.java.ElementUtils.isSubtypeBoxed; | |
55 import static com.oracle.truffle.dsl.processor.java.ElementUtils.isVoid; | |
56 import static com.oracle.truffle.dsl.processor.java.ElementUtils.modifiers; | |
57 import static com.oracle.truffle.dsl.processor.java.ElementUtils.needsCastTo; | |
58 import static com.oracle.truffle.dsl.processor.java.ElementUtils.setVisibility; | |
59 import static com.oracle.truffle.dsl.processor.java.ElementUtils.typeEquals; | |
60 import com.oracle.truffle.dsl.processor.java.model.CodeAnnotationMirror; | 91 import com.oracle.truffle.dsl.processor.java.model.CodeAnnotationMirror; |
61 import com.oracle.truffle.dsl.processor.java.model.CodeAnnotationValue; | 92 import com.oracle.truffle.dsl.processor.java.model.CodeAnnotationValue; |
62 import com.oracle.truffle.dsl.processor.java.model.CodeExecutableElement; | 93 import com.oracle.truffle.dsl.processor.java.model.CodeExecutableElement; |
63 import com.oracle.truffle.dsl.processor.java.model.CodeNames; | 94 import com.oracle.truffle.dsl.processor.java.model.CodeNames; |
64 import com.oracle.truffle.dsl.processor.java.model.CodeTree; | 95 import com.oracle.truffle.dsl.processor.java.model.CodeTree; |
82 import com.oracle.truffle.dsl.processor.model.SpecializationData; | 113 import com.oracle.truffle.dsl.processor.model.SpecializationData; |
83 import com.oracle.truffle.dsl.processor.model.TemplateMethod; | 114 import com.oracle.truffle.dsl.processor.model.TemplateMethod; |
84 import com.oracle.truffle.dsl.processor.model.TypeSystemData; | 115 import com.oracle.truffle.dsl.processor.model.TypeSystemData; |
85 import com.oracle.truffle.dsl.processor.parser.SpecializationGroup; | 116 import com.oracle.truffle.dsl.processor.parser.SpecializationGroup; |
86 import com.oracle.truffle.dsl.processor.parser.SpecializationGroup.TypeGuard; | 117 import com.oracle.truffle.dsl.processor.parser.SpecializationGroup.TypeGuard; |
87 import java.util.ArrayList; | |
88 import java.util.Arrays; | |
89 import java.util.Collection; | |
90 import java.util.Collections; | |
91 import java.util.Comparator; | |
92 import java.util.HashMap; | |
93 import java.util.HashSet; | |
94 import java.util.LinkedHashMap; | |
95 import java.util.List; | |
96 import java.util.ListIterator; | |
97 import java.util.Map; | |
98 import java.util.Objects; | |
99 import java.util.Set; | |
100 import javax.lang.model.element.Element; | |
101 import javax.lang.model.element.ExecutableElement; | |
102 import javax.lang.model.element.Modifier; | |
103 import static javax.lang.model.element.Modifier.ABSTRACT; | |
104 import static javax.lang.model.element.Modifier.FINAL; | |
105 import static javax.lang.model.element.Modifier.PRIVATE; | |
106 import static javax.lang.model.element.Modifier.PROTECTED; | |
107 import static javax.lang.model.element.Modifier.PUBLIC; | |
108 import static javax.lang.model.element.Modifier.STATIC; | |
109 import javax.lang.model.element.TypeElement; | |
110 import javax.lang.model.element.VariableElement; | |
111 import javax.lang.model.type.ArrayType; | |
112 import javax.lang.model.type.DeclaredType; | |
113 import javax.lang.model.type.TypeMirror; | |
114 import javax.lang.model.util.ElementFilter; | |
115 | 118 |
116 public class NodeGenFactory { | 119 public class NodeGenFactory { |
117 | 120 |
118 private static final String FRAME_VALUE = TemplateMethod.FRAME_NAME; | 121 private static final String FRAME_VALUE = TemplateMethod.FRAME_NAME; |
119 private static final String NAME_SUFFIX = "_"; | 122 private static final String NAME_SUFFIX = "_"; |
519 | 522 |
520 private CodeTypeElement createBaseSpecialization() { | 523 private CodeTypeElement createBaseSpecialization() { |
521 CodeTypeElement clazz = createClass(node, null, modifiers(PRIVATE, ABSTRACT, STATIC), specializationTypeName(null), typeSystem.getContext().getType(SpecializationNode.class)); | 524 CodeTypeElement clazz = createClass(node, null, modifiers(PRIVATE, ABSTRACT, STATIC), specializationTypeName(null), typeSystem.getContext().getType(SpecializationNode.class)); |
522 | 525 |
523 clazz.addOptional(createSpecializationConstructor(clazz, null, null)); | 526 clazz.addOptional(createSpecializationConstructor(clazz, null, null)); |
524 clazz.add(new CodeVariableElement(modifiers(PROTECTED, FINAL), nodeType(node), "root")); | 527 CodeVariableElement rootField = new CodeVariableElement(modifiers(PROTECTED), nodeType(node), "root"); |
528 rootField.addAnnotationMirror(new CodeAnnotationMirror(context.getDeclaredType(CompilationFinal.class))); | |
529 clazz.add(rootField); | |
525 | 530 |
526 clazz.addOptional(createUnsupported()); | 531 clazz.addOptional(createUnsupported()); |
532 clazz.add(createSetRootMethod()); | |
527 clazz.add(createGetSuppliedChildrenMethod()); | 533 clazz.add(createGetSuppliedChildrenMethod()); |
528 clazz.add(createAcceptAndExecute()); | 534 clazz.add(createAcceptAndExecute()); |
529 | 535 |
530 for (ExecutableTypeData type : usedTypes) { | 536 for (ExecutableTypeData type : usedTypes) { |
531 clazz.add(createFastPathExecuteMethod(null, type, usedTypes)); | 537 clazz.add(createFastPathExecuteMethod(null, type, usedTypes)); |
532 } | 538 } |
533 | 539 |
534 return clazz; | 540 return clazz; |
541 } | |
542 | |
543 private Element createSetRootMethod() { | |
544 CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED, FINAL), context.getType(void.class), "setRoot", new CodeVariableElement(getType(Node.class), "root")); | |
545 method.getAnnotationMirrors().add(new CodeAnnotationMirror(context.getDeclaredType(Override.class))); | |
546 | |
547 CodeTreeBuilder builder = method.createBuilder(); | |
548 builder.startStatement().string("this.root = ").cast(ElementUtils.fillInGenericWildcards(nodeType(node))).string("root").end(); | |
549 | |
550 return method; | |
535 } | 551 } |
536 | 552 |
537 private Element createAcceptAndExecute() { | 553 private Element createAcceptAndExecute() { |
538 ExecutableTypeData executableElement = createSpecializationNodeSignature(node.getSignatureSize()); | 554 ExecutableTypeData executableElement = createSpecializationNodeSignature(node.getSignatureSize()); |
539 LocalContext currentLocals = LocalContext.load(this, executableElement, varArgsThreshold); | 555 LocalContext currentLocals = LocalContext.load(this, executableElement, varArgsThreshold); |