annotate graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java @ 10513:00b70a864d3b

updated Checkstyle rules to prohibit underscores in method names and fixed current violations
author Doug Simon <doug.simon@oracle.com>
date Mon, 24 Jun 2013 22:56:07 +0200
parents 746fa60be266
children f43eb2f1bbbc
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
10513
00b70a864d3b updated Checkstyle rules to prohibit underscores in method names and fixed current violations
Doug Simon <doug.simon@oracle.com>
parents: 10446
diff changeset
46 private static final String EXECUTE_GENERIC_NAME = "executeGeneric0";
00b70a864d3b updated Checkstyle rules to prohibit underscores in method names and fixed current violations
Doug Simon <doug.simon@oracle.com>
parents: 10446
diff changeset
47 private static final String EXECUTE_SPECIALIZE_NAME = "executeAndSpecialize0";
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
48
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
49 public NodeCodeGenerator(ProcessorContext context) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
50 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
51 }
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 private TypeMirror getUnexpectedValueException() {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
54 return getContext().getTruffleTypes().getUnexpectedValueException();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
55 }
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 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
58 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
59 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
60
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
61 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
62 String nodeid = specialization.getNode().getNodeId();
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
63 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
64 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
65 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
66
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
67 String name = Utils.firstLetterUpperCase(nodeid);
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
68 name += Utils.firstLetterUpperCase(specialization.getId());
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
69 name += "Node";
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
70 return name;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
71 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
72
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
73 private static String valueNameEvaluated(ActualParameter targetParameter) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
74 return valueName(targetParameter) + "Evaluated";
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
75 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
76
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
77 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
78 return param.getLocalName();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
79 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
80
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
81 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
82 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
83 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
84
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
85 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
86 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
87 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
88 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
89 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
90 ParameterSpec spec = parameter.getSpecification();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
91 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
92 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
93 }
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
94 if (spec.isLocal()) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
95 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
96 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
97
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
98 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
99 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
100 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
101
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
102 private void addInternalValueParameterNames(CodeTreeBuilder builder, TemplateMethod source, TemplateMethod specialization, String unexpectedValueName, boolean forceFrame, boolean includeImplicit) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
103 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
104 builder.string("frameValue");
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
105 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
106 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
107 ParameterSpec spec = parameter.getSpecification();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
108 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
109 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
110 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
111
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
112 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
113 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
114 }
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
115 if (parameter.getSpecification().isLocal()) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
116 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
117 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
118
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
119 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
120
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
121 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
122 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
123 } 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
124 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
125 } 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
126 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
127 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
128 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
129 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
130
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
131 private String valueName(ActualParameter sourceParameter, ActualParameter targetParameter) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
132 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
133 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
134 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
135 } else if (sourceParameter.getTypeSystemType() != null && targetParameter.getTypeSystemType() != null) {
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
136 if (sourceParameter.getTypeSystemType().needsCastTo(getContext(), targetParameter.getTypeSystemType())) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
137 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
138 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
139 }
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 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
142 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
143 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
144 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
145
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
146 private CodeTree createTemplateMethodCall(CodeTreeBuilder parent, CodeTree target, TemplateMethod sourceMethod, TemplateMethod targetMethod, String unexpectedValueName,
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
147 String... customSignatureValueNames) {
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 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
149
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
150 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
151
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
152 builder.startGroup();
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
153 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
154 if (method == null) {
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
155 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
156 }
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
157 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
158 NodeData node = (NodeData) targetMethod.getTemplate();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
159
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
160 if (target == null) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
161 boolean accessible = targetMethod.canBeAccessedByInstanceOf(getContext(), node.getNodeType());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
162 if (accessible) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
163 if (builder.findMethod().getModifiers().contains(STATIC)) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
164 if (method.getModifiers().contains(STATIC)) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
165 builder.type(targetClass.asType());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
166 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
167 builder.string(THIS_NODE_LOCAL_VAR_NAME);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
168 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
169 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
170 if (targetMethod instanceof ExecutableTypeData) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
171 builder.string("this");
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
172 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
173 builder.string("super");
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
174 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
175 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
176 } else {
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
177 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
178 builder.type(targetClass.asType());
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
179 } else {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
180 ActualParameter parameter = null;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
181 for (ActualParameter searchParameter : targetMethod.getParameters()) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
182 if (searchParameter.getSpecification().isSignature()) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
183 parameter = searchParameter;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
184 break;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
185 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
186 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
187 ActualParameter sourceParameter = sourceMethod.findParameter(parameter.getLocalName());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
188 assert parameter != null;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
189
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
190 if (castedValues && sourceParameter != null) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
191 builder.string(valueName(sourceParameter, parameter));
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
192 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
193 builder.string(valueName(parameter));
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
194 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
195 }
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
196 }
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
197 builder.string(".");
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
198 } else {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
199 builder.tree(target);
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 }
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
201 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
202
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
203 int signatureIndex = 0;
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
204
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
205 for (ActualParameter targetParameter : targetMethod.getParameters()) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
206 ActualParameter valueParameter = null;
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
207 if (sourceMethod != null) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
208 valueParameter = sourceMethod.findParameter(targetParameter.getLocalName());
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
209 }
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
210 if (valueParameter == null) {
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
211 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
212 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
213 TypeData targetType = targetParameter.getTypeSystemType();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
214
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
215 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
216 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
217 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
218
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
219 TypeData valueType = null;
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
220 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
221 valueType = valueParameter.getTypeSystemType();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
222 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
223
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
224 if (signatureIndex < customSignatureValueNames.length && targetParameter.getSpecification().isSignature()) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
225 builder.string(customSignatureValueNames[signatureIndex]);
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
226 signatureIndex++;
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
227 } else if (targetParameter.getSpecification().isLocal()) {
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
228 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
229 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
230 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
231 } 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
232 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
233 }
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(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
235 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
236 } 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
237 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
238 } 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
239 builder.startGroup();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
240
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
241 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
242 builder.string("(");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
243 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
244 builder.string(") ");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
245 }
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
246 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
247 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
248 } 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
249 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
250 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
251 }
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
252
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
253 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
254
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
255 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
256 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
257
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
258 private static String baseClassName(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
259 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
260 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
261 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
262 }
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
263 String name = Utils.firstLetterUpperCase(nodeid);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
264 name += "BaseNode";
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
265 return name;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
266 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
267
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
268 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
269 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
270 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
271 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
272 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
273 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
274 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
275
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7502
diff changeset
276 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
277 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
278 assert singleton != null;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
279
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
280 body.startGroup();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
281 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
282 body.string(".").startCall(methodName);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
283 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
284
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
285 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
286 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
287
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
288 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
289 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
290 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
291 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
292
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
293 Set<String> valuesNeedsCast;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
294 if (castValues) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
295 // cast all
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
296 valuesNeedsCast = null;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
297 } else {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
298 // 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
299 valuesNeedsCast = new HashSet<>();
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
300 for (GuardData guard : targetSpecialization.getGuards()) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
301 for (ActualParameter targetParameter : guard.getParameters()) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
302 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
303 if (field == null) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
304 continue;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
305 }
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
306 TypeData targetType = targetParameter.getTypeSystemType();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
307 ActualParameter sourceParameter = sourceSpecialization.findParameter(targetParameter.getLocalName());
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
308 if (sourceParameter == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
309 sourceParameter = targetParameter;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
310 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
311 TypeData sourceType = sourceParameter.getTypeSystemType();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
312
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
313 if (sourceType.needsCastTo(getContext(), targetType)) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
314 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
315 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
316 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
317 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
318 }
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
319
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
320 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
321
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
322 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
323 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
324 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
325 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
326 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
327 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
328 }
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
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
330 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
331
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
332 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
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(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
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
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
340 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
341 builder.startIf();
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
342 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
343 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
344 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
345 }
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
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 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
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 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
350 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
351 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
352 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
353 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
354 }
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
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
356 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
357 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
358 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
359 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
360 // Explicitly specified guards
8592
a80bf36c6a1e Refactor to shared template method signature comparison.
Christian Humer <christian.humer@gmail.com>
parents: 8361
diff changeset
361 for (GuardData guard : guardedSpecialization.getGuards()) {
a80bf36c6a1e Refactor to shared template method signature comparison.
Christian Humer <christian.humer@gmail.com>
parents: 8361
diff changeset
362 builder.string(andOperator);
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
363 builder.tree(createTemplateMethodCall(parent, null, valueSpecialization, guard, null));
8592
a80bf36c6a1e Refactor to shared template method signature comparison.
Christian Humer <christian.humer@gmail.com>
parents: 8361
diff changeset
364 andOperator = " && ";
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
365 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
366 }
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
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
368 return builder.isEmpty() ? null : builder.getRoot();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
369 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
370
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
371 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
372 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
373 // 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
374 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
375 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
376 if (field == null) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
377 continue;
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
378 }
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
379 ActualParameter valueParam = valueSpecialization.findParameter(guardedParam.getLocalName());
7843
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 if (valueParam == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
382 /*
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
383 * 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
384 * 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
385 */
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
386 valueParam = guardedParam;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
387 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
388
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
389 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
390 continue;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
391 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
392
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
393 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
394 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
395 continue;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
396 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
397 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
398 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
399
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
400 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
401 }
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
402
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
403 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
404 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
405 // 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
406 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
407
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
408 if (emitAssumptions) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
409 for (String assumption : guardedSpecialization.getAssumptions()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
410 builder.string(andOperator);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
411 builder.string("this");
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
412 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
413 andOperator = " && ";
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
414 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
415 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
416
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
417 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
418 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
419 if (field == null) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
420 continue;
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
421 }
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
422 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
423
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
424 if (valueParam == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
425 /*
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
426 * 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
427 * 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
428 */
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
429 valueParam = guardedParam;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
430 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
431
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
432 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
433 if (implicitGuard == null) {
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
434 continue;
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
435 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
436
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
437 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
438 builder.tree(implicitGuard);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
439 andOperator = " && ";
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
440 }
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
441
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
442 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
443 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
444
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
445 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
446 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
447 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
448
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
449 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
450 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
451
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
452 if (!sourceType.needsCastTo(getContext(), 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
453 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
454 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
455
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
456 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
457
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
458 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
459 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
460 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
461 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
462 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
463 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
464 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
465
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
466 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
467 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
468 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
469
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
470 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
471 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
472 }
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 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
475
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
476 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
477 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
478
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
479 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
480 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
481 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
482 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
483
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
484 if (!sourceType.needsCastTo(getContext(), 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
485 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
486 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
487
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
488 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
489 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
490 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
491 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
492 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
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
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
495 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
496
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
497 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
498 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
499
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
500 /**
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
501 * <pre>
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
502 * 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
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 * $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
505 * 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
506 * $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
507 * }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
508 *
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
509 * 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
510 * $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
511 * </pre>
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
512 *
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
513 * .
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 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
516 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
517 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
518 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
519 } else {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
520 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
521
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
522 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
523 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
524 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
525 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
526 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
527 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
528 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
529 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
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 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
532 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
533
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
534 private void emitEncounteredSynthetic(CodeTreeBuilder builder, SpecializationData current) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
535 builder.startThrow().startNew(getContext().getType(UnsupportedOperationException.class));
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
536 builder.startGroup();
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
537 String sep = null;
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
538 for (ActualParameter parameters : current.getParameters()) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
539 if (parameters.getSpecification().isSignature()) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
540 if (sep == null) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
541 builder.doubleQuote("Unsupported values: " + parameters.getLocalName() + " = ");
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
542 sep = ", ";
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
543 } else {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
544 builder.string(" + ");
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
545 builder.doubleQuote(sep + parameters.getLocalName() + " = ");
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
546 }
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
547 builder.string(" + ");
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
548 builder.string(parameters.getLocalName());
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
549 }
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
550 }
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
551 builder.end();
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
552 builder.end().end();
8251
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
553 }
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
554
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
555 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
556 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
557 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
558 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
559 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
560 }
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 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
562 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
563 }
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 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
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
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 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
568 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
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
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 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
572 }
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
573
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
574 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
575 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
576 if (constructor.getModifiers().contains(PRIVATE)) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
577 continue;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
578 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
579 if (isCopyConstructor(constructor)) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
580 return constructor;
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
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
584 return null;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
585 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
586
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
587 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
588 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
589 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
590 }
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 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
592 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
593
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 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
595 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
596 }
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 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
598 }
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
599
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
600 private static CodeTree createReturnNewSpecialization(CodeTreeBuilder parent, SpecializationData specialization, String thisLocalVariableName, boolean hasCopyConstructor) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
601 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
602 builder.startReturn().startNew(nodeSpecializationClassName(specialization));
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
603 if (hasCopyConstructor) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
604 builder.string(thisLocalVariableName);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
605 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
606 builder.end().end();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
607 return builder.getRoot();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
608 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
609
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
610 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
611 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
612 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
613 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
614 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
615 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
616 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
617 }
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
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
620 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
621 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
622 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
623 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
624
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
625 private class NodeBaseFactory extends ClassElementFactory<NodeData> {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
626
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
627 public NodeBaseFactory(ProcessorContext context) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
628 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
629 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
630
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
631 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
632 protected CodeTypeElement create(NodeData node) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
633 CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, ABSTRACT, STATIC), baseClassName(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
634
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
635 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
636 clazz.add(createChildField(child));
9227
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
637
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
638 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
639 ExecutableElement getter = (ExecutableElement) child.getAccessElement();
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
640 CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), getter);
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
641 method.getModifiers().remove(Modifier.ABSTRACT);
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
642 method.createBuilder().startReturn().string("this.").string(child.getName()).end();
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
643 clazz.add(method);
6d92fdf1c999 Fixes several minor issues.
Christian Humer <christian.humer@gmail.com>
parents: 9220
diff changeset
644 }
7502
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
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
647 for (String assumption : node.getAssumptions()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
648 clazz.add(createAssumptionField(assumption));
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
649 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
650
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
651 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
652
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
653 if (node.getExtensionElements() != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
654 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
655 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
656
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
657 return clazz;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
658 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
659
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
660 @Override
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
661 protected void createChildren(NodeData node) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
662 CodeTypeElement clazz = getElement();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
663
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
664 if (node.needsRewrites(context)) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
665 clazz.add(createGenericExecute(node, EXECUTE_SPECIALIZE_NAME, true));
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
666 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
667
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
668 if (node.getGenericSpecialization() != null) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
669 clazz.add(createGenericExecute(node, EXECUTE_GENERIC_NAME, false));
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
670 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
671 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
672
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
673 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
674 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
675 if (constructors.isEmpty()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
676 clazz.add(createUserConstructor(clazz, null));
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
677 } else {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
678 for (ExecutableElement constructor : constructors) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
679 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
680 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
681 }
9281
e16363e50252 Fixed minor bug in gen constructor generation.
Christian Humer <christian.humer@gmail.com>
parents: 9279
diff changeset
682 if (node.needsRewrites(getContext())) {
e16363e50252 Fixed minor bug in gen constructor generation.
Christian Humer <christian.humer@gmail.com>
parents: 9279
diff changeset
683 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
684 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
685 }
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
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
687 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
688 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
689 CodeTreeBuilder builder = method.createBuilder();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
690
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
691 if (superConstructor != null) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
692 for (VariableElement param : superConstructor.getParameters()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
693 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
694 }
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 }
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
696
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
697 for (VariableElement var : type.getFields()) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
698 NodeChildData child = getModel().findChild(var.getSimpleName().toString());
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
699 if (child != null) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
700 method.getParameters().add(new CodeVariableElement(child.getOriginalType(), child.getName()));
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
701 } else {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
702 method.getParameters().add(new CodeVariableElement(var.asType(), var.getSimpleName().toString()));
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
703 }
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
704 }
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
705
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 if (superConstructor != null) {
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
707 builder.startStatement().startSuperCall();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
708 for (VariableElement param : superConstructor.getParameters()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
709 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
710 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
711 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
712 }
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
713
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
714 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
715 builder.startStatement();
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
716 String fieldName = var.getSimpleName().toString();
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
717
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
718 CodeTree fieldInit = CodeTreeBuilder.singleString(var.getSimpleName().toString());
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
719 builder.string("this.").string(var.getSimpleName().toString());
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
720
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
721 NodeChildData child = getModel().findChild(fieldName);
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
722 if (child != null) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
723 CreateCastData createCast = getModel().findCast(child.getName());
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
724 if (createCast != null) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
725 fieldInit = createTemplateMethodCall(builder, null, getModel().getGenericSpecialization(), createCast, null, child.getName());
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
726 }
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
727 }
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
728
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
729 if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNode())) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
730 builder.string(" = adoptChild(").tree(fieldInit).string(")");
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
731 } else if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNodeArray())) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
732 builder.string(" = adoptChildren(").tree(fieldInit).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
733 } else {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
734 builder.string(" = ").tree(fieldInit);
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
735 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
736 builder.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
737 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
738 return method;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
739 }
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
740
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
741 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
742 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
743 CodeTreeBuilder builder = method.createBuilder();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
744 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
745 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
746 }
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
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
748 if (superConstructor != null) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
749 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
750 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
751
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
752 for (VariableElement var : type.getFields()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
753 builder.startStatement();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
754 String varName = var.getSimpleName().toString();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
755 builder.string("this.").string(varName);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
756 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
757 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
758 } 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
759 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
760 } else {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
761 builder.string(" = copy.").string(varName);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
762 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
763 builder.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
764 }
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
765 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
766 }
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
767
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
768 private CodeVariableElement createAssumptionField(String assumption) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
769 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
770 var.getModifiers().add(Modifier.FINAL);
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
771 return var;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
772 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
773
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
774 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
775 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
776 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
777
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
778 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
779 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
780 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
781 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
782 } 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
783 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
784 }
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
785
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
786 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
787 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
788 }
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
789
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
790 private CodeExecutableElement createGenericExecute(NodeData node, String name, boolean specialize) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
791 TypeMirror genericReturnType = node.getGenericSpecialization().getReturnType().getType();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
792
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
793 CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED), genericReturnType, name);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
794 CodeTreeBuilder builder = method.createBuilder();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
795
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
796 String prefix = null;
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
797 if (specialize) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
798 method.addParameter(new CodeVariableElement(getContext().getType(Class.class), "minimumState"));
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
799
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
800 builder.startStatement();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
801 builder.startStaticCall(getContext().getTruffleTypes().getCompilerAsserts(), "neverPartOfCompilation").end();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
802 builder.end();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
803
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
804 emitSpecializationListeners(builder, node);
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
805 builder.defaultDeclaration(node.getGenericSpecialization().getReturnSignature().getPrimitiveType(), "result");
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
806 if (node.getGenericSpecialization().isUseSpecializationsForGeneric()) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
807 builder.defaultDeclaration(getContext().getType(boolean.class), "resultIsSet");
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
808 }
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
809 builder.startStatement().string("boolean allowed = (minimumState == ").string(nodeSpecializationClassName(node.getSpecializations().get(0))).string(".class)").end();
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
810 prefix = null;
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
811
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
812 builder.startStatement().string("StringBuilder message = new StringBuilder(reason)").end();
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
813 builder.startStatement().startCall("message", "append").doubleQuote(" (").end().end();
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
814
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
815 String sep = null;
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
816 for (ActualParameter parameter : node.getGenericSpecialization().getParameters()) {
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
817 if (!parameter.getSpecification().isSignature()) {
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
818 continue;
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
819 }
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
820
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
821 builder.startStatement();
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
822 builder.string("message");
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
823 if (sep != null) {
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
824 builder.startCall(".append").doubleQuote(sep).end();
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
825 }
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
826 builder.startCall(".append").doubleQuote(parameter.getLocalName()).end();
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
827 builder.startCall(".append").doubleQuote(" = ").end();
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
828 builder.startCall(".append").string(parameter.getLocalName()).end();
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
829 builder.end();
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
830
9798
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
831 if (!Utils.isPrimitive(parameter.getType())) {
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
832 builder.startIf().string(parameter.getLocalName() + " != null").end();
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
833 builder.startBlock();
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
834 }
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
835 builder.startStatement();
9798
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
836 if (Utils.isPrimitive(parameter.getType())) {
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
837 builder.startCall("message.append").doubleQuote(" (" + Utils.getSimpleName(parameter.getType()) + ")").end();
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
838 } else {
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
839 builder.startCall("message.append").doubleQuote(" (").end();
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
840 builder.startCall(".append").string(parameter.getLocalName() + ".getClass().getSimpleName()").end();
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
841 builder.startCall(".append").doubleQuote(")").end();
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
842 }
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
843 builder.end();
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
844 if (!Utils.isPrimitive(parameter.getType())) {
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
845 builder.end();
476cbd115289 Fixed reason generation failed for primitive generic signatures.
Christian Humer <christian.humer@gmail.com>
parents: 9796
diff changeset
846 }
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
847
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
848 sep = ", ";
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
849 }
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
850
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
851 builder.startStatement().startCall("message", "append").doubleQuote(")").end().end();
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
852 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
853
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
854 addInternalValueParameters(method, node.getGenericSpecialization(), true);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
855
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
856 if (specialize) {
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
857 method.addParameter(new CodeVariableElement(getContext().getType(String.class), "reason"));
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
858 }
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
859
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
860 List<SpecializationData> specializations = node.getSpecializations();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
861 if (!specialize && !node.getGenericSpecialization().isUseSpecializationsForGeneric()) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
862 specializations = Arrays.asList(node.getGenericSpecialization());
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
863 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
864
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
865 // group specializations for reachabiltiy
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
866 List<SpecializationData> unreachableSpecializations = new ArrayList<>();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
867 List<SpecializationData> filteredSpecializations = new ArrayList<>();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
868 if (!specialize) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
869 unreachableSpecializations = new ArrayList<>();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
870 filteredSpecializations = new ArrayList<>();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
871 boolean unreachable = false;
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
872 for (SpecializationData specialization : specializations) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
873 if (unreachable) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
874 unreachableSpecializations.add(specialization);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
875 } else {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
876 filteredSpecializations.add(specialization);
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
877 if (!specialization.isUninitialized() && specialization.isGenericSpecialization(getContext())) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
878 unreachable = true;
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
879 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
880 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
881 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
882 } else {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
883 unreachableSpecializations = Collections.emptyList();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
884 filteredSpecializations = specializations;
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
885 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
886
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
887 for (SpecializationData current : filteredSpecializations) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
888 if (current.isUninitialized()) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
889 continue;
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
890 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
891 CodeTreeBuilder execute = new CodeTreeBuilder(builder);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
892
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
893 execute.tree(createGenericInvoke(builder, current, specialize));
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
894
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
895 if (specialize && !current.isGeneric()) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
896 builder.startStatement().string("allowed = allowed || (minimumState == ").string(nodeSpecializationClassName(current)).string(".class)").end();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
897 }
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
898
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
899 builder.tree(createGuardAndCast(builder, prefix, current.getNode().getGenericSpecialization(), current, true, execute.getRoot(), null, true));
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
900 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
901
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
902 for (SpecializationData specializationData : unreachableSpecializations) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
903 builder.string("// unreachable ").string(specializationData.getId()).newLine();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
904 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
905
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
906 return method;
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
907 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
908
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
909 private CodeTree createGenericInvoke(CodeTreeBuilder parent, SpecializationData current, boolean specialize) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
910 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
911
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
912 if (!current.getExceptions().isEmpty()) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
913 builder.startTryBlock();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
914 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
915
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
916 CodeTree executeCall = null;
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
917 if (current.getMethod() != null) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
918 executeCall = createTemplateMethodCall(builder, null, current.getNode().getGenericSpecialization(), current, null);
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
919 }
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
920
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
921 if (specialize && executeCall == null && !current.getNode().getGenericSpecialization().isUseSpecializationsForGeneric()) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
922 emitEncounteredSynthetic(builder, current);
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
923 } else if (specialize) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
924
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
925 if (current.getNode().getGenericSpecialization().isUseSpecializationsForGeneric()) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
926 builder.startIf().string("!resultIsSet").end().startBlock();
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
927 if (executeCall != null) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
928 if (current.getReturnSignature().isVoid()) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
929 builder.statement(executeCall);
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
930 } else {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
931 builder.startStatement().string("result = ").tree(executeCall).end();
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
932 }
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
933 builder.statement("resultIsSet = true");
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
934 } else {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
935 emitEncounteredSynthetic(builder, current);
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
936 }
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
937 builder.end();
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
938 }
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
939
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
940 if (!current.isGeneric()) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
941 builder.startIf().string("allowed").end().startBlock();
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
942 }
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
943
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
944 if (!current.getNode().getGenericSpecialization().isUseSpecializationsForGeneric()) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
945 if (current.getReturnSignature().isVoid()) {
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
946 builder.statement(executeCall);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
947 } else {
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
948 builder.startStatement().string("result = ").tree(executeCall).end();
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
949 }
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
950 }
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
951
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
952 builder.startStatement().startCall("super", "replace");
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
953 builder.startGroup().startNew(nodeSpecializationClassName(current)).string("this").end().end();
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
954 builder.string("message.toString()");
9356
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
955 builder.end().end();
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
956
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
957 if (current.getReturnSignature().isVoid()) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
958 builder.returnStatement();
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
959 } else {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
960 builder.startReturn().string("result").end();
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
961 }
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
962 if (!current.isGeneric()) {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
963 builder.end();
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
964 }
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
965 } else {
86d981cd8e22 Fixed a bug in new code generation layout.
Christian Humer <christian.humer@gmail.com>
parents: 9345
diff changeset
966 if (executeCall == null) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
967 emitEncounteredSynthetic(builder, current);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
968 } else {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
969 builder.startReturn().tree(executeCall).end();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
970 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
971 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
972
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
973 if (!current.getExceptions().isEmpty()) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
974 for (SpecializationThrowsData exception : current.getExceptions()) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
975 builder.end().startCatchBlock(exception.getJavaClass(), "rewriteEx");
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
976 builder.string("// fall through").newLine();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
977 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
978 builder.end();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
979 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
980
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
981 return builder.getRoot();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
982 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
983
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
984 private void emitSpecializationListeners(CodeTreeBuilder builder, NodeData node) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
985 for (TemplateMethod listener : node.getSpecializationListeners()) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
986 builder.startStatement();
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
987 builder.tree(createTemplateMethodCall(builder, null, listener, listener, null));
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
988 builder.end(); // statement
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
989 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
990 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
991 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
992
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
993 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
994
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
995 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
996
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
997 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
998
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
999 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
1000 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1001 this.childTypes = childElements;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1002 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1003
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1004 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1005 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
1006 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
1007 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
1008 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1009 clazz.getModifiers().add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1010 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1011 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
1012 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
1013 return clazz;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1014 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1015
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1016 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1017 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
1018 CodeTypeElement clazz = getElement();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1019
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1020 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
1021
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1022 if (node.needsFactory()) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1023 NodeBaseFactory factory = new NodeBaseFactory(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
1024 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
1025 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
1026
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1027 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
1028 clazz.add(createCreateSpecializedMethod(node, createVisibility));
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1029 }
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
1030
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1031 createFactoryMethods(node, clazz, createVisibility);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1032
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1033 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
1034 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
1035 }
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1036
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
1037 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
1038 clazz.getImplements().add(nodeFactory);
7859
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
1039 clazz.add(createCreateNodeMethod(node));
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
1040 clazz.add(createCreateNodeSpecializedMethod(node));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1041 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
1042 clazz.add(createGetNodeSignaturesMethod());
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1043 clazz.add(createGetChildrenSignatureMethod(node));
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1044 clazz.add(createGetInstanceMethod(node, createVisibility));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1045 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
1046 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1047
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1048 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
1049 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
1050 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1051 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1052
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1053 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
1054 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
1055 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
1056 typeModifiers.clear();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1057 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1058 typeModifiers.add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1059 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1060
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1061 typeModifiers.add(Modifier.STATIC);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1062 typeModifiers.add(Modifier.FINAL);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1063 clazz.add(type);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1064 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1065 }
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1066
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 List<NodeData> children = node.getNodeDeclaringChildren();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1068 if (node.getParent() == null && children.size() > 0) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1069 clazz.add(createGetFactories(node));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1070 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1071
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
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1074 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
1075 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
1076 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
1077 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1078 builder.startReturn().typeLiteral(node.getNodeType()).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1079 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1080 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1081
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
1082 private CodeExecutableElement createGetNodeSignaturesMethod() {
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1083 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
1084 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
1085 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
1086 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
1087 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1088 builder.startReturn();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1089 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
1090 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
1091 for (ExecutableElement constructor : constructors) {
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1092 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
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;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1097 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1098
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1099 private CodeExecutableElement createGetChildrenSignatureMethod(NodeData node) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1100 Types types = getContext().getEnvironment().getTypeUtils();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1101 TypeElement listType = Utils.fromTypeMirror(getContext().getType(List.class));
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1102 TypeMirror classType = getContext().getType(Class.class);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1103 TypeMirror nodeType = getContext().getTruffleTypes().getNode();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1104 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
1105 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
1106 TypeMirror returnType = Utils.getDeclaredType(listType, classType);
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1107
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
1108 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
1109 CodeTreeBuilder builder = method.createBuilder();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1110
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1111 List<TypeMirror> signatureTypes = new ArrayList<>();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1112 assert !node.getSpecializations().isEmpty();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1113 SpecializationData data = node.getSpecializations().get(0);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1114 for (ActualParameter parameter : data.getParameters()) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1115 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
1116 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
1117 if (field == null) {
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1118 continue;
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1119 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1120
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1121 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
1122 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
1123 type = ((ArrayType) field.getNodeType()).getComponentType();
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1124 } 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
1125 type = field.getNodeType();
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1126 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1127
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1128 signatureTypes.add(type);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1129 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1130
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1131 builder.startReturn().tree(createAsList(builder, signatureTypes, classType)).end();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1132 return method;
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1133 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1134
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1135 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
1136 CodeTreeBuilder builder = parent.create();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1137 builder.startGroup();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1138 builder.type(getContext().getType(Arrays.class));
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1139 builder.string(".<").type(elementClass).string(">");
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1140 builder.startCall("asList");
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1141 for (TypeMirror typeMirror : types) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1142 builder.typeLiteral(typeMirror);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1143 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1144 builder.end().end();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1145 return builder.getRoot();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1146 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
1147
7859
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
1148 private CodeExecutableElement createCreateNodeMethod(NodeData node) {
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
1149 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
1150 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
1151 method.setVarArgs(true);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1152 method.addParameter(arguments);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1153
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1154 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
1155 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
1156 boolean ifStarted = false;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1157
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1158 for (ExecutableElement element : signatures) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1159 ifStarted = builder.startIf(ifStarted);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1160 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
1161
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1162 int index = 0;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1163 for (VariableElement param : element.getParameters()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1164 builder.string(" && ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1165 if (!param.asType().getKind().isPrimitive()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1166 builder.string("(arguments[" + index + "] == null || ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1167 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1168 builder.string("arguments[" + index + "] instanceof ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1169 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
1170 if (!param.asType().getKind().isPrimitive()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1171 builder.string(")");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1172 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1173 index++;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1174 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1175 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1176 builder.startBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1177
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1178 builder.startReturn().startCall("create");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1179 index = 0;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1180 for (VariableElement param : element.getParameters()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1181 builder.startGroup();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1182 builder.string("(").type(param.asType()).string(") ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1183 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
1184 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1185 index++;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1186 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1187 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1188
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1189 builder.end(); // block
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1190 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1191
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1192 builder.startElseBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1193 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
1194 builder.doubleQuote("Invalid create signature.");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1195 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1196 builder.end(); // else block
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1197 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1198 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1199
7859
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
1200 private CodeExecutableElement createCreateNodeSpecializedMethod(NodeData node) {
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
1201 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
1202 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
1203 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
1204 method.addParameter(nodeParam);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1205 method.addParameter(arguments);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1206 method.setVarArgs(true);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1207
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1208 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1209 if (!node.needsRewrites(getContext())) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
1210 builder.startThrow().startNew(getContext().getType(UnsupportedOperationException.class)).doubleQuote("No specialized version.").end().end();
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1211 } else {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1212 builder.startIf();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1213 builder.string("types.length == 1");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1214 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1215 builder.startBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1216
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1217 builder.startReturn().startCall("createSpecialized");
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1218 builder.startGroup();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1219 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
1220 builder.end();
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1221 builder.string("types[0]");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1222 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1223
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1224 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1225 builder.startElseBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1226 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
1227 builder.doubleQuote("Invalid createSpecialized signature.");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1228 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1229 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1230 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1231
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1232 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1233 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1234
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1235 private ExecutableElement createGetInstanceMethod(NodeData node, Modifier visibility) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1236 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
1237 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
1238
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1239 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
1240 if (visibility != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1241 method.getModifiers().add(visibility);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1242 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1243 method.getModifiers().add(Modifier.STATIC);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1244
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1245 String varName = instanceVarName(node);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1246
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1247 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1248 builder.startIf();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1249 builder.string(varName).string(" == null");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1250 builder.end().startBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1251
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1252 builder.startStatement();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1253 builder.string(varName);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1254 builder.string(" = ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1255 builder.startNew(factoryClassName(node)).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1256 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1257
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1258 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1259 builder.startReturn().string(varName).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1260 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1261 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1262
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1263 private String instanceVarName(NodeData node) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1264 if (node.getParent() != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1265 return Utils.firstLetterLowerCase(factoryClassName(node)) + "Instance";
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1266 } else {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1267 return "instance";
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1268 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1269 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1270
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1271 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
1272 String varName = instanceVarName(node);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1273 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
1274 var.getModifiers().add(Modifier.PRIVATE);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1275 var.getModifiers().add(Modifier.STATIC);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1276 return var;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1277 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1278
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1279 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
1280 List<NodeData> children = node.getNodeDeclaringChildren();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1281 if (node.needsFactory()) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1282 children.add(node);
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1283 }
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1284
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1285 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
1286 TypeMirror prev = null;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1287 boolean allSame = true;
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1288 for (NodeData child : children) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1289 nodeTypesList.add(child.getNodeType());
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1290 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
1291 allSame = false;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1292 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1293 prev = child.getNodeType();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1294 }
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1295 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
1296
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1297 Types types = getContext().getEnvironment().getTypeUtils();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1298 TypeMirror factoryType = getContext().getType(NodeFactory.class);
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
1299 TypeMirror baseType;
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1300 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
1301 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
1302 } 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
1303 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
1304 }
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
1305 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
1306
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1307 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
1308
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1309 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1310 builder.startReturn();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1311 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
1312
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1313 for (NodeData child : children) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1314 builder.startGroup();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1315 NodeData childNode = child;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1316 List<NodeData> factories = new ArrayList<>();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1317 while (childNode.getParent() != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1318 factories.add(childNode);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1319 childNode = childNode.getParent();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1320 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1321 Collections.reverse(factories);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1322 for (NodeData nodeData : factories) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1323 builder.string(factoryClassName(nodeData)).string(".");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1324 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1325 builder.string("getInstance()");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1326 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1327 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1328 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1329 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1330 return method;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1331 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1332
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1333 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
1334 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
1335 for (ExecutableElement constructor : constructors) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1336 clazz.add(createCreateMethod(node, createVisibility, constructor));
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1337 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1338 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
1339
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1340 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
1341 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
1342 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
1343 method.getModifiers().clear();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1344 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1345 method.getModifiers().add(visibility);
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 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
1348 method.setReturnType(node.getNodeType());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1349
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1350 CodeTreeBuilder body = method.createBuilder();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1351 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
1352 if (node.getSpecializations().isEmpty()) {
10513
00b70a864d3b updated Checkstyle rules to prohibit underscores in method names and fixed current violations
Doug Simon <doug.simon@oracle.com>
parents: 10446
diff changeset
1353 body.nullLiteral();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1354 } else {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1355 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
1356 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
1357 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
1358 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1359 body.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1360 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1361 body.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1362 return method;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1363 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1364
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1365 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
1366 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
1367 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1368 method.getModifiers().add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1369 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1370 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
1371
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1372 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
1373 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
1374
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1375 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
1376
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1377 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
1378
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1379 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
1380
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1381 if (hasCopyConstructor) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1382 body.startStatement();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1383 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
1384 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
1385 body.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1386 }
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
1387
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1388 boolean first = true;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1389 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
1390 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
1391 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
1392 if (first) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1393 body.startIf();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1394 first = false;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1395 } else {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1396 body.startElseIf();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1397 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1398 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
1399 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
1400
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1401 body.end(); // if
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1402 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1403 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1404 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
1405 return method;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1406 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1407
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1408 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1409
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1410 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
1411
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
1412 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
1413
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
1414 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
1415 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
1416 this.nodeGen = nodeGen;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1417 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1418
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1419 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1420 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
1421 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
1422 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
1423 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
1424 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
1425 }
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
1426 CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, STATIC, FINAL), nodeSpecializationClassName(specialization), baseType, false);
9779
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1427
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1428 String shortName = specialization.getNode().getShortName();
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1429 CodeAnnotationMirror nodeInfoMirror = new CodeAnnotationMirror(getContext().getTruffleTypes().getNodeInfoAnnotation());
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1430 if (shortName != null) {
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1431 nodeInfoMirror.setElementValue(nodeInfoMirror.findExecutableElement("shortName"), new CodeAnnotationValue(shortName));
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1432 }
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1433
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1434 DeclaredType nodeinfoKind = getContext().getTruffleTypes().getNodeInfoKind();
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1435 VariableElement kind;
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1436 if (specialization.isGeneric()) {
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1437 kind = Utils.findVariableElement(nodeinfoKind, "GENERIC");
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1438 } else if (specialization.isUninitialized()) {
9781
c15fd053efb6 Fixed typo in NodeInfo.Kind.
Christian Humer <christian.humer@gmail.com>
parents: 9780
diff changeset
1439 kind = Utils.findVariableElement(nodeinfoKind, "UNINITIALIZED");
9779
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1440 } else {
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1441 kind = Utils.findVariableElement(nodeinfoKind, "SPECIALIZED");
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1442 }
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1443
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1444 nodeInfoMirror.setElementValue(nodeInfoMirror.findExecutableElement("kind"), new CodeAnnotationValue(kind));
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1445
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1446 clazz.getAnnotationMirrors().add(nodeInfoMirror);
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1447
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1448 return clazz;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1449 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1450
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1451 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1452 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
1453 CodeTypeElement clazz = getElement();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1454 NodeData node = specialization.getNode();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1455
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1456 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
1457 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
1458 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
1459 if (superConstructor != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1460 clazz.add(superConstructor);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1461 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1462 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1463
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1464 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
1465 if (execType.isFinal()) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1466 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1467 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1468 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
1469 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
1470 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
1471 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
1472 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
1473 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
1474 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1475 clazz.remove(executeMethod);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1476 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1477 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1478 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1479
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1480 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
1481 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
1482
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1483 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
1484
9780
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1485 List<ExecutableTypeData> primaryExecutes = findFunctionalExecutableType(specialization, execType.getEvaluatedCount());
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1486
9780
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1487 if (primaryExecutes.contains(execType) || primaryExecutes.isEmpty()) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1488 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
1489 } else if (needsCastingExecuteMethod(execType, primaryType)) {
9780
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1490 assert !primaryExecutes.isEmpty();
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1491 builder.tree(createCastingExecute(builder, specialization, execType, primaryExecutes.get(0)));
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1492 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1493 return null;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1494 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1495
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1496 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
1497 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1498
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1499 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
1500 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
1501
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1502 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
1503 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
1504 CodeVariableElement var = CodeVariableElement.clone(param);
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1505 ActualParameter actualParameter = execType.getParameters().get(i);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1506 if (actualParameter.getSpecification().isSignature()) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1507 var.setName(valueNameEvaluated(actualParameter));
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1508 } else {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1509 var.setName(valueName(actualParameter));
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1510 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1511 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
1512 i++;
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1513 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1514
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1515 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
1516 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
1517 return method;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1518 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1519
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1520 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
1521 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
1522 return true;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1523 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1524 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
1525 return true;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1526 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1527 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
1528 return true;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1529 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1530 return false;
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1531 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1532
9780
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1533 private List<ExecutableTypeData> findFunctionalExecutableType(SpecializationData specialization, int evaluatedCount) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1534 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
1535 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
1536
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1537 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
1538 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
1539 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
1540 continue;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1541 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1542 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
1543 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1544
9780
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1545 // no direct matches found use generic where the type is Object
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1546 if (filteredTypes.isEmpty()) {
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1547 for (ExecutableTypeData compareType : otherTypes) {
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1548 if (compareType.getType().isGeneric() && !compareType.hasUnexpectedValue(getContext())) {
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1549 filteredTypes.add(compareType);
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1550 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1551 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1552 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1553
9780
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1554 if (filteredTypes.isEmpty()) {
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1555 for (ExecutableTypeData compareType : otherTypes) {
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1556 if (compareType.getType().isGeneric()) {
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1557 filteredTypes.add(compareType);
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1558 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1559 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1560 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1561
9780
763100239da6 Fixed GRAAL-276.
Christian Humer <christian.humer@gmail.com>
parents: 9779
diff changeset
1562 return filteredTypes;
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1563 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1564
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1565 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
1566 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
1567 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
1568 NodeData node = specialization.getNode();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1569
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1570 ExecutableTypeData castedType = node.findExecutableType(type, 0);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1571 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
1572
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1573 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
1574 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
1575
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1576 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
1577 for (ActualParameter sourceParameter : executable.getParameters()) {
9536
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1578 if (!sourceParameter.getSpecification().isSignature()) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1579 continue;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1580 }
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
1581
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1582 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
1583 if (targetParameter != null) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1584 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
1585 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1586 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1587
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1588 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
1589
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1590 CodeTree primaryExecuteCall = createTemplateMethodCall(builder, null, executable, castExecutable, null);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1591 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
1592 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
1593 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
1594 }
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
1595 builder.startTryBlock();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1596
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
1597 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
1598 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
1599 } 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
1600 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
1601 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
1602 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
1603 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
1604 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1605
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
1606 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
1607 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
1608 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
1609 } 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
1610 builder.startReturn();
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1611 builder.tree(createExpectExecutableType(node, specialization.getNode().getTypeSystem().getGenericTypeData(), 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
1612 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
1613 }
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
1614 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1615
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
1616 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
1617 builder.startReturn();
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1618 builder.tree(createExpectExecutableType(node, castExecutable.getReturnSignature(), executable, 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
1619 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
1620 }
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
1621 } 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
1622 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
1623 builder.statement(primaryExecuteCall);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1624 } 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
1625 builder.startReturn();
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1626 builder.tree(createExpectExecutableType(node, castExecutable.getReturnSignature(), executable, 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
1627 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1628 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1629 }
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1630
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1631 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
1632 }
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
1633
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1634 private CodeTree createExpectExecutableType(NodeData node, TypeData sourceType, ExecutableTypeData castedType, CodeTree value) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1635 boolean hasUnexpected = castedType.hasUnexpectedValue(getContext());
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1636 return createCastType(node, sourceType, castedType.getType(), hasUnexpected, value);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1637 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1638
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1639 private CodeTree createCastType(NodeData node, TypeData sourceType, TypeData targetType, boolean expect, CodeTree value) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1640 if (targetType == 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
1641 return value;
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1642 } else if (!sourceType.needsCastTo(getContext(), targetType)) {
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
1643 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
1644 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1645
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
1646 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
1647 String targetMethodName;
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1648 if (expect) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1649 targetMethodName = TypeSystemCodeGenerator.expectTypeMethodName(targetType);
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
1650 } else {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1651 targetMethodName = TypeSystemCodeGenerator.asTypeMethodName(targetType);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1652 }
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1653 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
1654
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
1655 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
1656 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
1657 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1658 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1659
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1660 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
1661 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1662 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
1663 builder.tree(createDeoptimize(builder));
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1664 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1665
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1666 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
1667
8361
676fa31bd3f0 Uninitialized cases produced wrong call to throw new UnsuportedOperationException.
Christian Humer <christian.humer@gmail.com>
parents: 8310
diff changeset
1668 CodeTree executeNode;
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1669 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
1670
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1671 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
1672 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
1673 if (next != null) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1674 CodeTreeBuilder returnBuilder = new CodeTreeBuilder(builder);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1675 returnBuilder.tree(createDeoptimize(builder));
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
1676 returnBuilder.tree(createReturnExecuteAndSpecialize(builder, executable, next, null, "One of guards " + specialization.getGuards() + " failed"));
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1677 returnSpecialized = returnBuilder.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
1678 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1679 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
1680
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1681 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
1682 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1683
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1684 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
1685 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
1686 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
1687 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
1688 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
1689 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
1690 }
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
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1692 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
1693 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
1694 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
1695 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
1696 builder.startTryBlock();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1697 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1698
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1699 for (String assumption : specialization.getAssumptions()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1700 builder.startStatement();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1701 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
1702 builder.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1703 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1704
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1705 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
1706 if (specialization.isUninitialized()) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1707 returnBuilder.startCall("super", EXECUTE_SPECIALIZE_NAME);
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1708 returnBuilder.startGroup().string(nodeSpecializationClassName(specialization)).string(".class").end();
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1709 addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true);
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
1710 returnBuilder.doubleQuote("Uninitialized");
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1711 returnBuilder.end();
8361
676fa31bd3f0 Uninitialized cases produced wrong call to throw new UnsuportedOperationException.
Christian Humer <christian.humer@gmail.com>
parents: 8310
diff changeset
1712 } else if (specialization.getMethod() == null && !node.needsRewrites(context)) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
1713 emitEncounteredSynthetic(builder, specialization);
8361
676fa31bd3f0 Uninitialized cases produced wrong call to throw new UnsuportedOperationException.
Christian Humer <christian.humer@gmail.com>
parents: 8310
diff changeset
1714 } else if (specialization.isGeneric()) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1715 returnBuilder.startCall("super", EXECUTE_GENERIC_NAME);
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1716 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
1717 returnBuilder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1718 } else {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1719 returnBuilder.tree(createTemplateMethodCall(returnBuilder, null, 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
1720 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1721
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1722 if (!returnBuilder.isEmpty()) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1723 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
1724
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1725 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
1726 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
1727
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1728 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
1729 builder.tree(returnBuilder.getRoot());
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1730 } else if (sourceType.needsCastTo(getContext(), targetType)) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1731 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
1732 } else {
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(returnBuilder.getRoot());
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1734 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1735 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1736 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1737
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
1738 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
1739 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
1740 builder.end().startCatchBlock(exception.getJavaClass(), "ex");
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1741 builder.tree(createDeoptimize(builder));
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
1742 builder.tree(createReturnExecuteAndSpecialize(parent, executable, exception.getTransitionTo(), null, "Thrown " + Utils.getSimpleName(exception.getJavaClass())));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1743 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1744 builder.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1745 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1746 if (!specialization.getAssumptions().isEmpty()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1747 builder.end().startCatchBlock(getContext().getTruffleTypes().getInvalidAssumption(), "ex");
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
1748 builder.tree(createReturnExecuteAndSpecialize(parent, executable, specialization.findNextSpecialization(), null, "Assumption failed"));
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1749 builder.end();
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1750 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1751
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
1752 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
1753 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
1754
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1755 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
1756 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
1757 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
1758
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
1759 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
1760
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1761 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
1762 NodeChildData field = sourceNode.findChild(targetParameter.getSpecification().getName());
9536
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1763 if (!targetParameter.getSpecification().isSignature()) {
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
1764 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
1765 }
9536
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1766
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1767 TypeData targetType = targetParameter.getTypeSystemType();
9536
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1768 ExecutableTypeData targetExecutable = null;
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1769 if (field != null) {
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1770 targetExecutable = field.findExecutableType(getContext(), targetType);
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1771 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1772
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1773 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
1774
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1775 String targetVariableName = valueName(targetParameter);
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1776 CodeTree executionExpression = null;
9536
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1777 if ((sourceParameter != null && cast) || sourceParameter != null) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1778 TypeData sourceType = sourceParameter.getTypeSystemType();
9536
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1779 if (targetExecutable == null || !sourceType.needsCastTo(getContext(), targetType)) {
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1780 if (field != null && field.isShortCircuit() && sourceParameter != null) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1781 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
1782 }
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1783 builder.startStatement();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1784 builder.type(targetParameter.getType()).string(" ");
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1785 builder.string(valueName(targetParameter)).string(" = ");
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1786 builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)));
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1787 builder.end();
9536
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1788 continue;
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1789 } else {
9536
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1790 CodeTree valueTree = CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter));
238431ec62a2 Fixed bug in casting execute generation when evaluated parameters for both executed methods were not mapped to a child node.
Christian Humer <christian.humer@gmail.com>
parents: 9356
diff changeset
1791 executionExpression = createExpectExecutableType(sourceNode, sourceType, targetExecutable, valueTree);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1792 }
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1793 } else if (sourceParameter == null) {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1794 executionExpression = createExecuteChildExpression(builder, field, targetParameter, unexpectedParameter);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1795 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1796
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1797 if (executionExpression != null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1798 CodeTreeVariable executionVar = new CodeTreeVariable();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1799 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
1800 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
1801 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
1802
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1803 executionVar.set(unexpectedTree);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1804 builder.tree(shortCircuitTree);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1805 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1806 }
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
1807 return builder.getRoot();
7502
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
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1810 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
1811 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
1812 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
1813 boolean unexpected = targetExecutable.hasUnexpectedValue(getContext());
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1814 boolean cast = false;
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1815 if (targetExecutable.getType().needsCastTo(getContext(), param.getTypeSystemType())) {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1816 unexpected = true;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1817 cast = true;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1818 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1819
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1820 builder.startStatement();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1821
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1822 if (!shortCircuit) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1823 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
1824 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1825
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1826 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
1827 if (!shortCircuit) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1828 builder.end();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1829 }
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1830 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
1831 builder.startStatement();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1832 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
1833 } 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
1834 builder.startStatement();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1835 builder.string(targetVariableName);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1836 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1837 builder.string(" = ");
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1838 if (cast) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1839 builder.tree(createCastType(specialization.getNode(), targetExecutable.getType(), param.getTypeSystemType(), true, body));
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1840 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1841 builder.tree(body);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1842 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1843 builder.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1844
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1845 if (unexpected) {
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1846 builder.end().startCatchBlock(getUnexpectedValueException(), "ex");
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1847 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
1848 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
1849
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1850 List<ActualParameter> genericParameters = generic.getParametersAfter(genericParameter);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1851 builder.tree(createDeoptimize(builder));
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1852 builder.tree(createExecuteChildren(parent, currentExecutable, generic, genericParameters, genericParameter, false));
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
1853 builder.tree(createReturnExecuteAndSpecialize(builder, currentExecutable, specialization.findNextSpecialization(), param,
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
1854 "Expected " + param.getLocalName() + " instanceof " + Utils.getSimpleName(param.getType())));
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1855 builder.end(); // catch block
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1856 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1857
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1858 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1859 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1860
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1861 private CodeTree createExecuteChildExpression(CodeTreeBuilder parent, NodeChildData targetField, ActualParameter sourceParameter, ActualParameter unexpectedParameter) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1862 TypeData type = sourceParameter.getTypeSystemType();
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1863 ExecutableTypeData execType = targetField.findExecutableType(getContext(), type);
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1864
9231
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1865 /*
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1866 * FIXME Temporary deactivated due to partial evaluation failure else if
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1867 * (accessElement.getKind() == ElementKind.METHOD) {
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1868 * builder.startCall(accessElement.getSimpleName().toString()).end(); }
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1869 */
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1870 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
1871 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
1872 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
1873 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
1874 builder.string("this.").string(targetField.getName());
9231
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1875 } 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
1876 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
1877 } else {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1878 throw new AssertionError();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1879 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1880 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
1881 builder.string("[" + sourceParameter.getIndex() + "]");
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1882 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1883 builder.string(".");
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1884 }
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1885
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1886 builder.startCall(execType.getMethodName());
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1887
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1888 int index = 0;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1889 for (ActualParameter parameter : execType.getParameters()) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1890
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1891 if (!parameter.getSpecification().isSignature()) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1892 builder.string(parameter.getLocalName());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1893 } else {
9848
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1894 if (index < targetField.getExecuteWith().size()) {
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1895 NodeChildData child = targetField.getExecuteWith().get(index);
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1896
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1897 ParameterSpec spec = getModel().getSpecification().findParameterSpec(child.getName());
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1898 List<ActualParameter> specializationParams = getModel().findParameters(spec);
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1899
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1900 if (specializationParams.isEmpty()) {
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1901 builder.defaultValue(parameter.getType());
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1902 continue;
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1903 }
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1904
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1905 ActualParameter specializationParam = specializationParams.get(0);
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1906
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1907 TypeData targetType = parameter.getTypeSystemType();
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1908 TypeData sourceType = specializationParam.getTypeSystemType();
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1909 String localName = specializationParam.getLocalName();
9848
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1910
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1911 if (unexpectedParameter != null && unexpectedParameter.getLocalName().equals(specializationParam.getLocalName())) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1912 localName = "ex.getResult()";
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1913 sourceType = getModel().getNode().getTypeSystem().getGenericTypeData();
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1914 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1915
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1916 CodeTree value = CodeTreeBuilder.singleString(localName);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1917
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1918 if (sourceType.needsCastTo(getContext(), targetType)) {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1919 value = createCallTypeSystemMethod(getContext(), builder, getModel().getNode(), TypeSystemCodeGenerator.asTypeMethodName(targetType), value);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1920 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1921 builder.tree(value);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1922 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1923 builder.defaultValue(parameter.getType());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1924 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1925 index++;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1926 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1927 }
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1928
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1929 builder.end();
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1930
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1931 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1932 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1933
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1934 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
1935 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
1936 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
1937
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
1938 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
1939 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
1940 return body;
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1941 }
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1942
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1943 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
1944 return body;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1945 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1946
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1947 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
1948
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1949 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
1950
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1951 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
1952 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
1953 builder.startBlock();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1954 builder.tree(body);
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1955 builder.end();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1956
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1957 return builder.getRoot();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1958 }
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1959
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1960 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
1961 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
1962 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
1963 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
1964 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
1965 if (field == forField) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1966 break;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1967 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1968 shortCircuitIndex++;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1969 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1970 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1971
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1972 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
1973 ShortCircuitData shortCircuitData = specialization.getShortCircuits().get(shortCircuitIndex);
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1974 builder.tree(createTemplateMethodCall(builder, null, 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
1975 builder.end(); // statement
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1976
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1977 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1978 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1979
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
1980 private CodeTree createReturnExecuteAndSpecialize(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData nextSpecialization, ActualParameter exceptionParam, String reason) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1981
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1982 SpecializationData generic = nextSpecialization.getNode().getGenericSpecialization();
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
1983 CodeTreeBuilder specializeCall = new CodeTreeBuilder(parent);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1984 specializeCall.startCall(EXECUTE_SPECIALIZE_NAME);
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1985 specializeCall.string(nodeSpecializationClassName(nextSpecialization) + ".class");
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1986 addInternalValueParameterNames(specializeCall, generic, nextSpecialization.getNode().getGenericSpecialization(), exceptionParam != null ? exceptionParam.getLocalName() : null, true, true);
9796
d6d5e3dc2713 Implemented generation of a proper rewrite reason for generated nodes.
Christian Humer <christian.humer@gmail.com>
parents: 9781
diff changeset
1987 specializeCall.doubleQuote(reason);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1988 specializeCall.end().end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1989
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
1990 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1991
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1992 builder.startReturn();
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1993 builder.tree(createExpectExecutableType(nextSpecialization.getNode(), generic.getReturnSignature(), executable, specializeCall.getRoot()));
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1994 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
1995
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
1996 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1997 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1998
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1999 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2000
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2001 }