annotate graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java @ 9286:39f08ef7b5d8

Fixed bugs for execute evaluated generation.
author Christian Humer <christian.humer@gmail.com>
date Wed, 24 Apr 2013 18:39:41 +0200
parents e16363e50252
children 8e3a1635cc9e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1 /*
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2 * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved.
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
4 *
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
8 *
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
13 * accompanied this code).
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
14 *
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
18 *
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
21 * questions.
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
22 */
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
23 package com.oracle.truffle.codegen.processor.node;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
24
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
25 import static com.oracle.truffle.codegen.processor.Utils.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
26 import static javax.lang.model.element.Modifier.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
27
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
28 import java.util.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
29
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
30 import javax.lang.model.element.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
31 import javax.lang.model.type.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
32 import javax.lang.model.util.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
33
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
34 import com.oracle.truffle.api.codegen.*;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
35 import com.oracle.truffle.codegen.processor.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
36 import com.oracle.truffle.codegen.processor.ast.*;
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
37 import com.oracle.truffle.codegen.processor.node.NodeChildData.Cardinality;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
38 import com.oracle.truffle.codegen.processor.node.NodeChildData.ExecutionKind;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
39 import com.oracle.truffle.codegen.processor.template.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
40 import com.oracle.truffle.codegen.processor.typesystem.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
41
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
42 public class NodeCodeGenerator extends CompilationUnitFactory<NodeData> {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
43
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
44 private static final String THIS_NODE_LOCAL_VAR_NAME = "thisNode";
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
45
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
46 public NodeCodeGenerator(ProcessorContext context) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
47 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
48 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
49
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
50 private TypeMirror getUnexpectedValueException() {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
51 return getContext().getTruffleTypes().getUnexpectedValueException();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
52 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
53
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
54 private static String factoryClassName(NodeData node) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
55 return node.getNodeId() + "Factory";
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
56 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
57
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
58 private static String nodeSpecializationClassName(SpecializationData specialization) {
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
59 String nodeid = specialization.getNode().getNodeId();
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
60 if (nodeid.endsWith("Node") && !nodeid.equals("Node")) {
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
61 nodeid = nodeid.substring(0, nodeid.length() - 4);
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
62 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
63
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
64 String name = Utils.firstLetterUpperCase(nodeid);
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
65 name += Utils.firstLetterUpperCase(specialization.getId());
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
66 name += "Node";
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
67 return name;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
68 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
69
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
70 private static String valueNameEvaluated(ActualParameter targetParameter) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
71 return valueName(targetParameter) + "Evaluated";
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
72 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
73
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
74 private static String valueName(ActualParameter param) {
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
75 return param.getLocalName();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
76 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
77
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
78 private static String castValueName(ActualParameter parameter) {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
79 return valueName(parameter) + "Cast";
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
80 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
81
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
82 private void addInternalValueParameters(CodeExecutableElement method, TemplateMethod specialization, boolean forceFrame) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
83 if (forceFrame && specialization.getSpecification().findParameterSpec("frame") != null) {
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
84 method.addParameter(new CodeVariableElement(getContext().getTruffleTypes().getFrame(), "frameValue"));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
85 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
86 for (ActualParameter parameter : specialization.getParameters()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
87 ParameterSpec spec = parameter.getSpecification();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
88 if (forceFrame && spec.getName().equals("frame")) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
89 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
90 }
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
91 if (spec.isLocal()) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
92 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
93 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
94
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
95 method.addParameter(new CodeVariableElement(parameter.getType(), valueName(parameter)));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
96 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
97 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
98
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
99 private static void addInternalValueParameterNames(CodeTreeBuilder builder, TemplateMethod source, TemplateMethod specialization, String unexpectedValueName, boolean forceFrame,
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
100 boolean includeImplicit) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
101 if (forceFrame && specialization.getSpecification().findParameterSpec("frame") != null) {
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
102 builder.string("frameValue");
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
103 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
104 for (ActualParameter parameter : specialization.getParameters()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
105 ParameterSpec spec = parameter.getSpecification();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
106 if (forceFrame && spec.getName().equals("frame")) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
107 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
108 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
109
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
110 if (!includeImplicit && (parameter.isImplicit())) {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
111 continue;
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
112 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
113 if (parameter.getSpecification().isLocal()) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
114 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
115 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
116
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
117 ActualParameter sourceParameter = source.findParameter(parameter.getLocalName());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
118
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
119 if (unexpectedValueName != null && parameter.getLocalName().equals(unexpectedValueName)) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
120 builder.cast(parameter.getType(), CodeTreeBuilder.singleString("ex.getResult()"));
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
121 } else if (sourceParameter != null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
122 builder.string(valueName(sourceParameter, parameter));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
123 } else {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
124 builder.string(valueName(parameter));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
125 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
126 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
127 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
128
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
129 private static String valueName(ActualParameter sourceParameter, ActualParameter targetParameter) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
130 if (sourceParameter != null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
131 if (!sourceParameter.getSpecification().isSignature()) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
132 return valueName(targetParameter);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
133 } else if (sourceParameter.getTypeSystemType() != null && targetParameter.getTypeSystemType() != null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
134 if (sourceParameter.getTypeSystemType().needsCastTo(targetParameter.getTypeSystemType())) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
135 return castValueName(targetParameter);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
136 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
137 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
138 return valueName(targetParameter);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
139 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
140 return valueName(targetParameter);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
141 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
142 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
143
9227
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
144 private CodeTree createTemplateMethodCall(CodeTreeBuilder parent, TemplateMethod sourceMethod, TemplateMethod targetMethod, String unexpectedValueName) {
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
145 CodeTreeBuilder builder = parent.create();
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
146
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
147 boolean castedValues = sourceMethod != targetMethod;
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
148
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
149 builder.startGroup();
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
150 ExecutableElement method = targetMethod.getMethod();
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
151 if (method == null) {
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
152 throw new IllegalStateException("Cannot call synthetic operation methods.");
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
153 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
154 TypeElement targetClass = Utils.findNearestEnclosingType(method.getEnclosingElement());
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
155 NodeData node = (NodeData) targetMethod.getTemplate();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
156
9227
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
157 boolean accessible = targetMethod.canBeAccessedByInstanceOf(getContext(), node.getNodeType());
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
158 if (accessible) {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
159 if (builder.findMethod().getModifiers().contains(STATIC)) {
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
160 if (method.getModifiers().contains(STATIC)) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
161 builder.type(targetClass.asType());
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
162 } else {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
163 builder.string(THIS_NODE_LOCAL_VAR_NAME);
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
164 }
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
165 } else {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
166 if (targetMethod instanceof ExecutableTypeData) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
167 builder.string("this");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
168 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
169 builder.string("super");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
170 }
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
171 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
172 } else {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
173 if (method.getModifiers().contains(STATIC)) {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
174 builder.type(targetClass.asType());
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
175 } else {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
176 ActualParameter parameter = null;
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
177 for (ActualParameter searchParameter : targetMethod.getParameters()) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
178 if (searchParameter.getSpecification().isSignature()) {
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
179 parameter = searchParameter;
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
180 break;
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
181 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
182 }
8662
5eeade940236 Fixed user generic signature must not match generated generic signature.
Christian Humer <christian.humer@gmail.com>
parents: 8661
diff changeset
183 ActualParameter sourceParameter = sourceMethod.findParameter(parameter.getLocalName());
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
184 assert parameter != null;
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
185
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
186 if (castedValues && sourceParameter != null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
187 builder.string(valueName(sourceParameter, parameter));
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
188 } else {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
189 builder.string(valueName(parameter));
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
190 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
191 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
192 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
193 builder.string(".");
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
194 builder.startCall(method.getSimpleName().toString());
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
195
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
196 for (ActualParameter targetParameter : targetMethod.getParameters()) {
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
197 ActualParameter valueParameter = sourceMethod.findParameter(targetParameter.getLocalName());
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
198 if (valueParameter == null) {
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
199 valueParameter = targetParameter;
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
200 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
201 TypeData targetType = targetParameter.getTypeSystemType();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
202
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
203 if (targetParameter.isImplicit() || valueParameter.isImplicit()) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
204 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
205 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
206
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
207 TypeData valueType = null;
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
208 if (valueParameter != null) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
209 valueType = valueParameter.getTypeSystemType();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
210 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
211
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
212 if (targetParameter.getSpecification().isLocal()) {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
213 builder.startGroup();
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
214 if (builder.findMethod().getModifiers().contains(Modifier.STATIC)) {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
215 builder.string(THIS_NODE_LOCAL_VAR_NAME).string(".");
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
216 } else {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
217 builder.string("this.");
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
218 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
219 builder.string(targetParameter.getSpecification().getName());
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
220 builder.end();
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
221 } else if (unexpectedValueName != null && targetParameter.getLocalName().equals(unexpectedValueName)) {
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
222 builder.string("ex.getResult()");
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
223 } else if (targetType == null || targetType.isGeneric() || (valueType != null && valueType.equalsType(targetType))) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
224 builder.startGroup();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
225
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
226 if (valueType != null && sourceMethod.getMethodName().equals(targetMethod.getMethodName()) && !valueType.isGeneric() && targetType.isGeneric()) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
227 builder.string("(");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
228 builder.type(targetType.getPrimitiveType());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
229 builder.string(") ");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
230 }
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
231 builder.string(valueName(targetParameter));
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
232 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
233 } else {
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
234 builder.string(castValueName(targetParameter));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
235 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
236 }
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
237
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
238 builder.end().end();
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
239
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
240 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
241 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
242
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
243 private static String genClassName(NodeData node) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
244 String nodeid = node.getNodeId();
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
245 if (nodeid.endsWith("Node") && !nodeid.equals("Node")) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
246 nodeid = nodeid.substring(0, nodeid.length() - 4);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
247 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
248 String name = Utils.firstLetterUpperCase(nodeid);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
249 name += "GenNode";
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
250 return name;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
251 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
252
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
253 private String generatedGenericMethodName(SpecializationData specialization) {
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
254 final String prefix = "generic";
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
255
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
256 if (specialization == null) {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
257 return prefix;
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
258 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
259
8277
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
260 if (!specialization.getNode().needsRewrites(context)) {
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
261 return prefix;
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
262 }
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
263
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
264 SpecializationData prev = null;
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
265 for (SpecializationData current : specialization.getNode().getSpecializations()) {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
266 if (specialization == current) {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
267 if (prev == null || prev.isUninitialized()) {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
268 return prefix;
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
269 } else {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
270 return prefix + current.getId();
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
271 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
272 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
273 prev = current;
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
274 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
275 return prefix;
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
276 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
277
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
278 private static CodeTree createCallTypeSystemMethod(ProcessorContext context, CodeTreeBuilder parent, NodeData node, String methodName, CodeTree value) {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
279 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
280 startCallTypeSystemMethod(context, builder, node, methodName);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
281 builder.tree(value);
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
282 builder.end().end();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
283 return builder.getRoot();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
284 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
285
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7502
diff changeset
286 private static void startCallTypeSystemMethod(ProcessorContext context, CodeTreeBuilder body, NodeData node, String methodName) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
287 VariableElement singleton = TypeSystemCodeGenerator.findSingleton(context, node.getTypeSystem());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
288 assert singleton != null;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
289
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
290 body.startGroup();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
291 body.staticReference(singleton.getEnclosingElement().asType(), singleton.getSimpleName().toString());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
292 body.string(".").startCall(methodName);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
293 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
294
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
295 private CodeTree createGuardAndCast(CodeTreeBuilder parent, String conditionPrefix, SpecializationData sourceSpecialization, SpecializationData targetSpecialization, boolean castValues,
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
296 CodeTree guardedStatements, CodeTree elseStatements, boolean emitAssumptions) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
297
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
298 NodeData node = targetSpecialization.getNode();
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
299 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
300 CodeTree implicitGuards = createImplicitGuards(parent, conditionPrefix, sourceSpecialization, targetSpecialization, emitAssumptions);
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
301 CodeTree explicitGuards = createExplicitGuards(parent, implicitGuards == null ? conditionPrefix : null, sourceSpecialization, targetSpecialization);
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
302
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
303 Set<String> valuesNeedsCast;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
304 if (castValues) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
305 // cast all
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
306 valuesNeedsCast = null;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
307 } else {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
308 // find out which values needs a cast
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
309 valuesNeedsCast = new HashSet<>();
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
310 for (GuardData guard : targetSpecialization.getGuards()) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
311 for (ActualParameter targetParameter : guard.getParameters()) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
312 NodeChildData field = node.findChild(targetParameter.getSpecification().getName());
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
313 if (field == null) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
314 continue;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
315 }
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
316 TypeData targetType = targetParameter.getTypeSystemType();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
317 ActualParameter sourceParameter = sourceSpecialization.findParameter(targetParameter.getLocalName());
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
318 if (sourceParameter == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
319 sourceParameter = targetParameter;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
320 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
321 TypeData sourceType = sourceParameter.getTypeSystemType();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
322
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
323 if (sourceType.needsCastTo(targetType)) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
324 valuesNeedsCast.add(targetParameter.getLocalName());
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
325 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
326 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
327 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
328 }
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
329
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
330 int ifCount = 0;
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
331
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
332 if (implicitGuards != null) {
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
333 builder.startIf();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
334 builder.tree(implicitGuards);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
335 builder.end();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
336 builder.startBlock();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
337 ifCount++;
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
338 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
339
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
340 builder.tree(createCasts(parent, valuesNeedsCast, sourceSpecialization, targetSpecialization));
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
341
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
342 if (explicitGuards != null) {
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
343 builder.startIf();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
344 builder.tree(explicitGuards);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
345 builder.end();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
346 builder.startBlock();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
347 ifCount++;
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
348 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
349
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
350 if (implicitGuards == null && explicitGuards == null && conditionPrefix != null && !conditionPrefix.isEmpty()) {
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
351 builder.startIf();
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
352 builder.string(conditionPrefix);
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
353 builder.end().startBlock();
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
354 ifCount++;
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
355 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
356
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
357 builder.tree(guardedStatements);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
358
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
359 builder.end(ifCount);
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
360 if (elseStatements != null && ifCount > 0) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
361 builder.tree(elseStatements);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
362 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
363 return builder.getRoot();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
364 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
365
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
366 private CodeTree createExplicitGuards(CodeTreeBuilder parent, String conditionPrefix, TemplateMethod valueSpecialization, SpecializationData guardedSpecialization) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
367 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
368 String andOperator = conditionPrefix != null ? conditionPrefix + " && " : "";
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
369 if (guardedSpecialization.getGuards().size() > 0) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
370 // Explicitly specified guards
8592
a80bf36c6a1e Refactor to shared template method signature comparison.
Christian Humer <christian.humer@gmail.com>
parents: 8361
diff changeset
371 for (GuardData guard : guardedSpecialization.getGuards()) {
a80bf36c6a1e Refactor to shared template method signature comparison.
Christian Humer <christian.humer@gmail.com>
parents: 8361
diff changeset
372 builder.string(andOperator);
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
373 builder.tree(createTemplateMethodCall(parent, valueSpecialization, guard, null));
8592
a80bf36c6a1e Refactor to shared template method signature comparison.
Christian Humer <christian.humer@gmail.com>
parents: 8361
diff changeset
374 andOperator = " && ";
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
375 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
376 }
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
377
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
378 return builder.isEmpty() ? null : builder.getRoot();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
379 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
380
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
381 private CodeTree createCasts(CodeTreeBuilder parent, Set<String> castWhiteList, TemplateMethod valueSpecialization, SpecializationData guardedSpecialization) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
382 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
383 // Implict guards based on method signature
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
384 for (ActualParameter guardedParam : guardedSpecialization.getParameters()) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
385 NodeChildData field = guardedSpecialization.getNode().findChild(guardedParam.getSpecification().getName());
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
386 if (field == null) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
387 continue;
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
388 }
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
389 ActualParameter valueParam = valueSpecialization.findParameter(guardedParam.getLocalName());
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
390
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
391 if (valueParam == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
392 /*
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
393 * If used inside a function execute method. The value param may not exist. In that
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
394 * case it assumes that the value is already converted.
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
395 */
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
396 valueParam = guardedParam;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
397 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
398
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
399 if (castWhiteList != null && !castWhiteList.contains(guardedParam.getLocalName())) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
400 continue;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
401 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
402
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
403 CodeTree cast = createCast(parent, field, valueParam, guardedParam);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
404 if (cast == null) {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
405 continue;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
406 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
407 builder.tree(cast);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
408 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
409
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
410 return builder.getRoot();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
411 }
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
412
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
413 private CodeTree createImplicitGuards(CodeTreeBuilder parent, String conditionPrefix, SpecializationData valueSpecialization, SpecializationData guardedSpecialization, boolean emitAssumptions) {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
414 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
415 // Implict guards based on method signature
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
416 String andOperator = conditionPrefix != null ? conditionPrefix + " && " : "";
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
417
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
418 if (emitAssumptions) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
419 boolean isStatic = parent.findMethod().getModifiers().contains(STATIC);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
420
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
421 for (String assumption : guardedSpecialization.getAssumptions()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
422 builder.string(andOperator);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
423 if (isStatic) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
424 builder.string(THIS_NODE_LOCAL_VAR_NAME);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
425 } else {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
426 builder.string("this");
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
427 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
428 builder.string(".").string(assumption).string(".isValid()");
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
429 andOperator = " && ";
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
430 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
431 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
432
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
433 for (ActualParameter guardedParam : guardedSpecialization.getParameters()) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
434 NodeChildData field = guardedSpecialization.getNode().findChild(guardedParam.getSpecification().getName());
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
435 if (field == null) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
436 continue;
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
437 }
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
438 ActualParameter valueParam = valueSpecialization.findParameter(guardedParam.getLocalName());
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
439
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
440 if (valueParam == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
441 /*
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
442 * If used inside a function execute method. The value param may not exist. In that
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
443 * case it assumes that the value is already converted.
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
444 */
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
445 valueParam = guardedParam;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
446 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
447
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
448 CodeTree implicitGuard = createImplicitGuard(builder, field, valueParam, guardedParam);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
449 if (implicitGuard == null) {
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
450 continue;
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
451 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
452
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
453 builder.string(andOperator);
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
454 builder.tree(implicitGuard);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
455 andOperator = " && ";
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
456 }
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
457
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
458 return builder.isEmpty() ? null : builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
459 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
460
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
461 private CodeTree createImplicitGuard(CodeTreeBuilder parent, NodeChildData field, ActualParameter source, ActualParameter target) {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
462 NodeData node = field.getNodeData();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
463 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
464
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
465 TypeData targetType = target.getTypeSystemType();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
466 TypeData sourceType = source.getTypeSystemType();
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
467
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
468 if (!sourceType.needsCastTo(targetType)) {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
469 return null;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
470 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
471
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
472 builder.startGroup();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
473
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
474 if (field.isShortCircuit()) {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
475 ActualParameter shortCircuit = target.getPreviousParameter();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
476 assert shortCircuit != null;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
477 builder.string("(");
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
478 builder.string("!").string(valueName(shortCircuit));
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
479 builder.string(" || ");
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
480 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
481
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
482 startCallTypeSystemMethod(getContext(), builder, node, TypeSystemCodeGenerator.isTypeMethodName(target.getTypeSystemType()));
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
483 builder.string(valueName(source));
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
484 builder.end().end(); // call
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
485
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
486 if (field.isShortCircuit()) {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
487 builder.string(")");
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
488 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
489
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
490 builder.end(); // group
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
491
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
492 return builder.getRoot();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
493 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
494
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
495 private CodeTree createCast(CodeTreeBuilder parent, NodeChildData field, ActualParameter source, ActualParameter target) {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
496 NodeData node = field.getNodeData();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
497 TypeData sourceType = source.getTypeSystemType();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
498 TypeData targetType = target.getTypeSystemType();
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
499
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
500 if (!sourceType.needsCastTo(targetType)) {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
501 return null;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
502 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
503
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
504 CodeTree condition = null;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
505 if (field.isShortCircuit()) {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
506 ActualParameter shortCircuit = target.getPreviousParameter();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
507 assert shortCircuit != null;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
508 condition = CodeTreeBuilder.singleString(valueName(shortCircuit));
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
509 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
510
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
511 CodeTree value = createCallTypeSystemMethod(context, parent, node, TypeSystemCodeGenerator.asTypeMethodName(targetType), CodeTreeBuilder.singleString(valueName(target)));
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
512
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
513 return createLazyAssignment(parent, castValueName(target), target.getType(), condition, value);
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
514 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
515
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
516 /**
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
517 * <pre>
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
518 * variant1 $condition != null
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
519 *
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
520 * $type $name = defaultValue($type);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
521 * if ($condition) {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
522 * $name = $value;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
523 * }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
524 *
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
525 * variant2 $condition != null
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
526 * $type $name = $value;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
527 * </pre>
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
528 *
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
529 * .
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
530 */
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
531 private static CodeTree createLazyAssignment(CodeTreeBuilder parent, String name, TypeMirror type, CodeTree condition, CodeTree value) {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
532 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
533 if (condition == null) {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
534 builder.declaration(type, name, value);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
535 } else {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
536 builder.declaration(type, name, new CodeTreeBuilder(parent).defaultValue(type).getRoot());
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
537
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
538 builder.startIf().tree(condition).end();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
539 builder.startBlock();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
540 builder.startStatement();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
541 builder.string(name);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
542 builder.string(" = ");
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
543 builder.tree(value);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
544 builder.end(); // statement
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
545 builder.end(); // block
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
546 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
547 return builder.getRoot();
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
548 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
549
8251
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
550 private void emitEncounteredSynthetic(CodeTreeBuilder builder) {
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
551 builder.startThrow().startNew(getContext().getType(UnsupportedOperationException.class)).end().end();
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
552 }
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
553
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
554 private static List<ExecutableElement> findUserConstructors(TypeMirror nodeType) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
555 List<ExecutableElement> constructors = new ArrayList<>();
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
556 for (ExecutableElement constructor : ElementFilter.constructorsIn(Utils.fromTypeMirror(nodeType).getEnclosedElements())) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
557 if (constructor.getModifiers().contains(PRIVATE)) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
558 continue;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
559 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
560 if (isCopyConstructor(constructor)) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
561 continue;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
562 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
563 constructors.add(constructor);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
564 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
565
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
566 if (constructors.isEmpty()) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
567 constructors.add(new CodeExecutableElement(null, Utils.getSimpleName(nodeType)));
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
568 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
569
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
570 return constructors;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
571 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
572
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
573 private static ExecutableElement findCopyConstructor(TypeMirror type) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
574 for (ExecutableElement constructor : ElementFilter.constructorsIn(Utils.fromTypeMirror(type).getEnclosedElements())) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
575 if (constructor.getModifiers().contains(PRIVATE)) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
576 continue;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
577 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
578 if (isCopyConstructor(constructor)) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
579 return constructor;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
580 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
581 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
582
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
583 return null;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
584 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
585
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
586 private static boolean isCopyConstructor(ExecutableElement element) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
587 if (element.getParameters().size() != 1) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
588 return false;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
589 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
590 VariableElement var = element.getParameters().get(0);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
591 TypeElement type = Utils.findNearestEnclosingType(var);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
592
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
593 if (!Utils.typeEquals(var.asType(), type.asType())) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
594 return false;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
595 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
596 return true;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
597 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
598
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
599 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
600 protected void createChildren(NodeData node) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
601 Map<NodeData, List<TypeElement>> childTypes = new LinkedHashMap<>();
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
602 if (node.getDeclaredNodes() != null && !node.getDeclaredNodes().isEmpty()) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
603 for (NodeData nodeChild : node.getDeclaredNodes()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
604 NodeCodeGenerator generator = new NodeCodeGenerator(getContext());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
605 childTypes.put(nodeChild, generator.process(null, nodeChild).getEnclosedElements());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
606 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
607 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
608
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
609 if (node.needsFactory() || node.getNodeDeclaringChildren().size() > 0) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
610 add(new NodeFactoryFactory(context, childTypes), node);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
611 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
612 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
613
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
614 private class NodeGenFactory extends ClassElementFactory<NodeData> {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
615
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
616 public NodeGenFactory(ProcessorContext context) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
617 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
618 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
619
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
620 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
621 protected CodeTypeElement create(NodeData node) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
622 CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, ABSTRACT, STATIC), genClassName(node), node.getNodeType(), false);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
623
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
624 for (NodeChildData child : node.getChildren()) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
625 clazz.add(createChildField(child));
9227
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
626
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
627 if (child.getAccessElement() != null && child.getAccessElement().getModifiers().contains(Modifier.ABSTRACT)) {
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
628 ExecutableElement getter = (ExecutableElement) child.getAccessElement();
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
629 CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), getter);
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
630 method.getModifiers().remove(Modifier.ABSTRACT);
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
631 method.createBuilder().startReturn().string("this.").string(child.getName()).end();
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
632 clazz.add(method);
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
633 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
634 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
635
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
636 for (String assumption : node.getAssumptions()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
637 clazz.add(createAssumptionField(assumption));
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
638 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
639
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
640 createConstructors(node, clazz);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
641
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
642 if (node.getExtensionElements() != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
643 clazz.getEnclosedElements().addAll(node.getExtensionElements());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
644 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
645
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
646 return clazz;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
647 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
648
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
649 private void createConstructors(NodeData node, CodeTypeElement clazz) {
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
650 List<ExecutableElement> constructors = findUserConstructors(node.getNodeType());
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
651 if (constructors.isEmpty()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
652 clazz.add(createUserConstructor(clazz, null));
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
653 } else {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
654 for (ExecutableElement constructor : constructors) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
655 clazz.add(createUserConstructor(clazz, constructor));
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
656 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
657 }
9281
e16363e50252 Fixed minor bug in gen constructor generation.
Christian Humer <christian.humer@gmail.com>
parents: 9279
diff changeset
658 if (node.needsRewrites(getContext())) {
e16363e50252 Fixed minor bug in gen constructor generation.
Christian Humer <christian.humer@gmail.com>
parents: 9279
diff changeset
659 clazz.add(createCopyConstructor(clazz, findCopyConstructor(node.getNodeType())));
e16363e50252 Fixed minor bug in gen constructor generation.
Christian Humer <christian.humer@gmail.com>
parents: 9279
diff changeset
660 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
661 }
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
662
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
663 private CodeExecutableElement createUserConstructor(CodeTypeElement type, ExecutableElement superConstructor) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
664 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString());
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
665 CodeTreeBuilder builder = method.createBuilder();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
666
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
667 if (superConstructor != null) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
668 for (VariableElement param : superConstructor.getParameters()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
669 method.getParameters().add(CodeVariableElement.clone(param));
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
670 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
671 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
672
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
673 for (VariableElement var : type.getFields()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
674 method.getParameters().add(new CodeVariableElement(var.asType(), var.getSimpleName().toString()));
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
675 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
676
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
677 if (superConstructor != null) {
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
678 builder.startStatement().startSuperCall();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
679 for (VariableElement param : superConstructor.getParameters()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
680 builder.string(param.getSimpleName().toString());
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
681 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
682 builder.end().end();
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
683 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
684
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
685 for (VariableElement var : type.getFields()) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
686 builder.startStatement();
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
687 String varName = var.getSimpleName().toString();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
688 builder.string("this.").string(varName);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
689 if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNode())) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
690 builder.string(" = adoptChild(").string(varName).string(")");
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
691 } else if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNodeArray())) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
692 builder.string(" = adoptChildren(").string(varName).string(")");
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
693 } else {
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
694 builder.string(" = ").string(varName);
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
695 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
696 builder.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
697 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
698 return method;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
699 }
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
700
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
701 private CodeExecutableElement createCopyConstructor(CodeTypeElement type, ExecutableElement superConstructor) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
702 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString());
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
703 CodeTreeBuilder builder = method.createBuilder();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
704 if (!(superConstructor == null && type.getFields().isEmpty())) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
705 method.getParameters().add(new CodeVariableElement(type.asType(), "copy"));
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
706 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
707
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
708 if (superConstructor != null) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
709 builder.startStatement().startSuperCall().string("copy").end().end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
710 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
711
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
712 for (VariableElement var : type.getFields()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
713 builder.startStatement();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
714 String varName = var.getSimpleName().toString();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
715 builder.string("this.").string(varName);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
716 if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNode())) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
717 builder.string(" = adoptChild(copy.").string(varName).string(")");
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
718 } else if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNodeArray())) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
719 builder.string(" = adoptChildren(copy.").string(varName).string(")");
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
720 } else {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
721 builder.string(" = copy.").string(varName);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
722 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
723 builder.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
724 }
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
725 return method;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
726 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
727
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
728 private CodeVariableElement createAssumptionField(String assumption) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
729 CodeVariableElement var = new CodeVariableElement(getContext().getTruffleTypes().getAssumption(), assumption);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
730 var.getModifiers().add(Modifier.FINAL);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
731 return var;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
732 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
733
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
734 private CodeVariableElement createChildField(NodeChildData child) {
9258
07f8d136a05e Truffle API changes for the Frame API. Introduction of Assumptions class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9231
diff changeset
735 CodeVariableElement var = new CodeVariableElement(child.getNodeType(), child.getName());
07f8d136a05e Truffle API changes for the Frame API. Introduction of Assumptions class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9231
diff changeset
736 var.getModifiers().add(Modifier.PROTECTED);
07f8d136a05e Truffle API changes for the Frame API. Introduction of Assumptions class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9231
diff changeset
737
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
738 DeclaredType annotationType;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
739 if (child.getCardinality() == Cardinality.MANY) {
9258
07f8d136a05e Truffle API changes for the Frame API. Introduction of Assumptions class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9231
diff changeset
740 var.getModifiers().add(Modifier.FINAL);
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
741 annotationType = getContext().getTruffleTypes().getChildrenAnnotation();
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
742 } else {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
743 annotationType = getContext().getTruffleTypes().getChildAnnotation();
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
744 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
745
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
746 var.getAnnotationMirrors().add(new CodeAnnotationMirror(annotationType));
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
747 return var;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
748 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
749 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
750
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
751 private class NodeFactoryFactory extends ClassElementFactory<NodeData> {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
752
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
753 private final Map<NodeData, List<TypeElement>> childTypes;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
754
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
755 private CodeTypeElement generatedNode;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
756
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
757 public NodeFactoryFactory(ProcessorContext context, Map<NodeData, List<TypeElement>> childElements) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
758 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
759 this.childTypes = childElements;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
760 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
761
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
762 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
763 protected CodeTypeElement create(NodeData node) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
764 Modifier visibility = Utils.getVisibility(node.getTemplateType().getModifiers());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
765 CodeTypeElement clazz = createClass(node, modifiers(), factoryClassName(node), null, false);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
766 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
767 clazz.getModifiers().add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
768 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
769 clazz.getModifiers().add(Modifier.FINAL);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
770 clazz.add(createConstructorUsingFields(modifiers(PRIVATE), clazz));
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
771 return clazz;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
772 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
773
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
774 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
775 protected void createChildren(NodeData node) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
776 CodeTypeElement clazz = getElement();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
777
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
778 Modifier createVisibility = Utils.getVisibility(clazz.getModifiers());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
779
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
780 if (node.needsFactory()) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
781 NodeGenFactory factory = new NodeGenFactory(context);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
782 add(factory, node);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
783 generatedNode = factory.getElement();
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
784
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
785 createFactoryMethods(node, clazz, createVisibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
786
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
787 if (node.needsRewrites(context)) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
788 clazz.add(createCreateSpecializedMethod(node, createVisibility));
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
789 clazz.add(createSpecializeMethod(node));
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
790 }
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
791
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
792 if (node.getGenericSpecialization() != null) {
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
793 List<CodeExecutableElement> genericMethods = createGeneratedGenericMethod(node);
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
794 for (CodeExecutableElement method : genericMethods) {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
795 clazz.add(method);
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
796 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
797 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
798
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
799 for (SpecializationData specialization : node.getSpecializations()) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
800 add(new SpecializedNodeFactory(context, generatedNode), specialization);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
801 }
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
802
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
803 TypeMirror nodeFactory = Utils.getDeclaredType(Utils.fromTypeMirror(getContext().getType(NodeFactory.class)), node.getNodeType());
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
804 clazz.getImplements().add(nodeFactory);
7859
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
805 clazz.add(createCreateNodeMethod(node));
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
806 clazz.add(createCreateNodeSpecializedMethod(node));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
807 clazz.add(createGetNodeClassMethod(node));
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
808 clazz.add(createGetNodeSignaturesMethod());
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
809 clazz.add(createGetChildrenSignatureMethod(node));
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
810 clazz.add(createGetInstanceMethod(node, createVisibility));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
811 clazz.add(createInstanceConstant(node, clazz.asType()));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
812 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
813
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
814 for (NodeData childNode : childTypes.keySet()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
815 if (childNode.getTemplateType().getModifiers().contains(Modifier.PRIVATE)) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
816 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
817 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
818
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
819 for (TypeElement type : childTypes.get(childNode)) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
820 Set<Modifier> typeModifiers = ((CodeTypeElement) type).getModifiers();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
821 Modifier visibility = Utils.getVisibility(type.getModifiers());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
822 typeModifiers.clear();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
823 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
824 typeModifiers.add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
825 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
826
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
827 typeModifiers.add(Modifier.STATIC);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
828 typeModifiers.add(Modifier.FINAL);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
829 clazz.add(type);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
830 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
831 }
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
832
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
833 List<NodeData> children = node.getNodeDeclaringChildren();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
834 if (node.getParent() == null && children.size() > 0) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
835 clazz.add(createGetFactories(node));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
836 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
837
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
838 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
839
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
840 private CodeExecutableElement createGetNodeClassMethod(NodeData node) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
841 TypeMirror returnType = Utils.getDeclaredType(Utils.fromTypeMirror(getContext().getType(Class.class)), node.getNodeType());
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
842 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), returnType, "getNodeClass");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
843 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
844 builder.startReturn().typeLiteral(node.getNodeType()).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
845 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
846 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
847
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
848 private CodeExecutableElement createGetNodeSignaturesMethod() {
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
849 TypeElement listType = Utils.fromTypeMirror(getContext().getType(List.class));
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
850 TypeMirror classType = getContext().getType(Class.class);
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
851 TypeMirror returnType = Utils.getDeclaredType(listType, Utils.getDeclaredType(listType, classType));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
852 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), returnType, "getNodeSignatures");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
853 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
854 builder.startReturn();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
855 builder.startStaticCall(getContext().getType(Arrays.class), "asList");
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
856 List<ExecutableElement> constructors = findUserConstructors(generatedNode.asType());
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
857 for (ExecutableElement constructor : constructors) {
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
858 builder.tree(createAsList(builder, Utils.asTypeMirrors(constructor.getParameters()), classType));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
859 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
860 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
861 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
862 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
863 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
864
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
865 private CodeExecutableElement createGetChildrenSignatureMethod(NodeData node) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
866 Types types = getContext().getEnvironment().getTypeUtils();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
867 TypeElement listType = Utils.fromTypeMirror(getContext().getType(List.class));
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
868 TypeMirror classType = getContext().getType(Class.class);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
869 TypeMirror nodeType = getContext().getTruffleTypes().getNode();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
870 TypeMirror wildcardNodeType = types.getWildcardType(nodeType, null);
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
871 classType = Utils.getDeclaredType(Utils.fromTypeMirror(classType), wildcardNodeType);
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
872 TypeMirror returnType = Utils.getDeclaredType(listType, classType);
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
873
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
874 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), returnType, "getExecutionSignature");
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
875 CodeTreeBuilder builder = method.createBuilder();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
876
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
877 List<TypeMirror> signatureTypes = new ArrayList<>();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
878 assert !node.getSpecializations().isEmpty();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
879 SpecializationData data = node.getSpecializations().get(0);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
880 for (ActualParameter parameter : data.getParameters()) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
881 ParameterSpec spec = parameter.getSpecification();
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
882 NodeChildData field = node.findChild(spec.getName());
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
883 if (field == null) {
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
884 continue;
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
885 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
886
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
887 TypeMirror type;
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
888 if (field.getCardinality() == Cardinality.MANY && field.getNodeType().getKind() == TypeKind.ARRAY) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
889 type = ((ArrayType) field.getNodeType()).getComponentType();
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
890 } else {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
891 type = field.getNodeType();
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
892 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
893
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
894 signatureTypes.add(type);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
895 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
896
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
897 builder.startReturn().tree(createAsList(builder, signatureTypes, classType)).end();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
898 return method;
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
899 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
900
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
901 private CodeTree createAsList(CodeTreeBuilder parent, List<TypeMirror> types, TypeMirror elementClass) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
902 CodeTreeBuilder builder = parent.create();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
903 builder.startGroup();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
904 builder.type(getContext().getType(Arrays.class));
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
905 builder.string(".<").type(elementClass).string(">");
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
906 builder.startCall("asList");
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
907 for (TypeMirror typeMirror : types) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
908 builder.typeLiteral(typeMirror);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
909 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
910 builder.end().end();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
911 return builder.getRoot();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
912 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
913
7859
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
914 private CodeExecutableElement createCreateNodeMethod(NodeData node) {
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
915 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), node.getNodeType(), "createNode");
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
916 CodeVariableElement arguments = new CodeVariableElement(getContext().getType(Object.class), "arguments");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
917 method.setVarArgs(true);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
918 method.addParameter(arguments);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
919
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
920 CodeTreeBuilder builder = method.createBuilder();
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
921 List<ExecutableElement> signatures = findUserConstructors(generatedNode.asType());
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
922 boolean ifStarted = false;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
923
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
924 for (ExecutableElement element : signatures) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
925 ifStarted = builder.startIf(ifStarted);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
926 builder.string("arguments.length == " + element.getParameters().size());
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
927
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
928 int index = 0;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
929 for (VariableElement param : element.getParameters()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
930 builder.string(" && ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
931 if (!param.asType().getKind().isPrimitive()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
932 builder.string("(arguments[" + index + "] == null || ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
933 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
934 builder.string("arguments[" + index + "] instanceof ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
935 builder.type(Utils.boxType(getContext(), param.asType()));
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
936 if (!param.asType().getKind().isPrimitive()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
937 builder.string(")");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
938 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
939 index++;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
940 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
941 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
942 builder.startBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
943
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
944 builder.startReturn().startCall("create");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
945 index = 0;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
946 for (VariableElement param : element.getParameters()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
947 builder.startGroup();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
948 builder.string("(").type(param.asType()).string(") ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
949 builder.string("arguments[").string(String.valueOf(index)).string("]");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
950 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
951 index++;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
952 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
953 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
954
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
955 builder.end(); // block
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
956 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
957
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
958 builder.startElseBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
959 builder.startThrow().startNew(getContext().getType(IllegalArgumentException.class));
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
960 builder.doubleQuote("Invalid create signature.");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
961 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
962 builder.end(); // else block
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
963 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
964 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
965
7859
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
966 private CodeExecutableElement createCreateNodeSpecializedMethod(NodeData node) {
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
967 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), node.getNodeType(), "createNodeSpecialized");
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
968 CodeVariableElement nodeParam = new CodeVariableElement(node.getNodeType(), THIS_NODE_LOCAL_VAR_NAME);
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
969 CodeVariableElement arguments = new CodeVariableElement(getContext().getType(Class.class), "types");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
970 method.addParameter(nodeParam);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
971 method.addParameter(arguments);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
972 method.setVarArgs(true);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
973
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
974 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
975 if (!node.needsRewrites(getContext())) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
976 builder.startThrow().startNew(getContext().getType(UnsupportedOperationException.class)).end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
977 } else {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
978 builder.startIf();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
979 builder.string("types.length == 1");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
980 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
981 builder.startBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
982
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
983 builder.startReturn().startCall("createSpecialized");
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
984 builder.startGroup();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
985 builder.string(THIS_NODE_LOCAL_VAR_NAME);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
986 builder.end();
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
987 builder.string("types[0]");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
988 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
989
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
990 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
991 builder.startElseBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
992 builder.startThrow().startNew(getContext().getType(IllegalArgumentException.class));
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
993 builder.doubleQuote("Invalid createSpecialized signature.");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
994 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
995 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
996 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
997
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
998 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
999 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1000
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1001 private ExecutableElement createGetInstanceMethod(NodeData node, Modifier visibility) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1002 TypeElement nodeFactoryType = Utils.fromTypeMirror(getContext().getType(NodeFactory.class));
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1003 TypeMirror returnType = Utils.getDeclaredType(nodeFactoryType, node.getNodeType());
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1004
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1005 CodeExecutableElement method = new CodeExecutableElement(modifiers(), returnType, "getInstance");
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1006 if (visibility != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1007 method.getModifiers().add(visibility);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1008 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1009 method.getModifiers().add(Modifier.STATIC);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1010
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1011 String varName = instanceVarName(node);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1012
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1013 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1014 builder.startIf();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1015 builder.string(varName).string(" == null");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1016 builder.end().startBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1017
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1018 builder.startStatement();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1019 builder.string(varName);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1020 builder.string(" = ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1021 builder.startNew(factoryClassName(node)).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1022 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1023
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1024 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1025 builder.startReturn().string(varName).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1026 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1027 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1028
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1029 private String instanceVarName(NodeData node) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1030 if (node.getParent() != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1031 return Utils.firstLetterLowerCase(factoryClassName(node)) + "Instance";
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1032 } else {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1033 return "instance";
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1034 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1035 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1036
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1037 private CodeVariableElement createInstanceConstant(NodeData node, TypeMirror factoryType) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1038 String varName = instanceVarName(node);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1039 CodeVariableElement var = new CodeVariableElement(modifiers(), factoryType, varName);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1040 var.getModifiers().add(Modifier.PRIVATE);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1041 var.getModifiers().add(Modifier.STATIC);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1042 return var;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1043 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1044
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1045 private ExecutableElement createGetFactories(NodeData node) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1046 List<NodeData> children = node.getNodeDeclaringChildren();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1047 if (node.needsFactory()) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1048 children.add(node);
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1049 }
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1050
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1051 List<TypeMirror> nodeTypesList = new ArrayList<>();
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1052 TypeMirror prev = null;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1053 boolean allSame = true;
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1054 for (NodeData child : children) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1055 nodeTypesList.add(child.getNodeType());
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1056 if (prev != null && !Utils.typeEquals(child.getNodeType(), prev)) {
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1057 allSame = false;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1058 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1059 prev = child.getNodeType();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1060 }
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1061 TypeMirror commonNodeSuperType = Utils.getCommonSuperType(getContext(), nodeTypesList.toArray(new TypeMirror[nodeTypesList.size()]));
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1062
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1063 Types types = getContext().getEnvironment().getTypeUtils();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1064 TypeMirror factoryType = getContext().getType(NodeFactory.class);
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1065 TypeMirror baseType;
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1066 if (allSame) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1067 baseType = Utils.getDeclaredType(Utils.fromTypeMirror(factoryType), commonNodeSuperType);
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1068 } else {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1069 baseType = Utils.getDeclaredType(Utils.fromTypeMirror(factoryType), types.getWildcardType(commonNodeSuperType, null));
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1070 }
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1071 TypeMirror listType = Utils.getDeclaredType(Utils.fromTypeMirror(getContext().getType(List.class)), baseType);
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1072
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1073 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), listType, "getFactories");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1074
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1075 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1076 builder.startReturn();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1077 builder.startStaticCall(getContext().getType(Arrays.class), "asList");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1078
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1079 for (NodeData child : children) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1080 builder.startGroup();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1081 NodeData childNode = child;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1082 List<NodeData> factories = new ArrayList<>();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1083 while (childNode.getParent() != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1084 factories.add(childNode);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1085 childNode = childNode.getParent();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1086 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1087 Collections.reverse(factories);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1088 for (NodeData nodeData : factories) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1089 builder.string(factoryClassName(nodeData)).string(".");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1090 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1091 builder.string("getInstance()");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1092 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1093 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1094 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1095 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1096 return method;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1097 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1098
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1099 private void createFactoryMethods(NodeData node, CodeTypeElement clazz, Modifier createVisibility) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1100 List<ExecutableElement> constructors = findUserConstructors(generatedNode.asType());
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1101 for (ExecutableElement constructor : constructors) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1102 clazz.add(createCreateMethod(node, createVisibility, constructor));
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1103 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1104 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1105
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1106 private CodeExecutableElement createCreateMethod(NodeData node, Modifier visibility, ExecutableElement constructor) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1107 CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), constructor);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1108 method.setSimpleName(CodeNames.of("create"));
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1109 method.getModifiers().clear();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1110 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1111 method.getModifiers().add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1112 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1113 method.getModifiers().add(Modifier.STATIC);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1114 method.setReturnType(node.getNodeType());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1115
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1116 CodeTreeBuilder body = method.createBuilder();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1117 body.startReturn();
8242
ac4e8c16ffdf Added new codegen api classes NodeId, NodeClass to codegen along with some refactorings.
Christian Humer <christian.humer@gmail.com>
parents: 8237
diff changeset
1118 if (node.getSpecializations().isEmpty()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1119 body.null_();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1120 } else {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1121 body.startNew(nodeSpecializationClassName(node.getSpecializations().get(0)));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1122 for (VariableElement var : method.getParameters()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1123 body.string(var.getSimpleName().toString());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1124 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1125 body.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1126 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1127 body.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1128 return method;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1129 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1130
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1131 private CodeExecutableElement createCreateSpecializedMethod(NodeData node, Modifier visibility) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1132 CodeExecutableElement method = new CodeExecutableElement(modifiers(), node.getNodeType(), "createSpecialized");
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1133 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1134 method.getModifiers().add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1135 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1136 method.getModifiers().add(Modifier.STATIC);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1137
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1138 method.addParameter(new CodeVariableElement(node.getNodeType(), THIS_NODE_LOCAL_VAR_NAME));
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1139 method.addParameter(new CodeVariableElement(getContext().getType(Class.class), "specializationClass"));
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1140
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1141 CodeTreeBuilder body = method.createBuilder();
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1142
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1143 boolean hasCopyConstructor = findCopyConstructor(generatedNode.asType()) != null;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1144
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1145 final String thisLocalVariableName = THIS_NODE_LOCAL_VAR_NAME + "Cast";
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1146
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1147 if (hasCopyConstructor) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1148 body.startStatement();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1149 body.type(generatedNode.asType()).string(" ").string(thisLocalVariableName);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1150 body.string(" = ").string("(").type(generatedNode.asType()).string(") ").string(THIS_NODE_LOCAL_VAR_NAME);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1151 body.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1152 }
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1153
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1154 boolean first = true;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1155 for (TypeData type : node.getTypeSystem().getTypes()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1156 SpecializationData specialization = node.findUniqueSpecialization(type);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1157 if (specialization != null && !type.isGeneric()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1158 if (first) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1159 body.startIf();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1160 first = false;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1161 } else {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1162 body.startElseIf();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1163 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1164 body.string("specializationClass == ").type(type.getBoxedType()).string(".class").end().startBlock();
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1165 body.tree(createReturnNewSpecialization(body, specialization, thisLocalVariableName, hasCopyConstructor));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1166
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1167 body.end(); // if
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1168 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1169 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1170 body.tree(createReturnNewSpecialization(body, node.getGenericSpecialization(), thisLocalVariableName, hasCopyConstructor));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1171 return method;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1172 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1173
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1174 private CodeExecutableElement createSpecializeMethod(NodeData node) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1175 CodeExecutableElement method = new CodeExecutableElement(modifiers(PRIVATE, STATIC), node.getNodeType(), "specialize");
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1176 method.addParameter(new CodeVariableElement(generatedNode.asType(), THIS_NODE_LOCAL_VAR_NAME));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1177 method.addParameter(new CodeVariableElement(getContext().getType(Class.class), "minimumState"));
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
1178 addInternalValueParameters(method, node.getGenericSpecialization(), true);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1179
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1180 CodeTreeBuilder body = method.createBuilder();
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1181 body.startStatement().string("boolean allowed = (minimumState == ").string(nodeSpecializationClassName(node.getSpecializations().get(0))).string(".class)").end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1182
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1183 boolean hasCopyConstructor = findCopyConstructor(generatedNode.asType()) != null;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1184
8242
ac4e8c16ffdf Added new codegen api classes NodeId, NodeClass to codegen along with some refactorings.
Christian Humer <christian.humer@gmail.com>
parents: 8237
diff changeset
1185 for (int i = 1; i < node.getSpecializations().size(); i++) {
ac4e8c16ffdf Added new codegen api classes NodeId, NodeClass to codegen along with some refactorings.
Christian Humer <christian.humer@gmail.com>
parents: 8237
diff changeset
1186 SpecializationData specialization = node.getSpecializations().get(i);
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1187 body.startStatement().string("allowed = allowed || (minimumState == ").string(nodeSpecializationClassName(specialization)).string(".class)").end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1188
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1189 CodeTree guarded = createReturnNewSpecialization(body, specialization, THIS_NODE_LOCAL_VAR_NAME, hasCopyConstructor);
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1190
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1191 body.tree(createGuardAndCast(body, "allowed", node.getGenericSpecialization(), specialization, false, guarded, null, true));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1192 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1193 body.startThrow().startNew(getContext().getType(IllegalArgumentException.class)).end().end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1194
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1195 return method;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1196 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1197
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1198 private CodeTree createReturnNewSpecialization(CodeTreeBuilder parent, SpecializationData specialization, String thisLocalVariableName, boolean hasCopyConstructor) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1199 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1200 builder.startReturn().startNew(nodeSpecializationClassName(specialization));
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1201 if (hasCopyConstructor) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1202 builder.string(thisLocalVariableName);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1203 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1204 builder.end().end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1205 return builder.getRoot();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1206 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1207
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1208 private List<CodeExecutableElement> createGeneratedGenericMethod(NodeData node) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1209 TypeMirror genericReturnType = node.getGenericSpecialization().getReturnType().getType();
8277
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
1210 if (node.needsRewrites(context)) {
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1211 List<CodeExecutableElement> methods = new ArrayList<>();
7751
ef1b41ea0a90 Implemented an option to turn off generated generic generation using specializations in @Generic.
Christian Humer <christian.humer@gmail.com>
parents: 7750
diff changeset
1212
8242
ac4e8c16ffdf Added new codegen api classes NodeId, NodeClass to codegen along with some refactorings.
Christian Humer <christian.humer@gmail.com>
parents: 8237
diff changeset
1213 List<SpecializationData> specializations = node.getSpecializations();
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1214 SpecializationData prev = null;
8242
ac4e8c16ffdf Added new codegen api classes NodeId, NodeClass to codegen along with some refactorings.
Christian Humer <christian.humer@gmail.com>
parents: 8237
diff changeset
1215 for (int i = 0; i < specializations.size(); i++) {
ac4e8c16ffdf Added new codegen api classes NodeId, NodeClass to codegen along with some refactorings.
Christian Humer <christian.humer@gmail.com>
parents: 8237
diff changeset
1216 SpecializationData current = specializations.get(i);
ac4e8c16ffdf Added new codegen api classes NodeId, NodeClass to codegen along with some refactorings.
Christian Humer <christian.humer@gmail.com>
parents: 8237
diff changeset
1217 SpecializationData next = i + 1 < specializations.size() ? specializations.get(i + 1) : null;
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1218 if (prev == null || current.isUninitialized()) {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1219 prev = current;
7751
ef1b41ea0a90 Implemented an option to turn off generated generic generation using specializations in @Generic.
Christian Humer <christian.humer@gmail.com>
parents: 7750
diff changeset
1220 continue;
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1221 } else {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1222 String methodName = generatedGenericMethodName(current);
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1223 CodeExecutableElement method = new CodeExecutableElement(modifiers(PRIVATE, STATIC), genericReturnType, methodName);
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1224 method.addParameter(new CodeVariableElement(generatedNode.asType(), THIS_NODE_LOCAL_VAR_NAME));
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
1225 addInternalValueParameters(method, node.getGenericSpecialization(), true);
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1226
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1227 emitGeneratedGenericSpecialization(method.createBuilder(), current, next);
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1228
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1229 methods.add(method);
7751
ef1b41ea0a90 Implemented an option to turn off generated generic generation using specializations in @Generic.
Christian Humer <christian.humer@gmail.com>
parents: 7750
diff changeset
1230 }
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1231 prev = current;
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1232 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1233
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1234 return methods;
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1235 } else {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1236 CodeExecutableElement method = new CodeExecutableElement(modifiers(PRIVATE, STATIC), genericReturnType, generatedGenericMethodName(null));
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1237 method.addParameter(new CodeVariableElement(generatedNode.asType(), THIS_NODE_LOCAL_VAR_NAME));
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
1238 addInternalValueParameters(method, node.getGenericSpecialization(), true);
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1239 emitInvokeDoMethod(method.createBuilder(), node.getGenericSpecialization(), 0);
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1240 return Arrays.asList(method);
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1241 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1242 }
7751
ef1b41ea0a90 Implemented an option to turn off generated generic generation using specializations in @Generic.
Christian Humer <christian.humer@gmail.com>
parents: 7750
diff changeset
1243
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1244 private void emitGeneratedGenericSpecialization(CodeTreeBuilder builder, SpecializationData current, SpecializationData next) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1245 CodeTreeBuilder invokeMethodBuilder = new CodeTreeBuilder(builder);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1246 emitInvokeDoMethod(invokeMethodBuilder, current, 0);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1247 CodeTree invokeMethod = invokeMethodBuilder.getRoot();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1248
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1249 if (next != null) {
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1250 CodeTreeBuilder nextBuilder = builder.create();
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1251
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1252 nextBuilder.startReturn().startCall(generatedGenericMethodName(next));
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1253 nextBuilder.string(THIS_NODE_LOCAL_VAR_NAME);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1254 addInternalValueParameterNames(nextBuilder, next, next, null, true, true);
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1255 nextBuilder.end().end();
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1256
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1257 invokeMethod = createGuardAndCast(builder, null, current.getNode().getGenericSpecialization(), current, true, invokeMethod, nextBuilder.getRoot(), true);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1258 }
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1259
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1260 builder.tree(invokeMethod);
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1261
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1262 if (next != null) {
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1263 builder.end();
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1264 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1265 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1266
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1267 private void emitInvokeDoMethod(CodeTreeBuilder builder, SpecializationData specialization, int level) {
8243
d81ff782fa1a Removed @SpecializationThrows from codegen API. Replaced it by a simplier version in @Specialization.
Christian Humer <christian.humer@gmail.com>
parents: 8242
diff changeset
1268 if (!specialization.getExceptions().isEmpty()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1269 builder.startTryBlock();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1270 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1271
8256
4dc7034317ec Cleanup.
Christian Humer <christian.humer@gmail.com>
parents: 8252
diff changeset
1272 if (specialization.getMethod() == null) {
8251
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
1273 emitEncounteredSynthetic(builder);
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
1274 } else {
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
1275 builder.startReturn();
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
1276 builder.tree(createTemplateMethodCall(builder, specialization.getNode().getGenericSpecialization(), specialization, null));
8251
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
1277 builder.end(); // return
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
1278 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1279
8243
d81ff782fa1a Removed @SpecializationThrows from codegen API. Replaced it by a simplier version in @Specialization.
Christian Humer <christian.humer@gmail.com>
parents: 8242
diff changeset
1280 if (!specialization.getExceptions().isEmpty()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1281 for (SpecializationThrowsData exception : specialization.getExceptions()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1282 builder.end().startCatchBlock(exception.getJavaClass(), "ex" + level);
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1283
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1284 builder.startReturn().startCall(generatedGenericMethodName(exception.getTransitionTo()));
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1285 builder.string(THIS_NODE_LOCAL_VAR_NAME);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1286 addInternalValueParameterNames(builder, exception.getTransitionTo(), exception.getTransitionTo(), null, true, true);
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1287 builder.end().end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1288 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1289 builder.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1290 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1291 }
8251
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
1292
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1293 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1294
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1295 private class SpecializedNodeFactory extends ClassElementFactory<SpecializationData> {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1296
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1297 private final CodeTypeElement nodeGen;
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1298
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1299 public SpecializedNodeFactory(ProcessorContext context, CodeTypeElement nodeGen) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1300 super(context);
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1301 this.nodeGen = nodeGen;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1302 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1303
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1304 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1305 public CodeTypeElement create(SpecializationData specialization) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1306 NodeData node = specialization.getNode();
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1307 TypeMirror baseType = node.getNodeType();
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1308 if (nodeGen != null) {
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1309 baseType = nodeGen.asType();
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1310 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1311 CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, STATIC, FINAL), nodeSpecializationClassName(specialization), baseType, false);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1312 return clazz;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1313 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1314
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1315 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1316 protected void createChildren(SpecializationData specialization) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1317 CodeTypeElement clazz = getElement();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1318 NodeData node = specialization.getNode();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1319
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1320 TypeElement superTypeElement = Utils.fromTypeMirror(clazz.getSuperclass());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1321 for (ExecutableElement constructor : ElementFilter.constructorsIn(superTypeElement.getEnclosedElements())) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1322 ExecutableElement superConstructor = createSuperConstructor(clazz, constructor);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1323 if (superConstructor != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1324 clazz.add(superConstructor);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1325 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1326 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1327
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1328 for (ExecutableTypeData execType : node.getExecutableTypes()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1329 if (execType.isFinal()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1330 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1331 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1332 CodeExecutableElement executeMethod = createExecutableTypeOverride(execType);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1333 clazz.add(executeMethod);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1334 CodeTreeBuilder builder = executeMethod.createBuilder();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1335 CodeTree result = createExecuteBody(builder, specialization, execType);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1336 if (result != null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1337 builder.tree(result);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1338 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1339 clazz.remove(executeMethod);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1340 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1341 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1342
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1343 if (specialization.hasRewrite(getContext())) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1344 buildSpecializeAndExecute(clazz, specialization);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1345 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1346 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1347
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1348 private CodeTree createExecuteBody(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData execType) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1349 TypeData primaryType = specialization.getReturnType().getTypeSystemType();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1350
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1351 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1352
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1353 ExecutableTypeData foundEvaluatedPrimaryType = findFunctionalExecutableType(specialization, execType.getEvaluatedCount());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1354
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1355 if (execType == foundEvaluatedPrimaryType || foundEvaluatedPrimaryType == null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1356 builder.tree(createFunctionalExecute(builder, specialization, execType));
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1357 } else if (needsCastingExecuteMethod(execType, primaryType)) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1358 builder.tree(createCastingExecute(builder, specialization, execType, foundEvaluatedPrimaryType));
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1359 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1360 return null;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1361 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1362
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1363 return builder.getRoot();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1364 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1365
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1366 private CodeExecutableElement createExecutableTypeOverride(ExecutableTypeData execType) {
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1367 CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), execType.getMethod());
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1368
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1369 int i = 0;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1370 for (VariableElement param : method.getParameters()) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1371 CodeVariableElement var = CodeVariableElement.clone(param);
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1372 ActualParameter actualParameter = execType.getParameters().get(i);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1373 if (actualParameter.getSpecification().isSignature()) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1374 var.setName(valueNameEvaluated(actualParameter));
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1375 } else {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1376 var.setName(valueName(actualParameter));
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1377 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1378 method.getParameters().set(i, var);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1379 i++;
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1380 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1381
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1382 method.getAnnotationMirrors().clear();
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1383 method.getModifiers().remove(Modifier.ABSTRACT);
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1384 return method;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1385 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1386
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1387 private boolean needsCastingExecuteMethod(ExecutableTypeData execType, TypeData primaryType) {
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1388 if (execType.isAbstract()) {
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1389 return true;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1390 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1391 if (Utils.isPrimitiveOrVoid(primaryType.getPrimitiveType()) && Utils.isPrimitiveOrVoid(execType.getType().getPrimitiveType())) {
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1392 return true;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1393 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1394 if (execType.getType().isGeneric()) {
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1395 return true;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1396 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1397 return false;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1398 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1399
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1400 private ExecutableTypeData findFunctionalExecutableType(SpecializationData specialization, int evaluatedCount) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1401 TypeData primaryType = specialization.getReturnType().getTypeSystemType();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1402 List<ExecutableTypeData> otherTypes = specialization.getNode().getExecutableTypes(evaluatedCount);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1403
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1404 List<ExecutableTypeData> filteredTypes = new ArrayList<>();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1405 for (ExecutableTypeData compareType : otherTypes) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1406 if (!Utils.typeEquals(compareType.getType().getPrimitiveType(), primaryType.getPrimitiveType())) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1407 continue;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1408 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1409 filteredTypes.add(compareType);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1410 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1411
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1412 for (ExecutableTypeData compareType : filteredTypes) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1413 if (compareType.startsWithSignature(specialization)) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1414 return compareType;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1415 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1416 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1417
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1418 for (ExecutableTypeData compareType : otherTypes) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1419 if (compareType.startsWithSignature(specialization)) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1420 return compareType;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1421 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1422 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1423
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1424 return null;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1425 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1426
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1427 private CodeTree createCastingExecute(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData executable, ExecutableTypeData castExecutable) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1428 TypeData type = executable.getType();
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1429 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1430 NodeData node = specialization.getNode();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1431
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1432 ExecutableTypeData castedType = node.findExecutableType(type);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1433 TypeData primaryType = castExecutable.getType();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1434
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1435 boolean needsTry = castExecutable.hasUnexpectedValue(getContext());
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1436 boolean returnVoid = type.isVoid();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1437
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1438 List<ActualParameter> executeParameters = new ArrayList<>();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1439 for (ActualParameter sourceParameter : executable.getParameters()) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1440 NodeChildData field = specialization.getNode().findChild(sourceParameter.getSpecification().getName());
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1441 if (field == null) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1442 continue;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1443 }
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1444
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1445 ActualParameter targetParameter = castExecutable.findParameter(sourceParameter.getLocalName());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1446 if (targetParameter != null) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1447 executeParameters.add(targetParameter);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1448 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1449 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1450
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1451 builder.tree(createExecuteChildren(builder, executable, specialization, executeParameters, null, true));
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1452
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1453 CodeTree primaryExecuteCall = createTemplateMethodCall(builder, executable, castExecutable, null);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1454 if (needsTry) {
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1455 if (!returnVoid) {
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1456 builder.declaration(primaryType.getPrimitiveType(), "value");
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1457 }
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1458 builder.startTryBlock();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1459
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1460 if (returnVoid) {
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1461 builder.statement(primaryExecuteCall);
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1462 } else {
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1463 builder.startStatement();
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1464 builder.string("value = ");
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1465 builder.tree(primaryExecuteCall);
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1466 builder.end();
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1467 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1468
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1469 builder.end().startCatchBlock(getUnexpectedValueException(), "ex");
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1470 if (returnVoid) {
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1471 builder.string("// ignore").newLine();
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1472 } else {
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1473 builder.startReturn();
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1474 builder.tree(createExpectType(node, castedType, CodeTreeBuilder.singleString("ex.getResult()")));
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1475 builder.end();
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1476 }
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1477 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1478
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1479 if (!returnVoid) {
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1480 builder.startReturn();
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1481 builder.tree(createExpectType(node, castedType, CodeTreeBuilder.singleString("value")));
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1482 builder.end();
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1483 }
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1484 } else {
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1485 if (returnVoid) {
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1486 builder.statement(primaryExecuteCall);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1487 } else {
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1488 builder.startReturn();
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1489 builder.tree(createExpectType(node, castedType, primaryExecuteCall));
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1490 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1491 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1492 }
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1493
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1494 return builder.getRoot();
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1495 }
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1496
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1497 private CodeTree createExpectType(NodeData node, ExecutableTypeData castedType, CodeTree value) {
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1498 if (castedType == null) {
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1499 return value;
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1500 } else if (castedType.getType().isVoid()) {
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1501 return value;
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1502 } else if (castedType.getType().isGeneric()) {
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1503 return value;
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1504 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1505
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1506 CodeTreeBuilder builder = CodeTreeBuilder.createBuilder();
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1507 String targetMethodName;
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1508 if (castedType.hasUnexpectedValue(getContext())) {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1509 targetMethodName = TypeSystemCodeGenerator.expectTypeMethodName(castedType.getType());
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1510 } else {
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1511 targetMethodName = TypeSystemCodeGenerator.asTypeMethodName(castedType.getType());
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1512 }
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1513 startCallTypeSystemMethod(getContext(), builder, node, targetMethodName);
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1514
7750
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1515 builder.tree(value);
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1516 builder.end().end();
bdcb3cc47e16 Generated nodes can now handle the case were a non generic execute methods does not throw an UVE.
Christian Humer <christian.humer@gmail.com>
parents: 7679
diff changeset
1517 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1518 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1519
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1520 private CodeTree createFunctionalExecute(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData executable) {
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1521 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1522 if (specialization.isUninitialized()) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1523 builder.tree(createDeoptimize(builder));
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1524 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1525
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1526 builder.tree(createExecuteChildren(builder, executable, specialization, specialization.getParameters(), null, false));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1527
8361
676fa31bd3f0 Uninitialized cases produced wrong call to throw new UnsuportedOperationException.
Christian Humer <christian.humer@gmail.com>
parents: 8310
diff changeset
1528 CodeTree executeNode;
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1529 if (specialization.isUninitialized()) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1530 builder.tree(createSpecializeCall(builder, specialization));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1531 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1532 executeNode = createExecute(builder, executable, specialization);
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1533
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1534 SpecializationData next = specialization.findNextSpecialization();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1535 CodeTree returnSpecialized = null;
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1536 if (next != null) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1537 returnSpecialized = createReturnSpecializeAndExecute(builder, executable, next, null);
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1538 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1539 builder.tree(createGuardAndCast(builder, null, specialization, specialization, true, executeNode, returnSpecialized, false));
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1540
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1541 return builder.getRoot();
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1542 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1543
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1544 private CodeTree createDeoptimize(CodeTreeBuilder parent) {
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1545 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1546 builder.startStatement();
9272
fe5bc02fcd19 Replace TruffleIntrinsics.deoptimize() calls with CompilerDirectives.transferToInterpreter(). Remove obsolete TruffleIntrinsics class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9258
diff changeset
1547 builder.startStaticCall(getContext().getTruffleTypes().getCompilerDirectives(), "transferToInterpreter").end();
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1548 builder.end();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1549 return builder.getRoot();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1550 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1551
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1552 private CodeTree createSpecializeCall(CodeTreeBuilder parent, SpecializationData specialization) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1553 NodeData node = specialization.getNode();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1554
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1555 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1556 emitSpecializationListeners(builder, node);
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1557
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1558 builder.startStatement();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1559 builder.startCall("replace");
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1560 if (node.needsRewrites(getContext())) {
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1561 builder.startCall(factoryClassName(node), "specialize");
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1562 builder.string("this");
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1563 builder.typeLiteral(builder.findMethod().getEnclosingElement().asType());
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1564 addInternalValueParameterNames(builder, specialization, specialization, null, true, true);
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1565 builder.end(); // call replace, call specialize
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1566 } else {
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1567 builder.startCall(factoryClassName(node), "createSpecialized").string("this").string("null").end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1568 }
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1569 builder.end().end();
9258
07f8d136a05e Truffle API changes for the Frame API. Introduction of Assumptions class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9231
diff changeset
1570 emitSpecializationListeners(builder, node);
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1571 return builder.getRoot();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1572 }
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1573
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1574 private CodeTree createExecute(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData specialization) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1575 NodeData node = specialization.getNode();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1576 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1577 if (!specialization.getExceptions().isEmpty() || !specialization.getAssumptions().isEmpty()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1578 builder.startTryBlock();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1579 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1580
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1581 for (String assumption : specialization.getAssumptions()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1582 builder.startStatement();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1583 builder.string("this.").string(assumption).string(".check()");
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1584 builder.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1585 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1586
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1587 CodeTreeBuilder returnBuilder = new CodeTreeBuilder(parent);
8361
676fa31bd3f0 Uninitialized cases produced wrong call to throw new UnsuportedOperationException.
Christian Humer <christian.humer@gmail.com>
parents: 8310
diff changeset
1588 if (specialization.isUninitialized()) {
676fa31bd3f0 Uninitialized cases produced wrong call to throw new UnsuportedOperationException.
Christian Humer <christian.humer@gmail.com>
parents: 8310
diff changeset
1589 String genericMethodName = generatedGenericMethodName(null);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1590 returnBuilder.startCall(factoryClassName(node), genericMethodName);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1591 returnBuilder.string("this");
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1592 addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1593 returnBuilder.end();
8361
676fa31bd3f0 Uninitialized cases produced wrong call to throw new UnsuportedOperationException.
Christian Humer <christian.humer@gmail.com>
parents: 8310
diff changeset
1594 } else if (specialization.getMethod() == null && !node.needsRewrites(context)) {
8251
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
1595 emitEncounteredSynthetic(builder);
8361
676fa31bd3f0 Uninitialized cases produced wrong call to throw new UnsuportedOperationException.
Christian Humer <christian.humer@gmail.com>
parents: 8310
diff changeset
1596 } else if (specialization.isGeneric()) {
8277
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
1597 String genericMethodName;
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
1598 if (!specialization.isUseSpecializationsForGeneric()) {
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
1599 genericMethodName = generatedGenericMethodName(specialization);
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
1600 } else {
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
1601 genericMethodName = generatedGenericMethodName(null);
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
1602 }
97ee911c4c74 Fixed behaviour of useSpecializations for Generic specializations.
Christian Humer <christian.humer@gmail.com>
parents: 8256
diff changeset
1603
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1604 returnBuilder.startCall(factoryClassName(node), genericMethodName);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1605 returnBuilder.string("this");
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1606 addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1607 returnBuilder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1608 } else {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1609 returnBuilder.tree(createTemplateMethodCall(returnBuilder, specialization, specialization, null));
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1610 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1611
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1612 if (!returnBuilder.isEmpty()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1613 builder.startReturn();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1614
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1615 TypeData targetType = node.getTypeSystem().findTypeData(builder.findMethod().getReturnType());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1616 TypeData sourceType = specialization.getReturnType().getTypeSystemType();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1617
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1618 if (targetType == null || sourceType == null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1619 builder.tree(returnBuilder.getRoot());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1620 } else if (sourceType.needsCastTo(targetType)) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1621 builder.tree(createCallTypeSystemMethod(context, parent, node, TypeSystemCodeGenerator.expectTypeMethodName(targetType), returnBuilder.getRoot()));
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1622 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1623 builder.tree(returnBuilder.getRoot());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1624 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1625 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1626 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1627
8243
d81ff782fa1a Removed @SpecializationThrows from codegen API. Replaced it by a simplier version in @Specialization.
Christian Humer <christian.humer@gmail.com>
parents: 8242
diff changeset
1628 if (!specialization.getExceptions().isEmpty()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1629 for (SpecializationThrowsData exception : specialization.getExceptions()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1630 builder.end().startCatchBlock(exception.getJavaClass(), "ex");
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1631 builder.tree(createReturnSpecializeAndExecute(parent, executable, exception.getTransitionTo(), null));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1632 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1633 builder.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1634 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1635 if (!specialization.getAssumptions().isEmpty()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1636 builder.end().startCatchBlock(getContext().getTruffleTypes().getInvalidAssumption(), "ex");
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1637 builder.tree(createReturnSpecializeAndExecute(parent, executable, specialization.findNextSpecialization(), null));
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1638 builder.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1639 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1640
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1641 return builder.getRoot();
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1642 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1643
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1644 private CodeTree createExecuteChildren(CodeTreeBuilder parent, ExecutableTypeData sourceExecutable, SpecializationData specialization, List<ActualParameter> targetParameters,
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1645 ActualParameter unexpectedParameter, boolean cast) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1646 NodeData sourceNode = specialization.getNode();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1647
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1648 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1649
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1650 for (ActualParameter targetParameter : targetParameters) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1651 NodeChildData field = sourceNode.findChild(targetParameter.getSpecification().getName());
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1652 if (field == null) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1653 continue;
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1654 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1655 TypeData targetType = targetParameter.getTypeSystemType();
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1656
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1657 ExecutableTypeData targetExecutable = field.getNodeData().findExecutableType(targetType);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1658
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1659 ActualParameter sourceParameter = sourceExecutable.findParameter(targetParameter.getLocalName());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1660
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1661 String targetVariableName = valueName(targetParameter);
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1662 CodeTree executionExpression = null;
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1663 if (cast || sourceParameter != null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1664 TypeData sourceType = sourceParameter.getTypeSystemType();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1665 if (!sourceType.needsCastTo(targetType)) {
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1666 if (field.isShortCircuit() && sourceParameter != null) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1667 builder.tree(createShortCircuitValue(builder, specialization, field, targetParameter.getPreviousParameter(), unexpectedParameter));
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1668 }
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1669 builder.startStatement();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1670 builder.type(targetParameter.getType()).string(" ");
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1671 builder.string(valueName(targetParameter)).string(" = ");
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1672 builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)));
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1673 builder.end();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1674 } else {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1675 executionExpression = createExpectType(sourceNode, targetExecutable, CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)));
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1676 }
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1677 } else if (sourceParameter == null) {
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1678 executionExpression = createExecuteChildExpression(builder, field, targetParameter);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1679 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1680
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1681 if (executionExpression != null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1682 CodeTreeVariable executionVar = new CodeTreeVariable();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1683 CodeTree shortCircuitTree = createShortCircuitTree(builder, executionVar, targetVariableName, specialization, targetParameter, unexpectedParameter);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1684 CodeTree unexpectedTree = createCatchUnexpectedTree(builder, executionExpression, targetVariableName, specialization, sourceExecutable, targetExecutable, targetParameter,
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1685 shortCircuitTree != executionVar);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1686
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1687 executionVar.set(unexpectedTree);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1688 builder.tree(shortCircuitTree);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1689 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1690 }
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1691 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1692 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1693
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1694 private void emitSpecializationListeners(CodeTreeBuilder builder, NodeData node) {
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1695 for (TemplateMethod listener : node.getSpecializationListeners()) {
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1696 builder.startStatement();
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
1697 builder.tree(createTemplateMethodCall(builder, listener, listener, null));
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1698 builder.end(); // statement
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1699 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1700 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1701
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1702 private CodeTree createCatchUnexpectedTree(CodeTreeBuilder parent, CodeTree body, String targetVariableName, SpecializationData specialization, ExecutableTypeData currentExecutable,
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1703 ExecutableTypeData targetExecutable, ActualParameter param, boolean shortCircuit) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1704 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1705 boolean unexpected = targetExecutable.hasUnexpectedValue(getContext());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1706 builder.startStatement();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1707
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1708 if (!shortCircuit) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1709 builder.type(param.getType()).string(" ").string(targetVariableName);
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1710 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1711
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1712 if (unexpected) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1713 if (!shortCircuit) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1714 builder.end();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1715 }
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1716 builder.startTryBlock();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1717 builder.startStatement();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1718 builder.string(targetVariableName);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1719 } else if (shortCircuit) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1720 builder.startStatement();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1721 builder.string(targetVariableName);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1722 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1723 builder.string(" = ");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1724 builder.tree(body);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1725 builder.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1726
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1727 if (unexpected) {
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1728 builder.end().startCatchBlock(getUnexpectedValueException(), "ex");
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1729 SpecializationData generic = specialization.getNode().getGenericSpecialization();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1730 ActualParameter genericParameter = generic.findParameter(param.getLocalName());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1731
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1732 List<ActualParameter> genericParameters = generic.getParametersAfter(genericParameter);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1733 builder.tree(createExecuteChildren(parent, currentExecutable, generic, genericParameters, genericParameter, false));
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1734 builder.tree(createReturnSpecializeAndExecute(builder, currentExecutable, specialization.findNextSpecialization(), param));
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1735 builder.end(); // catch block
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1736 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1737
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1738 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1739 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1740
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1741 private CodeTree createExecuteChildExpression(CodeTreeBuilder parent, NodeChildData targetField, ActualParameter sourceParameter) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1742 TypeData type = sourceParameter.getTypeSystemType();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1743 ExecutableTypeData execType = targetField.getNodeData().findExecutableType(type);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1744
9231
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1745 /*
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1746 * FIXME Temporary deactivated due to partial evaluation failure else if
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1747 * (accessElement.getKind() == ElementKind.METHOD) {
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1748 * builder.startCall(accessElement.getSimpleName().toString()).end(); }
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1749 */
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1750 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1751 if (targetField != null) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1752 Element accessElement = targetField.getAccessElement();
9228
bc82cde765b9 Disabled access using the getter in the generated code to avoid frame escapes in PE.
Christian Humer <christian.humer@gmail.com>
parents: 9227
diff changeset
1753 if (accessElement == null || accessElement.getKind() == ElementKind.METHOD) {
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1754 builder.string("this.").string(targetField.getName());
9231
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1755 } else if (accessElement.getKind() == ElementKind.FIELD) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1756 builder.string("this.").string(accessElement.getSimpleName().toString());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1757 } else {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1758 throw new AssertionError();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1759 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1760 if (sourceParameter.getSpecification().isIndexed()) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1761 builder.string("[" + sourceParameter.getIndex() + "]");
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1762 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1763 builder.string(".");
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1764 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1765 builder.startCall(execType.getMethodName());
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1766 if (execType.getParameters().size() == 1) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1767 builder.string("frameValue");
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1768 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1769 builder.end();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1770 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1771 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1772
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1773 private CodeTree createShortCircuitTree(CodeTreeBuilder parent, CodeTree body, String targetVariableName, SpecializationData specialization, ActualParameter parameter,
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1774 ActualParameter exceptionParam) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1775 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1776
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1777 NodeChildData forField = specialization.getNode().findChild(parameter.getSpecification().getName());
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1778 if (forField == null) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1779 return body;
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1780 }
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1781
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1782 if (forField.getExecutionKind() != ExecutionKind.SHORT_CIRCUIT) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1783 return body;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1784 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1785
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1786 ActualParameter shortCircuitParam = specialization.getPreviousParam(parameter);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1787
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1788 builder.tree(createShortCircuitValue(builder, specialization, forField, shortCircuitParam, exceptionParam));
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1789
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1790 builder.declaration(parameter.getType(), targetVariableName, CodeTreeBuilder.createBuilder().defaultValue(parameter.getType()));
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1791 builder.startIf().string(shortCircuitParam.getLocalName()).end();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1792 builder.startBlock();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1793 builder.tree(body);
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1794 builder.end();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1795
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1796 return builder.getRoot();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1797 }
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1798
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1799 private CodeTree createShortCircuitValue(CodeTreeBuilder parent, SpecializationData specialization, NodeChildData forField, ActualParameter shortCircuitParam, ActualParameter exceptionParam) {
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1800 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1801 int shortCircuitIndex = 0;
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
1802 for (NodeChildData field : specialization.getNode().getChildren()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1803 if (field.getExecutionKind() == ExecutionKind.SHORT_CIRCUIT) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1804 if (field == forField) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1805 break;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1806 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1807 shortCircuitIndex++;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1808 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1809 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1810
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1811 builder.startStatement().type(shortCircuitParam.getType()).string(" ").string(valueName(shortCircuitParam)).string(" = ");
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1812 ShortCircuitData shortCircuitData = specialization.getShortCircuits().get(shortCircuitIndex);
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1813 builder.tree(createTemplateMethodCall(builder, specialization, shortCircuitData, exceptionParam != null ? exceptionParam.getLocalName() : null));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1814 builder.end(); // statement
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1815
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1816 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1817 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1818
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1819 private CodeTree createReturnSpecializeAndExecute(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData nextSpecialization, ActualParameter exceptionParam) {
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1820 CodeTreeBuilder specializeCall = new CodeTreeBuilder(parent);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1821 specializeCall.startCall("specializeAndExecute");
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1822 specializeCall.string(nodeSpecializationClassName(nextSpecialization) + ".class");
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1823 addInternalValueParameterNames(specializeCall, nextSpecialization.getNode().getGenericSpecialization(), nextSpecialization.getNode().getGenericSpecialization(),
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1824 exceptionParam != null ? exceptionParam.getLocalName() : null, true, true);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1825 specializeCall.end().end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1826
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1827 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1828 builder.startReturn();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1829 builder.tree(createExpectType(nextSpecialization.getNode(), executable, specializeCall.getRoot()));
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1830 builder.end();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1831
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1832 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1833 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1834
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1835 private void buildSpecializeAndExecute(CodeTypeElement clazz, SpecializationData specialization) {
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1836 NodeData node = specialization.getNode();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1837 TypeData returnType = node.getGenericSpecialization().getReturnType().getTypeSystemType();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1838
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1839 CodeExecutableElement method = new CodeExecutableElement(modifiers(PRIVATE), returnType.getPrimitiveType(), "specializeAndExecute");
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1840 method.addParameter(new CodeVariableElement(getContext().getType(Class.class), "minimumState"));
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
1841 addInternalValueParameters(method, specialization.getNode().getGenericSpecialization(), true);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1842 clazz.add(method);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1843
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1844 CodeTreeBuilder builder = method.createBuilder();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1845
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1846 builder.tree(createDeoptimize(builder));
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1847 emitSpecializationListeners(builder, specialization.getNode());
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1848
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1849 builder.startStatement();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1850 builder.startCall("replace");
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1851 builder.startCall(factoryClassName(specialization.getNode()), "specialize").string("this").string("minimumState");
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1852 addInternalValueParameterNames(builder, specialization.getNode().getGenericSpecialization(), specialization.getNode().getGenericSpecialization(), null, true, true);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1853 builder.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1854 builder.end(); // call replace
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1855 builder.end(); // statement
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1856
8661
e0ff5cf358a4 Fixed when specializing nodes must always call the full generic case.
Christian Humer <christian.humer@gmail.com>
parents: 8595
diff changeset
1857 String generatedMethodName;
e0ff5cf358a4 Fixed when specializing nodes must always call the full generic case.
Christian Humer <christian.humer@gmail.com>
parents: 8595
diff changeset
1858 if (specialization.getNode().getGenericSpecialization().isUseSpecializationsForGeneric()) {
e0ff5cf358a4 Fixed when specializing nodes must always call the full generic case.
Christian Humer <christian.humer@gmail.com>
parents: 8595
diff changeset
1859 generatedMethodName = generatedGenericMethodName(null);
e0ff5cf358a4 Fixed when specializing nodes must always call the full generic case.
Christian Humer <christian.humer@gmail.com>
parents: 8595
diff changeset
1860 } else {
e0ff5cf358a4 Fixed when specializing nodes must always call the full generic case.
Christian Humer <christian.humer@gmail.com>
parents: 8595
diff changeset
1861 generatedMethodName = generatedGenericMethodName(specialization.findNextSpecialization());
e0ff5cf358a4 Fixed when specializing nodes must always call the full generic case.
Christian Humer <christian.humer@gmail.com>
parents: 8595
diff changeset
1862 }
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1863 ExecutableElement generatedGeneric = clazz.getEnclosingClass().getMethod(generatedMethodName);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1864
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1865 CodeTreeBuilder genericExecute = CodeTreeBuilder.createBuilder();
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1866 genericExecute.startCall(factoryClassName(specialization.getNode()), generatedMethodName);
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1867 genericExecute.string("this");
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1868 addInternalValueParameterNames(genericExecute, specialization.getNode().getGenericSpecialization(), specialization.getNode().getGenericSpecialization(), null, true, true);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1869 genericExecute.end(); // call generated generic
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1870
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1871 CodeTree genericInvocation = genericExecute.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1872
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1873 if (generatedGeneric != null && Utils.isVoid(generatedGeneric.getReturnType())) {
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1874 builder.statement(genericInvocation);
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1875
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1876 if (!Utils.isVoid(builder.findMethod().asType())) {
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1877 builder.startReturn().defaultValue(returnType.getPrimitiveType()).end();
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1878 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1879 } else {
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1880 builder.startReturn().tree(genericInvocation).end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1881 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1882 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1883
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1884 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1885
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1886 }