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);