annotate graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/NodeCodeGenerator.java @ 10596:f43eb2f1bbbc

Truffle-DSL: code-generation of polymorphic caching
author Christian Humer <christian.humer@gmail.com>
date Mon, 01 Jul 2013 20:32:20 +0200
parents 00b70a864d3b
children
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.*;
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
35 import com.oracle.truffle.api.nodes.NodeInfo.Kind;
7502
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.*;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
37 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
38 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
39 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
40 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
41 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
42
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
43 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
44
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
45 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
46
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
47 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
48 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
49
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
50 public NodeCodeGenerator(ProcessorContext context) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
51 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
52 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
53
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
54 private TypeMirror getUnexpectedValueException() {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
55 return getContext().getTruffleTypes().getUnexpectedValueException();
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
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
58 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
59 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
60 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
61
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
62 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
63 String nodeid = specialization.getNode().getNodeId();
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
64 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
65 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
66 }
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
67
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
68 String name = Utils.firstLetterUpperCase(nodeid);
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
69 name += Utils.firstLetterUpperCase(specialization.getId());
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
70 name += "Node";
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
71 return name;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
72 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
73
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
74 private static String nodePolymorphicClassName(NodeData node, SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
75 String nodeid = node.getNodeId();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
76 if (nodeid.endsWith("Node") && !nodeid.equals("Node")) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
77 nodeid = nodeid.substring(0, nodeid.length() - 4);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
78 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
79
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
80 String name = Utils.firstLetterUpperCase(nodeid);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
81 int index = specialization == null ? 0 : node.getPolymorphicSpecializations().indexOf(specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
82 if (index == 0) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
83 name += "PolymorphicNode";
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
84 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
85 name += "Polymorphic" + index + "Node";
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
86 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
87 return name;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
88 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
89
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
90 private static String valueNameEvaluated(ActualParameter targetParameter) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
91 return valueName(targetParameter) + "Evaluated";
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
92 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
93
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
94 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
95 return param.getLocalName();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
96 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
97
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
98 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
99 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
100 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
101
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
102 private void addInternalValueParameters(CodeExecutableElement method, TemplateMethod specialization, boolean forceFrame, boolean evaluated) {
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 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
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 }
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
111 if (spec.isLocal()) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
112 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
113 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
114
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
115 String name = valueName(parameter);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
116 if (evaluated && spec.isSignature()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
117 name = valueNameEvaluated(parameter);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
118 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
119
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
120 method.addParameter(new CodeVariableElement(parameter.getType(), name));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
121 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
122 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
123
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
124 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
125 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
126 builder.string("frameValue");
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 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
129 ParameterSpec spec = parameter.getSpecification();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
130 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
131 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
132 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
133
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
134 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
135 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
136 }
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
137 if (parameter.getSpecification().isLocal()) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
138 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
139 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
140
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
141 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
142
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
143 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
144 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
145 } 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
146 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
147 } 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
148 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
149 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
150 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
151 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
152
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
153 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
154 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
155 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
156 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
157 } 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
158 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
159 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
160 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
161 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
162 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
163 } else {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
164 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
165 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
166 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
167
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
168 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
169 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
170 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
171
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
172 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
173
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
174 builder.startGroup();
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
175 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
176 if (method == null) {
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
177 throw new UnsupportedOperationException();
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
178 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
179 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
180 NodeData node = (NodeData) targetMethod.getTemplate();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
181
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
182 if (target == null) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
183 boolean accessible = targetMethod.canBeAccessedByInstanceOf(getContext(), node.getNodeType());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
184 if (accessible) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
185 if (builder.findMethod().getModifiers().contains(STATIC)) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
186 if (method.getModifiers().contains(STATIC)) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
187 builder.type(targetClass.asType());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
188 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
189 builder.string(THIS_NODE_LOCAL_VAR_NAME);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
190 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
191 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
192 if (targetMethod instanceof ExecutableTypeData) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
193 builder.string("this");
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
194 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
195 builder.string("super");
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
196 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
197 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
198 } else {
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
199 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
200 builder.type(targetClass.asType());
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
201 } else {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
202 ActualParameter parameter = null;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
203 for (ActualParameter searchParameter : targetMethod.getParameters()) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
204 if (searchParameter.getSpecification().isSignature()) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
205 parameter = searchParameter;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
206 break;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
207 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
208 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
209 ActualParameter sourceParameter = sourceMethod.findParameter(parameter.getLocalName());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
210 assert parameter != null;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
211
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
212 if (castedValues && sourceParameter != null) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
213 builder.string(valueName(sourceParameter, parameter));
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
214 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
215 builder.string(valueName(parameter));
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
216 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
217 }
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
218 }
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
219 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
220 } else {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
221 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
222 }
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
223 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
224
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
225 int signatureIndex = 0;
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
226
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
227 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
228 ActualParameter valueParameter = null;
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
229 if (sourceMethod != null) {
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
230 valueParameter = sourceMethod.findParameter(targetParameter.getLocalName());
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
231 }
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
232 if (valueParameter == null) {
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
233 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
234 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
235 TypeData targetType = targetParameter.getTypeSystemType();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
236
8310
89006c76f737 Final fields of base node can be optionally passed to builtin specialization method. And a few fixes.
Christian Humer <christian.humer@gmail.com>
parents: 8277
diff changeset
237 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
238 continue;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
239 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
240
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
241 TypeData valueType = null;
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
242 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
243 valueType = valueParameter.getTypeSystemType();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
244 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
245
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
246 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
247 builder.string(customSignatureValueNames[signatureIndex]);
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
248 signatureIndex++;
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
249 } 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
250 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
251 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
252 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
253 } 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
254 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
255 }
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
256 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
257 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
258 } 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
259 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
260 } 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
261 builder.startGroup();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
262
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
263 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
264 builder.string("(");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
265 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
266 builder.string(") ");
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
267 }
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
268 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
269 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
270 } 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
271 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
272 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
273 }
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
274
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
275 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
276
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
277 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
278 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
279
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
280 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
281 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
282 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
283 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
284 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
285 String name = Utils.firstLetterUpperCase(nodeid);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
286 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
287 return name;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
288 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
289
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
290 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
291 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
292 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
293 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
294 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
295 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
296 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
297
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7502
diff changeset
298 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
299 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
300 assert singleton != null;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
301
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
302 body.startGroup();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
303 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
304 body.string(".").startCall(methodName);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
305 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
306
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
307 private CodeTree createGuardAndCast(CodeTreeBuilder parent, String conditionPrefix, SpecializationData sourceSpecialization, SpecializationData targetSpecialization, boolean castValues,
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
308 CodeTree guardedStatements, CodeTree elseStatements, boolean emitAssumptions, boolean forceElse) {
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
309
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
310 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
311 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
312 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
313 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
314
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
315 Set<String> valuesNeedsCast;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
316 if (castValues) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
317 // cast all
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
318 valuesNeedsCast = null;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
319 } else {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
320 // 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
321 valuesNeedsCast = new HashSet<>();
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
322 for (GuardData guard : targetSpecialization.getGuards()) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
323 for (ActualParameter targetParameter : guard.getParameters()) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
324 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
325 if (field == null) {
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
326 continue;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
327 }
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
328 TypeData targetType = targetParameter.getTypeSystemType();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
329 ActualParameter sourceParameter = sourceSpecialization.findParameter(targetParameter.getLocalName());
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
330 if (sourceParameter == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
331 sourceParameter = targetParameter;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
332 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
333 TypeData sourceType = sourceParameter.getTypeSystemType();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
334
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
335 if (sourceType.needsCastTo(getContext(), targetType)) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
336 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
337 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
338 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
339 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
340 }
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
341
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
342 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
343
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 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
345 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
346 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
347 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
348 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
349 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
350 }
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
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
352 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
353
7846
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
354 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
355 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
356 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
357 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
358 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
359 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
360 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
361
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
362 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
363 builder.startIf();
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
364 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
365 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
366 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
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
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
369 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
370
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
371 builder.end(ifCount);
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
372 if (elseStatements != null && (forceElse || 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
373 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
374 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
375 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
376 }
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
377
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
378 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
379 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
380 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
381 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
382 // Explicitly specified guards
8592
a80bf36c6a1e Refactor to shared template method signature comparison.
Christian Humer <christian.humer@gmail.com>
parents: 8361
diff changeset
383 for (GuardData guard : guardedSpecialization.getGuards()) {
a80bf36c6a1e Refactor to shared template method signature comparison.
Christian Humer <christian.humer@gmail.com>
parents: 8361
diff changeset
384 builder.string(andOperator);
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
385 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
386 andOperator = " && ";
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
387 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
388 }
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
389
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
390 return builder.isEmpty() ? null : builder.getRoot();
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
391 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
392
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
393 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
394 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
395 // 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
396 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
397 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
398 if (field == null) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
399 continue;
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
400 }
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
401 ActualParameter valueParam = valueSpecialization.findParameter(guardedParam.getLocalName());
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
402
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
403 if (valueParam == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
404 /*
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
405 * 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
406 * 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
407 */
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
408 valueParam = guardedParam;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
409 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
410
8595
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
411 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
412 continue;
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
413 }
8a1115c92271 Implemented codegen guard definitions can now omit unused parameters.
Christian Humer <christian.humer@gmail.com>
parents: 8592
diff changeset
414
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
415 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
416 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
417 continue;
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
418 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
419 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
420 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
421
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
422 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
423 }
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
424
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
425 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
426 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
427 // 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
428 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
429
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
430 if (emitAssumptions) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
431 for (String assumption : guardedSpecialization.getAssumptions()) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
432 builder.string(andOperator);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
433 builder.string("this");
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
434 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
435 andOperator = " && ";
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
436 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
437 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
438
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
439 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
440 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
441 if (field == null) {
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
442 continue;
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
443 }
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
444 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
445
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
446 if (valueParam == null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
447 /*
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
448 * 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
449 * 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
450 */
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
451 valueParam = guardedParam;
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
452 }
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
453
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
454 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
455 if (implicitGuard == null) {
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
456 continue;
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
457 }
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
458
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
459 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
460 builder.tree(implicitGuard);
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
461 andOperator = " && ";
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
462 }
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
463
91cc98eae8ee Refactor guard creation methods are not flexible enough to handle two if guards.
Christian Humer <christian.humer@gmail.com>
parents: 7845
diff changeset
464 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
465 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
466
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
467 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
468 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
469 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
470
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
471 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
472 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
473
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
474 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
475 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
476 }
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 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
479
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
480 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
481 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
482 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
483 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
484 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
485 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
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
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
488 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
489 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
490 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
491
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
492 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
493 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
494 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
495
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
496 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
497
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
498 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
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
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
501 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
502 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
503 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
504 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
505
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
506 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
507 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
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
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
510 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
511 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
512 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
513 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
514 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
515 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
516
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
517 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
518
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
519 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
520 }
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 /**
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
523 * <pre>
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
524 * 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
525 *
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
526 * $type $name = 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
527 * 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
528 * $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
529 * }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
530 *
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
531 * 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
532 * $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
533 * </pre>
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
534 *
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
535 * .
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
536 */
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
537 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
538 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
539 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
540 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
541 } else {
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
542 builder.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
543
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
544 builder.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
545 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
546 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
547 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
548 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
549 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
550 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
551 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
552 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
553 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
554 }
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
555
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
556 protected void emitEncounteredSynthetic(CodeTreeBuilder builder, TemplateMethod current) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
557 builder.startThrow().startNew(getContext().getType(UnsupportedOperationException.class));
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
558 builder.startCall("createInfo0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
559 builder.doubleQuote("Unsupported values");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
560 addInternalValueParameterNames(builder, current, current, null, false, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
561 builder.end().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
562 }
cb70ed101b5f Added automatic generation of generic specialization which throws unsupported operation if reached.
Christian Humer <christian.humer@gmail.com>
parents: 8248
diff changeset
563
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
564 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
565 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
566 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
567 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
568 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
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 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
571 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
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 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
574 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
575
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
576 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
577 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
578 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
579
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
580 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
581 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
582
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
583 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
584 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
585 if (constructor.getModifiers().contains(PRIVATE)) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
586 continue;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
587 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
588 if (isCopyConstructor(constructor)) {
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
589 return constructor;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
590 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
591 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
592
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
593 return null;
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
594 }
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
595
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
596 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
597 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
598 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
599 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
600 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
601 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
602
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
603 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
604 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
605 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
606 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
607 }
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
608
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
609 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
610 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
611 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
612 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
613 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
614 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
615 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
616 }
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
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
619 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
620 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
621 }
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 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
625
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
626 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
627
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
628 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
629
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
630 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
631 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
632 this.childTypes = childElements;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
633 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
634
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
635 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
636 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
637 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
638 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
639 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
640 clazz.getModifiers().add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
641 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
642 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
643 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
644 return clazz;
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
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
647 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
648 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
649 CodeTypeElement clazz = getElement();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
650
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
651 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
652
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
653 if (node.needsFactory()) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
654 NodeBaseFactory factory = new NodeBaseFactory(context);
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
655 add(factory, node.getGenericSpecialization() == null ? node.getSpecializations().get(0) : node.getGenericSpecialization());
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
656 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
657
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
658 if (node.needsRewrites(context)) {
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
659 clazz.add(createCreateGenericMethod(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
660 }
7777
ca51efac4d57 Fixed rewrite in generated generic did not invoke guards.
Christian Humer <christian.humer@gmail.com>
parents: 7751
diff changeset
661
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
662 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
663
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
664 PolymorphicNodeFactory generic = null;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
665 for (SpecializationData specialization : node.getPolymorphicSpecializations()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
666 PolymorphicNodeFactory polymorphicFactory = new PolymorphicNodeFactory(context, generic == null ? generatedNode : generic.getElement(), generic == null);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
667 add(polymorphicFactory, specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
668 if (generic == null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
669 generic = polymorphicFactory;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
670 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
671 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
672
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
673 for (SpecializationData specialization : node.getSpecializations()) {
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
674 if (!specialization.isReachable()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
675 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
676 }
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
677 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
678 }
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
679
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 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
681 clazz.getImplements().add(nodeFactory);
7859
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
682 clazz.add(createCreateNodeMethod(node));
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
683 clazz.add(createCreateNodeGenericMethod(node));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
684 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
685 clazz.add(createGetNodeSignaturesMethod());
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
686 clazz.add(createGetChildrenSignatureMethod(node));
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
687 clazz.add(createGetInstanceMethod(node, createVisibility));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
688 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
689 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
690
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
691 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
692 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
693 continue;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
694 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
695
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
696 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
697 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
698 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
699 typeModifiers.clear();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
700 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
701 typeModifiers.add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
702 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
703
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
704 typeModifiers.add(Modifier.STATIC);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
705 typeModifiers.add(Modifier.FINAL);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
706 clazz.add(type);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
707 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
708 }
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
709
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 List<NodeData> children = node.getNodeDeclaringChildren();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
711 if (node.getParent() == null && children.size() > 0) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
712 clazz.add(createGetFactories(node));
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
713 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
714
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
715 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
716
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
717 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
718 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
719 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
720 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
721 builder.startReturn().typeLiteral(node.getNodeType()).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
722 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
723 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
724
9220
97ad6d3e7557 Codegen API changes. Executed child nodes are now defined using @NodeChildren instead of fields.
Christian Humer <christian.humer@gmail.com>
parents: 9218
diff changeset
725 private CodeExecutableElement createGetNodeSignaturesMethod() {
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
726 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
727 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
728 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
729 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
730 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
731 builder.startReturn();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
732 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
733 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
734 for (ExecutableElement constructor : constructors) {
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
735 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
736 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
737 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
738 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
739 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
740 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
741
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
742 private CodeExecutableElement createGetChildrenSignatureMethod(NodeData node) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
743 Types types = getContext().getEnvironment().getTypeUtils();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
744 TypeElement listType = Utils.fromTypeMirror(getContext().getType(List.class));
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
745 TypeMirror classType = getContext().getType(Class.class);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
746 TypeMirror nodeType = getContext().getTruffleTypes().getNode();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
747 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
748 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
749 TypeMirror returnType = Utils.getDeclaredType(listType, classType);
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
750
8252
0905d796944a Refactored codegen error model to make error redirection a lot easier.
Christian Humer <christian.humer@gmail.com>
parents: 8251
diff changeset
751 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
752 CodeTreeBuilder builder = method.createBuilder();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
753
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
754 List<TypeMirror> signatureTypes = new ArrayList<>();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
755 assert !node.getSpecializations().isEmpty();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
756 SpecializationData data = node.getSpecializations().get(0);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
757 for (ActualParameter parameter : data.getParameters()) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
758 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
759 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
760 if (field == null) {
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
761 continue;
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
762 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
763
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
764 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
765 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
766 type = ((ArrayType) field.getNodeType()).getComponentType();
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
767 } 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
768 type = field.getNodeType();
8248
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
769 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
770
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
771 signatureTypes.add(type);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
772 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
773
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
774 builder.startReturn().tree(createAsList(builder, signatureTypes, classType)).end();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
775 return method;
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
776 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
777
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
778 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
779 CodeTreeBuilder builder = parent.create();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
780 builder.startGroup();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
781 builder.type(getContext().getType(Arrays.class));
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
782 builder.string(".<").type(elementClass).string(">");
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
783 builder.startCall("asList");
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
784 for (TypeMirror typeMirror : types) {
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
785 builder.typeLiteral(typeMirror);
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
786 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
787 builder.end().end();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
788 return builder.getRoot();
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
789 }
c4c3f50fa9c2 Fixes for codegen builtins support.
Christian Humer <christian.humer@gmail.com>
parents: 8245
diff changeset
790
7859
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
791 private CodeExecutableElement createCreateNodeMethod(NodeData node) {
3c68170fc9b0 Fixed a visibility bug in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7858
diff changeset
792 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
793 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
794 method.setVarArgs(true);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
795 method.addParameter(arguments);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
796
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
797 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
798 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
799 boolean ifStarted = false;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
800
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
801 for (ExecutableElement element : signatures) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
802 ifStarted = builder.startIf(ifStarted);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
803 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
804
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
805 int index = 0;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
806 for (VariableElement param : element.getParameters()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
807 builder.string(" && ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
808 if (!param.asType().getKind().isPrimitive()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
809 builder.string("(arguments[" + index + "] == null || ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
810 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
811 builder.string("arguments[" + index + "] instanceof ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
812 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
813 if (!param.asType().getKind().isPrimitive()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
814 builder.string(")");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
815 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
816 index++;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
817 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
818 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
819 builder.startBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
820
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
821 builder.startReturn().startCall("create");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
822 index = 0;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
823 for (VariableElement param : element.getParameters()) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
824 builder.startGroup();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
825 builder.string("(").type(param.asType()).string(") ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
826 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
827 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
828 index++;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
829 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
830 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
831
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
832 builder.end(); // block
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
833 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
834
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
835 builder.startElseBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
836 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
837 builder.doubleQuote("Invalid create signature.");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
838 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
839 builder.end(); // else block
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
840 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
841 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
842
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
843 private CodeExecutableElement createCreateNodeGenericMethod(NodeData node) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
844 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), node.getNodeType(), "createNodeGeneric");
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
845 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
846 method.addParameter(nodeParam);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
847
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
848 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
849 if (!node.needsRewrites(getContext())) {
10446
746fa60be266 Implemented CreateCast annotation for easier insertion of casts.
Christian Humer <christian.humer@gmail.com>
parents: 9848
diff changeset
850 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
851 } else {
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
852 builder.startReturn().startCall("createGeneric");
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
853 builder.string(THIS_NODE_LOCAL_VAR_NAME);
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
854 builder.end().end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
855 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
856 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
857 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
858
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
859 private ExecutableElement createGetInstanceMethod(NodeData node, Modifier visibility) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
860 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
861 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
862
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
863 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
864 if (visibility != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
865 method.getModifiers().add(visibility);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
866 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
867 method.getModifiers().add(Modifier.STATIC);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
868
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
869 String varName = instanceVarName(node);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
870
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
871 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
872 builder.startIf();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
873 builder.string(varName).string(" == null");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
874 builder.end().startBlock();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
875
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
876 builder.startStatement();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
877 builder.string(varName);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
878 builder.string(" = ");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
879 builder.startNew(factoryClassName(node)).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
880 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
881
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
882 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
883 builder.startReturn().string(varName).end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
884 return method;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
885 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
886
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
887 private String instanceVarName(NodeData node) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
888 if (node.getParent() != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
889 return Utils.firstLetterLowerCase(factoryClassName(node)) + "Instance";
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
890 } else {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
891 return "instance";
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
892 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
893 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
894
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
895 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
896 String varName = instanceVarName(node);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
897 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
898 var.getModifiers().add(Modifier.PRIVATE);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
899 var.getModifiers().add(Modifier.STATIC);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
900 return var;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
901 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
902
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
903 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
904 List<NodeData> children = node.getNodeDeclaringChildren();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
905 if (node.needsFactory()) {
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
906 children.add(node);
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
907 }
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
908
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
909 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
910 TypeMirror prev = null;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
911 boolean allSame = true;
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
912 for (NodeData child : children) {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
913 nodeTypesList.add(child.getNodeType());
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
914 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
915 allSame = false;
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
916 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
917 prev = child.getNodeType();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
918 }
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
919 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
920
7855
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
921 Types types = getContext().getEnvironment().getTypeUtils();
7858
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
922 TypeMirror factoryType = getContext().getType(NodeFactory.class);
4958cbdbf360 Fixed minor bugs in NodeFactory generation.
Christian Humer <christian.humer@gmail.com>
parents: 7855
diff changeset
923 TypeMirror baseType;
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
924 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
925 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
926 } 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
927 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
928 }
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
929 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
930
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
931 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
932
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
933 CodeTreeBuilder builder = method.createBuilder();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
934 builder.startReturn();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
935 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
936
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
937 for (NodeData child : children) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
938 builder.startGroup();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
939 NodeData childNode = child;
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
940 List<NodeData> factories = new ArrayList<>();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
941 while (childNode.getParent() != null) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
942 factories.add(childNode);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
943 childNode = childNode.getParent();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
944 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
945 Collections.reverse(factories);
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
946 for (NodeData nodeData : factories) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
947 builder.string(factoryClassName(nodeData)).string(".");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
948 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
949 builder.string("getInstance()");
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
950 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
951 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
952 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
953 builder.end();
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
954 return method;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
955 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
956
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
957 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
958 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
959 for (ExecutableElement constructor : constructors) {
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
960 clazz.add(createCreateMethod(node, createVisibility, constructor));
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
961 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
962 }
6e4fb0ccebb1 Generated factories implement the new NodeFactory interface.
Christian Humer <christian.humer@gmail.com>
parents: 7847
diff changeset
963
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
964 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
965 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
966 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
967 method.getModifiers().clear();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
968 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
969 method.getModifiers().add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
970 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
971 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
972 method.setReturnType(node.getNodeType());
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
973
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
974 CodeTreeBuilder body = method.createBuilder();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
975 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
976 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
977 body.nullLiteral();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
978 } else {
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
979 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
980 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
981 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
982 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
983 body.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
984 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
985 body.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
986 return method;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
987 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
988
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
989 private CodeExecutableElement createCreateGenericMethod(NodeData node, Modifier visibility) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
990 CodeExecutableElement method = new CodeExecutableElement(modifiers(), node.getNodeType(), "createGeneric");
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
991 if (visibility != null) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
992 method.getModifiers().add(visibility);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
993 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
994 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
995 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
996
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
997 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
998
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
999 SpecializationData found = null;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1000 List<SpecializationData> specializations = node.getSpecializations();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1001 for (int i = 0; i < specializations.size(); i++) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1002 if (specializations.get(i).isReachable()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1003 found = specializations.get(i);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1004 }
9279
2a4b57f02fb4 Implemented basic support for assumptions for sourcecode generation.
Christian Humer <christian.humer@gmail.com>
parents: 9272
diff changeset
1005 }
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
1006
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1007 if (found == null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1008 body.startThrow().startNew(getContext().getType(UnsupportedOperationException.class)).end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1009 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1010 body.startReturn().startNew(nodeSpecializationClassName(found)).startGroup().cast(baseClassName(node)).string(THIS_NODE_LOCAL_VAR_NAME).end().end().end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1011 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1012 return method;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1013 }
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
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1016 private class NodeBaseFactory extends ClassElementFactory<SpecializationData> {
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
1017
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1018 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
1019 super(context);
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1020 }
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 @Override
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1023 protected CodeTypeElement create(SpecializationData specialization) {
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1024 NodeData node = specialization.getNode();
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1025 CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, ABSTRACT, STATIC), baseClassName(node), node.getNodeType(), false);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1026
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1027 for (NodeChildData child : node.getChildren()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1028 clazz.add(createChildField(child));
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
1029
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1030 if (child.getAccessElement() != null && child.getAccessElement().getModifiers().contains(Modifier.ABSTRACT)) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1031 ExecutableElement getter = (ExecutableElement) child.getAccessElement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1032 CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), getter);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1033 method.getModifiers().remove(Modifier.ABSTRACT);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1034 method.createBuilder().startReturn().string("this.").string(child.getName()).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1035 clazz.add(method);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1036 }
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
1037 }
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1038
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1039 for (String assumption : node.getAssumptions()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1040 clazz.add(createAssumptionField(assumption));
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
1041 }
0e4db5ee0695 Added support for the kind field in @NodeInfo for the source code generation.
Christian Humer <christian.humer@gmail.com>
parents: 9536
diff changeset
1042
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1043 createConstructors(node, clazz);
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
1044
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1045 return clazz;
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
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1048 protected String typeGetterName(ActualParameter parameter) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1049 return "get" + Utils.firstLetterUpperCase(parameter.getLocalName()) + "Type";
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1050 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1051
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1052 @Override
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1053 protected void createChildren(SpecializationData specialization) {
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1054 NodeData node = specialization.getNode();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1055 CodeTypeElement clazz = getElement();
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1056
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1057 if (node.needsRewrites(context)) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1058
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1059 if (node.getPolymorphicDepth() > 1) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1060
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1061 CodeVariableElement var = new CodeVariableElement(modifiers(PROTECTED), clazz.asType(), "next0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1062 var.getAnnotationMirrors().add(new CodeAnnotationMirror(getContext().getTruffleTypes().getChildAnnotation()));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1063 clazz.add(var);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1064
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1065 CodeExecutableElement setter = new CodeExecutableElement(modifiers(PROTECTED), context.getType(void.class), "setNext0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1066 setter.getParameters().add(new CodeVariableElement(clazz.asType(), "next0"));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1067 CodeTreeBuilder builder = setter.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1068 builder.statement("this.next0 = adoptChild(next0)");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1069 clazz.add(setter);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1070
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1071 createTypeGetters(clazz, node.getGenericSpecialization());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1072
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1073 clazz.add(createCreateSpecialization(node));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1074
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1075 CodeExecutableElement genericCachedExecute = null;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1076 for (SpecializationData polymorph : node.getPolymorphicSpecializations()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1077 CodeExecutableElement cachedExecute = createCachedExecute(node, polymorph, genericCachedExecute);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1078 clazz.add(cachedExecute);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1079 if (genericCachedExecute == null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1080 genericCachedExecute = cachedExecute;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1081 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1082 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1083 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1084
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1085 clazz.add(createGenericExecuteAndSpecialize(node));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1086 clazz.add(createInfoMessage(node));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1087 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1088
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1089 if (node.getGenericSpecialization() != null && node.getGenericSpecialization().isReachable()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1090 clazz.add(createGenericExecute(node));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1091 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1092 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1093
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1094 private Element createInfoMessage(NodeData node) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1095 CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED, STATIC), getContext().getType(String.class), "createInfo0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1096 method.addParameter(new CodeVariableElement(getContext().getType(String.class), "message"));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1097 addInternalValueParameters(method, node.getGenericSpecialization(), false, false);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1098
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1099 CodeTreeBuilder builder = method.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1100 builder.startStatement().string("StringBuilder builder = new StringBuilder(message)").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1101 builder.startStatement().startCall("builder", "append").doubleQuote(" (").end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1102
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1103 String sep = null;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1104 for (ActualParameter parameter : node.getGenericSpecialization().getParameters()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1105 if (!parameter.getSpecification().isSignature()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1106 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1107 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1108
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1109 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1110 builder.string("builder");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1111 if (sep != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1112 builder.startCall(".append").doubleQuote(sep).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1113 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1114 builder.startCall(".append").doubleQuote(parameter.getLocalName()).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1115 builder.startCall(".append").doubleQuote(" = ").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1116 builder.startCall(".append").string(parameter.getLocalName()).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1117 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1118
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1119 if (!Utils.isPrimitive(parameter.getType())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1120 builder.startIf().string(parameter.getLocalName() + " != null").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1121 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1122 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1123 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1124 if (Utils.isPrimitive(parameter.getType())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1125 builder.startCall("builder.append").doubleQuote(" (" + Utils.getSimpleName(parameter.getType()) + ")").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1126 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1127 builder.startCall("builder.append").doubleQuote(" (").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1128 builder.startCall(".append").string(parameter.getLocalName() + ".getClass().getSimpleName()").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1129 builder.startCall(".append").doubleQuote(")").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1130 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1131 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1132 if (!Utils.isPrimitive(parameter.getType())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1133 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1134 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1135
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1136 sep = ", ";
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1137 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1138
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1139 builder.startStatement().startCall("builder", "append").doubleQuote(")").end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1140
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1141 builder.startReturn().string("builder.toString()").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1142
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1143 return method;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1144 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1145
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1146 protected void createTypeGetters(CodeTypeElement clazz, SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1147 for (ActualParameter parameter : specialization.getReturnTypeAndParameters()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1148 if (!parameter.getSpecification().isSignature()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1149 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1150 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1151 CodeExecutableElement typeGetter = new CodeExecutableElement(modifiers(PROTECTED), context.getType(Class.class), typeGetterName(parameter));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1152 CodeTreeBuilder builder = typeGetter.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1153 builder.startReturn().typeLiteral(parameter.getType()).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1154 clazz.add(typeGetter);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1155 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1156 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1157
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1158 private CodeExecutableElement createCachedExecute(NodeData node, SpecializationData polymorph, CodeExecutableElement genericPolymorphMethod) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1159 int index = node.getPolymorphicSpecializations().indexOf(polymorph);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1160 assert index != -1;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1161 boolean generic = index == 0;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1162
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1163 String name = "executeCached" + index;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1164 CodeExecutableElement cachedExecute = new CodeExecutableElement(modifiers(PROTECTED), polymorph.getReturnType().getType(), name);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1165 addInternalValueParameters(cachedExecute, polymorph, true, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1166
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1167 if (generic) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1168 cachedExecute.getModifiers().add(ABSTRACT);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1169 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1170 SpecializationData genericPolymorph = node.getPolymorphicSpecializations().get(0);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1171 CodeTreeBuilder builder = cachedExecute.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1172 ExecutableTypeData genericExecutable = new ExecutableTypeData(genericPolymorph, genericPolymorphMethod, node.getTypeSystem(), genericPolymorph.getReturnType().getTypeSystemType());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1173 ExecutableTypeData specificExecutable = new ExecutableTypeData(polymorph, cachedExecute, node.getTypeSystem(), polymorph.getReturnType().getTypeSystemType());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1174 builder.tree(createCastingExecute(builder, polymorph, specificExecutable, genericExecutable));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1175 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1176
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1177 return cachedExecute;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1178
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1179 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1180
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1181 private CodeExecutableElement createCreateSpecialization(NodeData node) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1182 CodeExecutableElement method = new CodeExecutableElement(modifiers(PRIVATE), getElement().asType(), "createSpezialization0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1183 method.getParameters().add(new CodeVariableElement(context.getType(Class.class), "clazz"));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1184 CodeTreeBuilder builder = method.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1185
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1186 builder.startStatement().type(getElement().asType()).string(" node").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1187
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1188 boolean elseIf = false;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1189 for (SpecializationData specialization : node.getSpecializations()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1190 if (specialization.isGeneric() || specialization.isUninitialized()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1191 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1192 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1193
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1194 elseIf = builder.startIf(elseIf);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1195 builder.startGroup().string("clazz == ").string(nodeSpecializationClassName(specialization)).string(".class").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1196 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1197 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1198 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1199 builder.string("node = ");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1200 builder.startNew(nodeSpecializationClassName(specialization)).string("this").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1201 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1202 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1203 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1204
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1205 builder.startElseBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1206 builder.startThrow().startNew(context.getType(AssertionError.class)).end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1207 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1208
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1209 builder.startStatement().startCall("node", "setNext0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1210 builder.startNew(nodeSpecializationClassName(node.getUninitializedSpecialization())).string("this").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1211 builder.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1212
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1213 builder.startReturn().string("node").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1214
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1215 return method;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1216 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1217
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1218 private void createConstructors(NodeData node, CodeTypeElement clazz) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1219 List<ExecutableElement> constructors = findUserConstructors(node.getNodeType());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1220 if (constructors.isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1221 clazz.add(createUserConstructor(clazz, null));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1222 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1223 for (ExecutableElement constructor : constructors) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1224 clazz.add(createUserConstructor(clazz, constructor));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1225 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1226 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1227 if (node.needsRewrites(getContext())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1228 clazz.add(createCopyConstructor(clazz, findCopyConstructor(node.getNodeType())));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1229 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1230 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1231
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1232 private CodeExecutableElement createUserConstructor(CodeTypeElement type, ExecutableElement superConstructor) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1233 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1234 CodeTreeBuilder builder = method.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1235
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1236 NodeData node = getModel().getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1237
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1238 if (superConstructor != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1239 for (VariableElement param : superConstructor.getParameters()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1240 method.getParameters().add(CodeVariableElement.clone(param));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1241 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1242 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1243
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1244 for (VariableElement var : type.getFields()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1245 NodeChildData child = node.findChild(var.getSimpleName().toString());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1246 if (child != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1247 method.getParameters().add(new CodeVariableElement(child.getOriginalType(), child.getName()));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1248 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1249 method.getParameters().add(new CodeVariableElement(var.asType(), var.getSimpleName().toString()));
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1250 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1251 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1252
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1253 if (superConstructor != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1254 builder.startStatement().startSuperCall();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1255 for (VariableElement param : superConstructor.getParameters()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1256 builder.string(param.getSimpleName().toString());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1257 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1258 builder.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1259 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1260
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1261 for (VariableElement var : type.getFields()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1262 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1263 String fieldName = var.getSimpleName().toString();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1264
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1265 CodeTree fieldInit = CodeTreeBuilder.singleString(var.getSimpleName().toString());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1266 builder.string("this.").string(var.getSimpleName().toString());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1267
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1268 NodeChildData child = node.findChild(fieldName);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1269 if (child != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1270 CreateCastData createCast = node.findCast(child.getName());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1271 if (createCast != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1272 fieldInit = createTemplateMethodCall(builder, null, node.getGenericSpecialization(), createCast, null, child.getName());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1273 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1274 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1275
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1276 if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNode())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1277 builder.string(" = adoptChild(").tree(fieldInit).string(")");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1278 } else if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNodeArray())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1279 builder.string(" = adoptChildren(").tree(fieldInit).string(")");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1280 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1281 builder.string(" = ").tree(fieldInit);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1282 }
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1283 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1284 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1285 return method;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1286 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1287
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1288 private CodeExecutableElement createCopyConstructor(CodeTypeElement type, ExecutableElement superConstructor) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1289 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1290 CodeTreeBuilder builder = method.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1291 if (!(superConstructor == null && type.getFields().isEmpty())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1292 method.getParameters().add(new CodeVariableElement(type.asType(), "copy"));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1293 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1294
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1295 if (superConstructor != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1296 builder.startStatement().startSuperCall().string("copy").end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1297 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1298
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1299 for (VariableElement var : type.getFields()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1300 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1301 String varName = var.getSimpleName().toString();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1302 builder.string("this.").string(varName);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1303 if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNode())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1304 builder.string(" = adoptChild(copy.").string(varName).string(")");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1305 } else if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNodeArray())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1306 builder.string(" = adoptChildren(copy.").string(varName).string(")");
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1307 } else {
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1308 builder.string(" = copy.").string(varName);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1309 }
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1310 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1311 }
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1312 if (getModel().getNode().getPolymorphicDepth() > 1) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1313 builder.statement("this.next0 = adoptChild(copy.next0)");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1314 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1315
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1316 return method;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1317 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1318
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1319 private CodeVariableElement createAssumptionField(String assumption) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1320 CodeVariableElement var = new CodeVariableElement(getContext().getTruffleTypes().getAssumption(), assumption);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1321 var.getModifiers().add(Modifier.FINAL);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1322 return var;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1323 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1324
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1325 private CodeVariableElement createChildField(NodeChildData child) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1326 CodeVariableElement var = new CodeVariableElement(child.getNodeType(), child.getName());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1327 var.getModifiers().add(Modifier.PROTECTED);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1328
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1329 DeclaredType annotationType;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1330 if (child.getCardinality() == Cardinality.MANY) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1331 annotationType = getContext().getTruffleTypes().getChildrenAnnotation();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1332 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1333 annotationType = getContext().getTruffleTypes().getChildAnnotation();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1334 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1335
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1336 var.getAnnotationMirrors().add(new CodeAnnotationMirror(annotationType));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1337 return var;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1338 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1339
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1340 private CodeExecutableElement createGenericExecuteAndSpecialize(NodeData node) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1341
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1342 TypeMirror genericReturnType = node.getGenericSpecialization().getReturnType().getType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1343 CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED), genericReturnType, EXECUTE_SPECIALIZE_NAME);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1344 method.addParameter(new CodeVariableElement(getContext().getType(Class.class), "minimumState"));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1345 addInternalValueParameters(method, node.getGenericSpecialization(), true, false);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1346 method.addParameter(new CodeVariableElement(getContext().getType(String.class), "reason"));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1347
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1348 CodeTreeBuilder builder = method.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1349 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1350 builder.startStaticCall(getContext().getTruffleTypes().getCompilerAsserts(), "neverPartOfCompilation").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1351 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1352
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1353 emitSpecializationListeners(builder, node);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1354 builder.defaultDeclaration(node.getGenericSpecialization().getReturnType().getTypeSystemType().getPrimitiveType(), "result");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1355
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1356 builder.defaultDeclaration(getContext().getType(Class.class), "resultClass");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1357
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1358 builder.startStatement().string("boolean allowed = (minimumState == ").string(nodeSpecializationClassName(node.getSpecializations().get(0))).string(".class)").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1359
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1360 builder.startStatement().string("String message = ").startCall("createInfo0").string("reason");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1361 addInternalValueParameterNames(builder, node.getGenericSpecialization(), node.getGenericSpecialization(), null, false, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1362 builder.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1363
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1364 String prefix = null;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1365
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1366 List<SpecializationData> specializations = node.getSpecializations();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1367
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1368 for (SpecializationData current : specializations) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1369 if (current.isUninitialized() || !current.isReachable()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1370 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1371 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1372 CodeTreeBuilder execute = new CodeTreeBuilder(builder);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1373
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1374 execute.tree(createGenericInvokeAndSpecialize(builder, node.getGenericSpecialization(), current));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1375
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1376 if (!current.isGeneric()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1377 builder.startStatement().string("allowed = allowed || (minimumState == ").string(nodeSpecializationClassName(current)).string(".class)").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1378 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1379
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1380 builder.tree(createGuardAndCast(builder, prefix, current.getNode().getGenericSpecialization(), current, true, execute.getRoot(), null, true, false));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1381 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1382
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1383 for (SpecializationData current : specializations) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1384 if (current.isUninitialized() || current.isReachable()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1385 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1386 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1387 builder.string("// unreachable ").string(current.getId()).newLine();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1388 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1389
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1390 return method;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1391 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1392
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1393 private CodeExecutableElement createGenericExecute(NodeData node) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1394 TypeMirror genericReturnType = node.getGenericSpecialization().getReturnType().getType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1395 CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED), genericReturnType, EXECUTE_GENERIC_NAME);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1396 addInternalValueParameters(method, node.getGenericSpecialization(), true, false);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1397 CodeTreeBuilder builder = method.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1398
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1399 String prefix = null;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1400 List<SpecializationData> specializations = node.getSpecializations();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1401
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1402 for (SpecializationData current : specializations) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1403 if (current.isUninitialized() || !current.isReachable()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1404 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1405 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1406 CodeTreeBuilder execute = new CodeTreeBuilder(builder);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1407 execute.tree(createGenericInvoke(builder, node.getGenericSpecialization(), current));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1408 builder.tree(createGuardAndCast(builder, prefix, current.getNode().getGenericSpecialization(), current, true, execute.getRoot(), null, true, false));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1409 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1410
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1411 for (SpecializationData current : specializations) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1412 if (current.isUninitialized() || current.isReachable()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1413 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1414 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1415 builder.string("// unreachable ").string(current.getId()).newLine();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1416 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1417
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1418 return method;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1419 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1420
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1421 protected CodeTree createGenericInvoke(CodeTreeBuilder parent, SpecializationData source, SpecializationData current) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1422 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
1423
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1424 if (current.getMethod() == null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1425 emitEncounteredSynthetic(builder, current);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1426 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1427 builder.startReturn().tree(createTemplateMethodCall(builder, null, source, current, null)).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1428 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1429
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1430 return encloseThrowsWithFallThrough(current, builder.getRoot());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1431 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1432
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1433 protected CodeTree createGenericInvokeAndSpecialize(CodeTreeBuilder parent, SpecializationData source, SpecializationData current) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1434 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1435
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1436 NodeData node = current.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1437
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1438 builder.startIf().string("resultClass == null").end().startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1439 if (current.getMethod() != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1440 CodeTree executeCall = createTemplateMethodCall(builder, null, source, current, null);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1441 if (current.getReturnType().getTypeSystemType().isVoid()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1442 builder.statement(executeCall);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1443 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1444 builder.startStatement().string("result = ").tree(executeCall).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1445 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1446 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1447 builder.string("resultClass = ").string(nodeSpecializationClassName(current)).string(".class");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1448 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1449 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1450 emitEncounteredSynthetic(builder, current);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1451 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1452 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1453
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1454 boolean ifAllowed = current.hasRewrite(getContext());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1455 if (ifAllowed) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1456 builder.startIf().string("allowed").end().startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1457 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1458
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1459 if (!current.isGeneric() || node.getPolymorphicDepth() <= 1) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1460 // generic rewrite
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1461 builder.tree(createRewriteGeneric(builder, current));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1462 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1463 boolean rewriteableToGeneric = node.getGenericSpecialization().getMethod() != null && node.getGenericSpecialization().isReachable();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1464 if (rewriteableToGeneric) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1465 builder.startIf().string("resultClass == ").string(nodeSpecializationClassName(node.getGenericSpecialization())).string(".class").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1466 builder.startBlock();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1467
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1468 boolean maybePolymorphic = node.getPolymorphicDepth() > 1;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1469 if (maybePolymorphic) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1470 builder.startIf().string("next0 == null").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1471 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1472 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1473 builder.tree(createRewriteGeneric(builder, current));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1474 if (maybePolymorphic) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1475 builder.end().startElseBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1476 builder.statement("Node searchNode = super.getParent()");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1477 builder.startWhile().string("searchNode != null").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1478 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1479 builder.statement("searchNode = searchNode.getParent()");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1480 builder.startIf().instanceOf("searchNode", nodePolymorphicClassName(node, node.getPolymorphicSpecializations().get(0))).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1481 builder.startBlock().breakStatement().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1482 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1483 builder.startStatement().startCall("searchNode", "replace");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1484 builder.startGroup().startNew(nodeSpecializationClassName(current)).startGroup().cast(baseClassName(node)).string("searchNode").end().end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1485 builder.string("message");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1486 builder.end().end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1487 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1488
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1489 builder.end().startElseBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1490 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1491
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1492 // polymorphic rewrite
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1493 builder.tree(createRewritePolymorphic(builder, node));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1494
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1495 if (rewriteableToGeneric) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1496 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1497 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1498 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1499
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1500 if (current.getReturnType().getTypeSystemType().isVoid()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1501 builder.returnStatement();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1502 } else {
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1503 builder.startReturn().string("result").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1504 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1505 if (ifAllowed) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1506 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
1507 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1508
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1509 return encloseThrowsWithFallThrough(current, builder.getRoot());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1510 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1511
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1512 private CodeTree encloseThrowsWithFallThrough(SpecializationData current, CodeTree tree) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1513 if (current.getExceptions().isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1514 return tree;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1515 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1516 CodeTreeBuilder builder = new CodeTreeBuilder(null);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1517
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1518 builder.startTryBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1519 builder.tree(tree);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1520 for (SpecializationThrowsData exception : current.getExceptions()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1521 builder.end().startCatchBlock(exception.getJavaClass(), "rewriteEx");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1522 builder.string("// fall through").newLine();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1523 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1524 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1525
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1526 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
1527 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1528
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1529 private CodeTree createRewriteGeneric(CodeTreeBuilder parent, SpecializationData current) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1530 CodeTreeBuilder builder = parent.create();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1531 builder.startStatement().startCall("super", "replace");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1532 builder.startGroup().startNew(nodeSpecializationClassName(current)).string("this").end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1533 builder.string("message");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1534 builder.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1535 return builder.getRoot();
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1536 }
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1537
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1538 private CodeTree createRewritePolymorphic(CodeTreeBuilder parent, NodeData node) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1539 CodeTreeBuilder builder = parent.create();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1540 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1541 builder.string(nodePolymorphicClassName(node, null));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1542 builder.string(" polymorphic = ");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1543 builder.startNew(nodePolymorphicClassName(node, null)).string("this").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1544 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1545 for (NodeChildData child : node.getChildren()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1546 builder.startStatement().string("this.").string(child.getName()).string(" = null").end();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1547 }
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1548 builder.startStatement().startCall("super", "replace");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1549 builder.string("polymorphic");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1550 builder.string("message");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1551 builder.end().end();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1552
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1553 builder.statement("polymorphic.setNext0(this)");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1554 builder.statement("setNext0(createSpezialization0(resultClass))");
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1555
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1556 builder.statement("polymorphic.optimizeTypes()");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1557 return builder.getRoot();
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1558 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1559
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1560 private void emitSpecializationListeners(CodeTreeBuilder builder, NodeData node) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1561 for (TemplateMethod listener : node.getSpecializationListeners()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1562 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1563 builder.tree(createTemplateMethodCall(builder, null, listener, listener, null));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1564 builder.end(); // statement
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1565 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1566 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1567
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1568 protected CodeTree createCastingExecute(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData executable, ExecutableTypeData castExecutable) {
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1569 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
1570 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
1571 NodeData node = specialization.getNode();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1572
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1573 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
1574 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
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 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
1577 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
1578
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1579 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
1580 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
1581 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
1582 continue;
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1583 }
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
1584
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1585 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
1586 if (targetParameter != null) {
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1587 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
1588 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1589 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1590
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1591 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
1592
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1593 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
1594 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
1595 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
1596 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
1597 }
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.startTryBlock();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1599
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
1600 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
1601 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
1602 } 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
1603 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
1604 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
1605 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
1606 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
1607 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1608
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
1609 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
1610 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
1611 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
1612 } 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
1613 builder.startReturn();
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1614 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
1615 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
1616 }
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.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1618
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 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
1620 builder.startReturn();
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1621 builder.tree(createExpectExecutableType(node, castExecutable.getReturnType().getTypeSystemType(), 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
1622 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
1623 }
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
1624 } 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
1625 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
1626 builder.statement(primaryExecuteCall);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1627 } 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
1628 builder.startReturn();
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1629 builder.tree(createExpectExecutableType(node, castExecutable.getReturnType().getTypeSystemType(), 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
1630 builder.end();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1631 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1632 }
9215
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1633
bd067a48a9c2 Changed execute method generation strategy. Limited it for primitive execute methods.
Christian Humer <christian.humer@gmail.com>
parents: 8662
diff changeset
1634 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
1635 }
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
1636
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1637 protected CodeTree createExpectExecutableType(NodeData node, TypeData sourceType, ExecutableTypeData castedType, CodeTree value) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1638 boolean hasUnexpected = castedType.hasUnexpectedValue(getContext());
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1639 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
1640 }
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1641
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1642 protected CodeTree createCastType(NodeData node, TypeData sourceType, TypeData targetType, boolean expect, CodeTree value) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1643 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
1644 return value;
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1645 } 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
1646 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
1647 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1648
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
1649 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
1650 String targetMethodName;
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1651 if (expect) {
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1652 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
1653 } else {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1654 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
1655 }
7847
06a7cd6aaf00 Casting is now done on demand using local variables for explicit guards.
Christian Humer <christian.humer@gmail.com>
parents: 7846
diff changeset
1656 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
1657
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
1658 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
1659 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
1660 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1661 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1662
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1663 protected CodeTree createExecuteChildren(CodeTreeBuilder parent, ExecutableTypeData sourceExecutable, SpecializationData specialization, List<ActualParameter> targetParameters,
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1664 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
1665 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
1666
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
1667 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
1668
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1669 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
1670 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
1671 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
1672 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
1673 }
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
1674
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1675 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
1676 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
1677 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
1678 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
1679 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1680
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1681 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
1682
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1683 String targetVariableName = valueName(targetParameter);
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1684 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
1685 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
1686 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
1687 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
1688 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
1689 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
1690 }
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1691 builder.startStatement();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1692 builder.type(targetParameter.getType()).string(" ");
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1693 builder.string(valueName(targetParameter)).string(" = ");
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1694 builder.tree(CodeTreeBuilder.singleString(valueNameEvaluated(targetParameter)));
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1695 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
1696 continue;
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1697 } 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
1698 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
1699 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
1700 }
9218
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1701 } else if (sourceParameter == null) {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1702 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
1703 }
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1704
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1705 if (executionExpression != null) {
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1706 CodeTreeVariable executionVar = new CodeTreeVariable();
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1707 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
1708 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
1709 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
1710
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1711 executionVar.set(unexpectedTree);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1712 builder.tree(shortCircuitTree);
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1713 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1714 }
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
1715 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1716 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1717
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1718 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
1719 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
1720 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
1721 boolean unexpected = targetExecutable.hasUnexpectedValue(getContext());
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1722 boolean cast = false;
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1723 if (targetExecutable.getType().needsCastTo(getContext(), param.getTypeSystemType())) {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1724 unexpected = true;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1725 cast = true;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1726 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1727
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1728 if (specialization.isGeneric() && unexpected) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1729 throw new AssertionError("Generic has unexpected parameters. " + specialization.toString());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1730 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1731
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1732 builder.startStatement();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1733
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1734 if (!shortCircuit) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1735 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
1736 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1737
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1738 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
1739 if (!shortCircuit) {
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1740 builder.end();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1741 }
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1742 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
1743 builder.startStatement();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1744 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
1745 } 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
1746 builder.startStatement();
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1747 builder.string(targetVariableName);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1748 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1749 builder.string(" = ");
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1750 if (cast) {
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1751 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
1752 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1753 builder.tree(body);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1754 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1755 builder.end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1756
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1757 if (unexpected) {
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1758 builder.end().startCatchBlock(getUnexpectedValueException(), "ex");
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1759 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
1760 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
1761
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1762 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
1763 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
1764 builder.tree(createExecuteChildren(parent, currentExecutable, generic, genericParameters, genericParameter, false));
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1765 if (specialization.isPolymorphic()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1766 builder.tree(createReturnOptimizeTypes(builder, specialization, param));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1767 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1768 builder.tree(createReturnExecuteAndSpecialize(builder, currentExecutable, specialization.findNextSpecialization(), param, "Expected " + param.getLocalName() + " instanceof " +
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1769 Utils.getSimpleName(param.getType())));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1770 }
8245
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1771 builder.end(); // catch block
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1772 }
703c09f8640c Implemented support for @NodeClass annotation to support builtins.
Christian Humer <christian.humer@gmail.com>
parents: 8243
diff changeset
1773
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1774 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1775 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1776
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1777 private CodeTree createReturnOptimizeTypes(CodeTreeBuilder parent, SpecializationData specialization, ActualParameter param) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1778 NodeData node = specialization.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1779 assert !node.getPolymorphicSpecializations().isEmpty();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1780 SpecializationData generic = node.getPolymorphicSpecializations().get(0);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1781
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1782 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1783 builder.startReturn();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1784
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1785 CodeTreeBuilder execute = new CodeTreeBuilder(builder);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1786 execute.startCall("next0", "executeCached0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1787 addInternalValueParameterNames(execute, specialization, generic, param.getLocalName(), true, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1788 execute.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1789
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1790 TypeData sourceType = generic.getReturnType().getTypeSystemType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1791 TypeData targetType = specialization.getReturnType().getTypeSystemType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1792
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1793 builder.tree(createCastType(node, sourceType, targetType, true, execute.getRoot()));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1794
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1795 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1796 return builder.getRoot();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1797 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1798
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1799 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
1800 TypeData type = sourceParameter.getTypeSystemType();
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1801 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
1802
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1803 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
1804 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
1805 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
1806 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
1807 builder.string("this.").string(targetField.getName());
9231
ee3a9188c65e Checkstyle fixes.
Christian Humer <christian.humer@gmail.com>
parents: 9228
diff changeset
1808 } 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
1809 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
1810 } else {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1811 throw new AssertionError();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1812 }
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1813 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
1814 builder.string("[" + sourceParameter.getIndex() + "]");
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1815 }
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1816 builder.string(".");
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1817 }
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1818
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1819 builder.startCall(execType.getMethodName());
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1820
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1821 int index = 0;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1822 for (ActualParameter parameter : execType.getParameters()) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1823
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1824 if (!parameter.getSpecification().isSignature()) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1825 builder.string(parameter.getLocalName());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1826 } else {
9848
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1827 if (index < targetField.getExecuteWith().size()) {
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1828 NodeChildData child = targetField.getExecuteWith().get(index);
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1829
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1830 ParameterSpec spec = getModel().getSpecification().findParameterSpec(child.getName());
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1831 List<ActualParameter> specializationParams = getModel().findParameters(spec);
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1832
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1833 if (specializationParams.isEmpty()) {
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1834 builder.defaultValue(parameter.getType());
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1835 continue;
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1836 }
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1837
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1838 ActualParameter specializationParam = specializationParams.get(0);
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1839
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1840 TypeData targetType = parameter.getTypeSystemType();
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1841 TypeData sourceType = specializationParam.getTypeSystemType();
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1842 String localName = specializationParam.getLocalName();
9848
a5d3e0973e83 Fixed @Specialization#executeWith order was ignored.
Christian Humer <christian.humer@gmail.com>
parents: 9798
diff changeset
1843
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1844 if (unexpectedParameter != null && unexpectedParameter.getLocalName().equals(specializationParam.getLocalName())) {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1845 localName = "ex.getResult()";
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1846 sourceType = getModel().getNode().getTypeSystem().getGenericTypeData();
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1847 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1848
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1849 CodeTree value = CodeTreeBuilder.singleString(localName);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1850
9305
e6251a86e8e3 Fixed some minor bugs in executeWith supprt.
Christian Humer <christian.humer@gmail.com>
parents: 9287
diff changeset
1851 if (sourceType.needsCastTo(getContext(), targetType)) {
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1852 value = createCallTypeSystemMethod(getContext(), builder, getModel().getNode(), TypeSystemCodeGenerator.asTypeMethodName(targetType), value);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1853 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1854 builder.tree(value);
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1855 } else {
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1856 builder.defaultValue(parameter.getType());
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1857 }
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1858 index++;
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1859 }
7502
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
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1862 builder.end();
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1863
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1864 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1865 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1866
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1867 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
1868 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
1869 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
1870
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
1871 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
1872 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
1873 return body;
8237
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1874 }
6b74ffe38183 Implemented support for executing nodes in @Children fields.
Christian Humer <christian.humer@gmail.com>
parents: 7859
diff changeset
1875
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1876 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
1877 return body;
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1878 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1879
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1880 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
1881
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1882 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
1883
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1884 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
1885 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
1886 builder.startBlock();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1887 builder.tree(body);
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1888 builder.end();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1889
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1890 return builder.getRoot();
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1891 }
797bb88bf004 Fixed evaluated execute generation for short circuit definitions.
Christian Humer <christian.humer@gmail.com>
parents: 9217
diff changeset
1892
9286
39f08ef7b5d8 Fixed bugs for execute evaluated generation.
Christian Humer <christian.humer@gmail.com>
parents: 9281
diff changeset
1893 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
1894 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
1895 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
1896 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
1897 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
1898 if (field == forField) {
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1899 break;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1900 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1901 shortCircuitIndex++;
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1902 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1903 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1904
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1905 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
1906 ShortCircuitData shortCircuitData = specialization.getShortCircuits().get(shortCircuitIndex);
9287
8e3a1635cc9e Implemented @NodeChild(executeWith={...}).
Christian Humer <christian.humer@gmail.com>
parents: 9286
diff changeset
1907 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
1908 builder.end(); // statement
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1909
9217
61ba6fc21ba4 Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
Christian Humer <christian.humer@gmail.com>
parents: 9215
diff changeset
1910 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1911 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1912
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1913 protected CodeTree createDeoptimize(CodeTreeBuilder parent) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1914 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1915 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1916 builder.startStaticCall(getContext().getTruffleTypes().getCompilerDirectives(), "transferToInterpreter").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1917 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1918 return builder.getRoot();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1919 }
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1920
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1921 protected CodeTree createReturnExecuteAndSpecialize(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData nextSpecialization, ActualParameter exceptionParam, String reason) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1922 SpecializationData generic = getModel().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
1923 CodeTreeBuilder specializeCall = new CodeTreeBuilder(parent);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1924 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
1925 specializeCall.string(nodeSpecializationClassName(nextSpecialization) + ".class");
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1926 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
1927 specializeCall.doubleQuote(reason);
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1928 specializeCall.end().end();
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
1929
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
1930 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
9345
0a8bf24d660a Implemented improvements to the generated source code.
Christian Humer <christian.humer@gmail.com>
parents: 9305
diff changeset
1931
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
1932 builder.startReturn();
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1933 builder.tree(createExpectExecutableType(nextSpecialization.getNode(), generic.getReturnType().getTypeSystemType(), executable, specializeCall.getRoot()));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1934 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1935
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1936 return builder.getRoot();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1937 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1938 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1939
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1940 private class PolymorphicNodeFactory extends SpecializedNodeFactory {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1941
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1942 private final boolean generic;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1943
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1944 public PolymorphicNodeFactory(ProcessorContext context, CodeTypeElement nodeGen, boolean generic) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1945 super(context, nodeGen);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1946 this.generic = generic;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1947 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1948
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1949 @Override
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1950 public CodeTypeElement create(SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1951 NodeData node = specialization.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1952 TypeMirror baseType = node.getNodeType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1953 if (nodeGen != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1954 baseType = nodeGen.asType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1955 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1956 CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, STATIC), nodePolymorphicClassName(node, specialization), baseType, false);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1957
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1958 if (!generic) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1959 clazz.getModifiers().add(Modifier.FINAL);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1960 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1961
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1962 clazz.getAnnotationMirrors().add(createNodeInfo(node, Kind.POLYMORPHIC));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1963
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1964 return clazz;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1965 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1966
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1967 @Override
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1968 protected void createChildren(SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1969 // super.createChildren(specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1970 CodeTypeElement clazz = getElement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1971
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1972 createConstructors(clazz);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1973 createExecuteMethods(specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1974
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1975 if (generic) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1976 getElement().add(createOptimizeTypes());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1977 createCachedExecuteMethods(specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1978 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1979 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1980
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1981 private CodeExecutableElement createOptimizeTypes() {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1982 NodeData node = getModel().getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1983 CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED, FINAL), getContext().getType(void.class), "optimizeTypes");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1984 CodeTreeBuilder builder = method.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1985 builder.startStatement().string(baseClassName(node)).string(" node = this.next0").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1986 TypeMirror classType = getContext().getType(Class.class);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1987
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1988 SpecializationData genericSpecialization = node.getGenericSpecialization();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1989
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1990 CodeTreeBuilder whileBodyBuilder = builder.create();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1991 for (ActualParameter parameter : node.getGenericSpecialization().getReturnTypeAndParameters()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1992 if (!parameter.getSpecification().isSignature()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1993 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1994 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1995
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1996 ActualParameter genericParameter = genericSpecialization.findParameter(parameter.getLocalName());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1997
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1998 String name = parameter.getLocalName() + "Type";
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
1999
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2000 builder.declaration(classType, name, builder.create().startCall("node", typeGetterName(parameter)).end().getRoot());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2001
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2002 whileBodyBuilder.startIf().string(name).string(" != ").startCall("node", typeGetterName(parameter)).end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2003 whileBodyBuilder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2004 whileBodyBuilder.startStatement().string(name).string(" = ").typeLiteral(genericParameter.getType()).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2005 whileBodyBuilder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2006 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2007
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2008 builder.startWhile().string("node != null && !(").instanceOf("node", nodeSpecializationClassName(node.getUninitializedSpecialization())).string(")").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2009 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2010 builder.tree(whileBodyBuilder.getRoot());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2011 builder.statement("node = node.next0");
7843
4969921f57b7 Renamed generated specialize to specializeAndExecute.
Christian Humer <christian.humer@gmail.com>
parents: 7799
diff changeset
2012 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
2013
10596
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2014 boolean elseIf = false;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2015 for (SpecializationData polymorph : node.getPolymorphicSpecializations()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2016 elseIf = builder.startIf(elseIf);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2017 String and = "";
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2018 StringBuilder reason = new StringBuilder("Optimized polymorphic types for (");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2019 for (ActualParameter parameter : polymorph.getReturnTypeAndParameters()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2020 if (!parameter.getSpecification().isSignature()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2021 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2022 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2023 String name = parameter.getLocalName() + "Type";
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2024 builder.string(and).string(name).string(" == ").typeLiteral(parameter.getType());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2025
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2026 if (!and.isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2027 reason.append(", ");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2028 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2029 reason.append(Utils.getSimpleName(parameter.getType()));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2030 and = " && ";
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2031 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2032 reason.append(")");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2033 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2034 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2035
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2036 String className = nodePolymorphicClassName(node, polymorph);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2037 builder.startIf().string("getClass() != ").string(className).string(".class").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2038 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2039 builder.startStatement().startCall("super", "replace");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2040 builder.startNew(className).string("this").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2041 builder.doubleQuote(reason.toString());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2042 builder.end().end(); // call
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2043 builder.end(); // block
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2044 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2045 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2046 return method;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2047 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2048 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2049
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2050 private class SpecializedNodeFactory extends NodeBaseFactory {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2051
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2052 protected final CodeTypeElement nodeGen;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2053
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2054 public SpecializedNodeFactory(ProcessorContext context, CodeTypeElement nodeGen) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2055 super(context);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2056 this.nodeGen = nodeGen;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2057 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2058
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2059 @Override
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2060 public CodeTypeElement create(SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2061 NodeData node = specialization.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2062 TypeMirror baseType = node.getNodeType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2063 if (nodeGen != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2064 baseType = nodeGen.asType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2065 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2066 CodeTypeElement clazz = createClass(node, modifiers(PRIVATE, STATIC, FINAL), nodeSpecializationClassName(specialization), baseType, false);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2067
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2068 Kind kind;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2069 if (specialization.isGeneric()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2070 kind = Kind.GENERIC;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2071 } else if (specialization.isUninitialized()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2072 kind = Kind.UNINITIALIZED;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2073 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2074 kind = Kind.SPECIALIZED;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2075 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2076 clazz.getAnnotationMirrors().add(createNodeInfo(node, kind));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2077
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2078 return clazz;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2079 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2080
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2081 protected CodeAnnotationMirror createNodeInfo(NodeData node, Kind kind) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2082 String shortName = node.getShortName();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2083 CodeAnnotationMirror nodeInfoMirror = new CodeAnnotationMirror(getContext().getTruffleTypes().getNodeInfoAnnotation());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2084 if (shortName != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2085 nodeInfoMirror.setElementValue(nodeInfoMirror.findExecutableElement("shortName"), new CodeAnnotationValue(shortName));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2086 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2087
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2088 DeclaredType nodeinfoKind = getContext().getTruffleTypes().getNodeInfoKind();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2089 VariableElement varKind = Utils.findVariableElement(nodeinfoKind, kind.name());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2090
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2091 nodeInfoMirror.setElementValue(nodeInfoMirror.findExecutableElement("kind"), new CodeAnnotationValue(varKind));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2092 return nodeInfoMirror;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2093 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2094
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2095 @Override
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2096 protected void createChildren(SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2097 CodeTypeElement clazz = getElement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2098 createConstructors(clazz);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2099
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2100 NodeData node = specialization.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2101
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2102 if (!specialization.isGeneric() && !specialization.isUninitialized() && !specialization.isPolymorphic() && node.needsRewrites(getContext()) && node.getPolymorphicDepth() > 1) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2103
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2104 createTypeGetters(clazz, specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2105 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2106
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2107 createExecuteMethods(specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2108 createCachedExecuteMethods(specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2109 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2110
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2111 protected void createConstructors(CodeTypeElement clazz) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2112 TypeElement superTypeElement = Utils.fromTypeMirror(clazz.getSuperclass());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2113 for (ExecutableElement constructor : ElementFilter.constructorsIn(superTypeElement.getEnclosedElements())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2114 if (getModel().getNode().getUninitializedSpecialization() != null && !getModel().isUninitialized() && constructor.getParameters().size() != 1 ||
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2115 constructor.getParameters().get(0).getSimpleName().toString().equals(baseClassName(getModel().getNode()))) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2116 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2117 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2118
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2119 CodeExecutableElement superConstructor = createSuperConstructor(clazz, constructor);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2120 if (superConstructor != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2121 if (getModel().isGeneric() && getModel().getNode().getPolymorphicDepth() > 1) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2122 CodeTree body = superConstructor.getBodyTree();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2123 CodeTreeBuilder builder = superConstructor.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2124 builder.tree(body);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2125 builder.statement("this.next0 = null");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2126 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2127
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2128 clazz.add(superConstructor);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2129 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2130 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2131 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2132
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2133 protected void createExecuteMethods(SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2134 NodeData node = specialization.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2135 CodeTypeElement clazz = getElement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2136
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2137 for (ExecutableTypeData execType : node.getExecutableTypes()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2138 if (execType.isFinal()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2139 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2140 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2141 CodeExecutableElement executeMethod = createExecutableTypeOverride(execType, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2142 clazz.add(executeMethod);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2143 CodeTreeBuilder builder = executeMethod.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2144 CodeTree result = createExecuteBody(builder, specialization, execType);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2145 if (result != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2146 builder.tree(result);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2147 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2148 clazz.remove(executeMethod);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2149 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2150 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2151 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2152
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2153 protected void createCachedExecuteMethods(SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2154 NodeData node = specialization.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2155 CodeTypeElement clazz = getElement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2156 int index = 0;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2157 for (SpecializationData polymorphic : node.getPolymorphicSpecializations()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2158 boolean matchFound = false;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2159 if (!specialization.isGeneric() && !specialization.isUninitialized() && !specialization.isPolymorphic()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2160 matchFound = polymorphic.getSignature().hasAnyParameterMatch(specialization.getSignature());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2161 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2162
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2163 if (matchFound || index == 0) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2164 ExecutableElement executeCached = nodeGen.getMethod("executeCached" + index);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2165 ExecutableTypeData execType = new ExecutableTypeData(polymorphic, executeCached, node.getTypeSystem(), polymorphic.getReturnType().getTypeSystemType());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2166
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2167 CodeExecutableElement executeMethod = createExecutableTypeOverride(execType, false);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2168 CodeTreeBuilder builder = executeMethod.createBuilder();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2169
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2170 if (specialization.isGeneric() || specialization.isPolymorphic()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2171 builder.startThrow().startNew(getContext().getType(AssertionError.class));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2172 builder.doubleQuote("Should not be reached.");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2173 builder.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2174 } else if (specialization.isUninitialized()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2175 builder.tree(createAppendPolymorphic(builder, specialization));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2176 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2177 CodeTreeBuilder elseBuilder = new CodeTreeBuilder(builder);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2178 elseBuilder.startReturn().startCall("this.next0", "executeCached" + index);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2179 addInternalValueParameterNames(elseBuilder, polymorphic, polymorphic, null, true, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2180 elseBuilder.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2181 CodeTreeBuilder execute = new CodeTreeBuilder(builder);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2182 execute.tree(createGenericInvoke(builder, polymorphic, specialization));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2183 boolean forceElse = !specialization.getExceptions().isEmpty();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2184 builder.tree(createGuardAndCast(builder, null, polymorphic, specialization, true, execute.getRoot(), elseBuilder.getRoot(), true, forceElse));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2185 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2186 clazz.add(executeMethod);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2187 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2188 index++;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2189 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2190 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2191
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2192 private CodeTree createAppendPolymorphic(CodeTreeBuilder parent, SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2193 NodeData node = specialization.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2194 String genericClassName = nodePolymorphicClassName(node, null);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2195
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2196 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2197 builder.startStatement().startStaticCall(getContext().getTruffleTypes().getCompilerDirectives(), "transferToInterpreter").end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2198
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2199 builder.declaration(getContext().getTruffleTypes().getNode(), "searchNode", "super.getParent()");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2200 builder.declaration(getContext().getType(int.class), "depth", "0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2201 builder.startWhile().string("searchNode != null").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2202 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2203 builder.statement("depth++");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2204 builder.statement("searchNode = searchNode.getParent()");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2205
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2206 builder.startIf().instanceOf("searchNode", genericClassName).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2207 builder.startBlock().breakStatement().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2208 builder.end(); // if
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2209 builder.end(); // while
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2210
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2211 builder.startAssert().instanceOf("searchNode", genericClassName).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2212
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2213 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2214 builder.string(genericClassName).string(" ").string("polymorphic = ").string("(").string(genericClassName).string(") searchNode");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2215 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2216
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2217 builder.startIf().string("depth >= ").string(String.valueOf(node.getPolymorphicDepth())).end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2218 builder.startBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2219 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2220 builder.startCall("searchNode", "replace");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2221 builder.startNew(nodeSpecializationClassName(node.getGenericSpecialization())).string("this").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2222 builder.doubleQuote("Polymorphic limit reached (" + node.getPolymorphicDepth() + ")");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2223 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2224 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2225
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2226 builder.startReturn().startCall("super", EXECUTE_GENERIC_NAME);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2227 addInternalValueParameterNames(builder, specialization, node.getGenericSpecialization(), null, true, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2228 builder.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2229
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2230 builder.end().startElseBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2231 builder.startStatement().startCall("super", "setNext0");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2232 builder.startNew(nodeSpecializationClassName(node.getUninitializedSpecialization())).string("this").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2233 builder.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2234
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2235 CodeTreeBuilder specializeCall = new CodeTreeBuilder(builder);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2236 specializeCall.startCall(EXECUTE_SPECIALIZE_NAME);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2237 specializeCall.string(nodeSpecializationClassName(node.getUninitializedSpecialization()) + ".class");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2238 addInternalValueParameterNames(specializeCall, specialization, node.getGenericSpecialization(), null, true, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2239 specializeCall.startGroup().doubleQuote("Uninitialized polymorphic (").string(" + depth + ").doubleQuote("/" + node.getPolymorphicDepth() + ")").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2240 specializeCall.end().end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2241
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2242 builder.declaration(node.getGenericSpecialization().getReturnType().getType(), "result", specializeCall.getRoot());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2243
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2244 builder.statement("polymorphic.optimizeTypes()");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2245
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2246 if (Utils.isVoid(builder.findMethod().getReturnType())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2247 builder.returnStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2248 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2249 builder.startReturn().string("result").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2250 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2251
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2252 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2253
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2254 return builder.getRoot();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2255 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2256
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2257 private CodeTree createExecuteBody(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData execType) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2258 TypeData primaryType = specialization.getReturnType().getTypeSystemType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2259
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2260 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2261
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2262 List<ExecutableTypeData> primaryExecutes = findFunctionalExecutableType(specialization, execType.getEvaluatedCount());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2263
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2264 if (primaryExecutes.contains(execType) || primaryExecutes.isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2265 builder.tree(createFunctionalExecute(builder, specialization, execType));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2266 } else if (needsCastingExecuteMethod(execType, primaryType)) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2267 assert !primaryExecutes.isEmpty();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2268 builder.tree(createCastingExecute(builder, specialization, execType, primaryExecutes.get(0)));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2269 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2270 return null;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2271 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2272
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2273 return builder.getRoot();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2274 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2275
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2276 private CodeExecutableElement createExecutableTypeOverride(ExecutableTypeData execType, boolean evaluated) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2277 CodeExecutableElement method = CodeExecutableElement.clone(getContext().getEnvironment(), execType.getMethod());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2278
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2279 int i = 0;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2280 for (VariableElement param : method.getParameters()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2281 CodeVariableElement var = CodeVariableElement.clone(param);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2282 ActualParameter actualParameter = execType.getParameters().get(i);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2283 if (evaluated && actualParameter.getSpecification().isSignature()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2284 var.setName(valueNameEvaluated(actualParameter));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2285 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2286 var.setName(valueName(actualParameter));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2287 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2288 method.getParameters().set(i, var);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2289 i++;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2290 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2291
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2292 method.getAnnotationMirrors().clear();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2293 method.getModifiers().remove(Modifier.ABSTRACT);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2294 return method;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2295 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2296
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2297 private boolean needsCastingExecuteMethod(ExecutableTypeData execType, TypeData primaryType) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2298 if (execType.isAbstract()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2299 return true;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2300 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2301 if (Utils.isPrimitiveOrVoid(primaryType.getPrimitiveType()) && Utils.isPrimitiveOrVoid(execType.getType().getPrimitiveType())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2302 return true;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2303 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2304 if (execType.getType().isGeneric()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2305 return true;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2306 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2307 return false;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2308 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2309
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2310 private List<ExecutableTypeData> findFunctionalExecutableType(SpecializationData specialization, int evaluatedCount) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2311 TypeData primaryType = specialization.getReturnType().getTypeSystemType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2312 List<ExecutableTypeData> otherTypes = specialization.getNode().getExecutableTypes(evaluatedCount);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2313
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2314 List<ExecutableTypeData> filteredTypes = new ArrayList<>();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2315 for (ExecutableTypeData compareType : otherTypes) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2316 if (!Utils.typeEquals(compareType.getType().getPrimitiveType(), primaryType.getPrimitiveType())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2317 continue;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2318 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2319 filteredTypes.add(compareType);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2320 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2321
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2322 // no direct matches found use generic where the type is Object
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2323 if (filteredTypes.isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2324 for (ExecutableTypeData compareType : otherTypes) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2325 if (compareType.getType().isGeneric() && !compareType.hasUnexpectedValue(getContext())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2326 filteredTypes.add(compareType);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2327 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2328 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2329 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2330
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2331 if (filteredTypes.isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2332 for (ExecutableTypeData compareType : otherTypes) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2333 if (compareType.getType().isGeneric()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2334 filteredTypes.add(compareType);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2335 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2336 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2337 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2338
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2339 return filteredTypes;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2340 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2341
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2342 private CodeTree createFunctionalExecute(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData executable) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2343 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2344 if (specialization.isUninitialized()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2345 builder.tree(createDeoptimize(builder));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2346 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2347
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2348 builder.tree(createExecuteChildren(builder, executable, specialization, specialization.getParameters(), null, false));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2349
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2350 CodeTree executeNode = createExecute(builder, executable, specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2351
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2352 SpecializationData next = specialization.findNextSpecialization();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2353 CodeTree returnSpecialized = null;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2354 if (next != null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2355 CodeTreeBuilder returnBuilder = new CodeTreeBuilder(builder);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2356 returnBuilder.tree(createDeoptimize(builder));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2357 returnBuilder.tree(createReturnExecuteAndSpecialize(builder, executable, next, null, "One of guards " + specialization.getGuards() + " failed"));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2358 returnSpecialized = returnBuilder.getRoot();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2359 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2360 builder.tree(createGuardAndCast(builder, null, specialization, specialization, true, executeNode, returnSpecialized, false, false));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2361
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2362 return builder.getRoot();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2363 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2364
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2365 private CodeTree createExecute(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData specialization) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2366 NodeData node = specialization.getNode();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2367 CodeTreeBuilder builder = new CodeTreeBuilder(parent);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2368 if (!specialization.getExceptions().isEmpty() || !specialization.getAssumptions().isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2369 builder.startTryBlock();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2370 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2371
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2372 for (String assumption : specialization.getAssumptions()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2373 builder.startStatement();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2374 builder.string("this.").string(assumption).string(".check()");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2375 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2376 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2377
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2378 CodeTreeBuilder returnBuilder = new CodeTreeBuilder(parent);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2379 if (specialization.isPolymorphic()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2380 int index = 0;
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2381 if (executable.hasUnexpectedValue(getContext())) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2382 index = specialization.getNode().getPolymorphicSpecializations().indexOf(specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2383 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2384 returnBuilder.startCall("next0", "executeCached" + index);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2385 addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2386 returnBuilder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2387 } else if (specialization.isUninitialized()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2388 returnBuilder.startCall("super", EXECUTE_SPECIALIZE_NAME);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2389 returnBuilder.startGroup().string(nodeSpecializationClassName(specialization)).string(".class").end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2390 addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2391 returnBuilder.doubleQuote("Uninitialized monomorphic");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2392 returnBuilder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2393 } else if (specialization.getMethod() == null && !node.needsRewrites(context)) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2394 emitEncounteredSynthetic(builder, specialization);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2395 } else if (specialization.isGeneric()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2396 returnBuilder.startCall("super", EXECUTE_GENERIC_NAME);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2397 addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true);
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2398 returnBuilder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2399 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2400 returnBuilder.tree(createTemplateMethodCall(returnBuilder, null, specialization, specialization, null));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2401 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2402
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2403 if (!returnBuilder.isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2404 builder.startReturn();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2405
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2406 TypeData targetType = node.getTypeSystem().findTypeData(builder.findMethod().getReturnType());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2407 TypeData sourceType = specialization.getReturnType().getTypeSystemType();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2408
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2409 if (targetType == null || sourceType == null) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2410 builder.tree(returnBuilder.getRoot());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2411 } else if (sourceType.needsCastTo(getContext(), targetType)) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2412 builder.tree(createCallTypeSystemMethod(context, parent, node, TypeSystemCodeGenerator.expectTypeMethodName(targetType), returnBuilder.getRoot()));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2413 } else {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2414 builder.tree(returnBuilder.getRoot());
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2415 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2416 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2417 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2418
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2419 if (!specialization.getExceptions().isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2420 for (SpecializationThrowsData exception : specialization.getExceptions()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2421 builder.end().startCatchBlock(exception.getJavaClass(), "ex");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2422 builder.tree(createDeoptimize(builder));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2423 builder.tree(createReturnExecuteAndSpecialize(parent, executable, exception.getTransitionTo(), null, "Thrown " + Utils.getSimpleName(exception.getJavaClass())));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2424 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2425 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2426 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2427 if (!specialization.getAssumptions().isEmpty()) {
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2428 builder.end().startCatchBlock(getContext().getTruffleTypes().getInvalidAssumption(), "ex");
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2429 builder.tree(createReturnExecuteAndSpecialize(parent, executable, specialization.findNextSpecialization(), null, "Assumption failed"));
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2430 builder.end();
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2431 }
f43eb2f1bbbc Truffle-DSL: code-generation of polymorphic caching
Christian Humer <christian.humer@gmail.com>
parents: 10513
diff changeset
2432
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
2433 return builder.getRoot();
7502
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2434 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2435
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2436 }
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2437
6343a09b2ec1 Codegen operation generation is inferred from the node type hierarchy.
Christian Humer <christian.humer@gmail.com>
parents:
diff changeset
2438 }