comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/ExecutableTypeData.java @ 20984:6361fa2e3321

Truffle-DSL: further fixes for polymorphic execute signatures.
author Christian Humer <christian.humer@oracle.com>
date Wed, 15 Apr 2015 21:13:43 +0200
parents 05a2b72c071f
children fdf55f1ffc59
comparison
equal deleted inserted replaced
20983:b99da6d86cfe 20984:6361fa2e3321
33 import com.oracle.truffle.dsl.processor.*; 33 import com.oracle.truffle.dsl.processor.*;
34 import com.oracle.truffle.dsl.processor.java.*; 34 import com.oracle.truffle.dsl.processor.java.*;
35 35
36 public class ExecutableTypeData extends MessageContainer implements Comparable<ExecutableTypeData> { 36 public class ExecutableTypeData extends MessageContainer implements Comparable<ExecutableTypeData> {
37 37
38 private final NodeData node;
38 private final ExecutableElement method; 39 private final ExecutableElement method;
39 private final TypeMirror returnType; 40 private final TypeMirror returnType;
40 private final TypeMirror frameParameter; 41 private final TypeMirror frameParameter;
41 private final List<TypeMirror> evaluatedParameters; 42 private final List<TypeMirror> evaluatedParameters;
42 private ExecutableTypeData delegatedTo; 43 private ExecutableTypeData delegatedTo;
43 private final List<ExecutableTypeData> delegatedFrom = new ArrayList<>(); 44 private final List<ExecutableTypeData> delegatedFrom = new ArrayList<>();
44 45
45 private String uniqueName; 46 private String uniqueName;
46 47
47 public ExecutableTypeData(TypeMirror returnType, String uniqueName, TypeMirror frameParameter, List<TypeMirror> evaluatedParameters) { 48 public ExecutableTypeData(NodeData node, TypeMirror returnType, String uniqueName, TypeMirror frameParameter, List<TypeMirror> evaluatedParameters) {
49 this.node = node;
48 this.returnType = returnType; 50 this.returnType = returnType;
49 this.frameParameter = frameParameter; 51 this.frameParameter = frameParameter;
50 this.evaluatedParameters = evaluatedParameters; 52 this.evaluatedParameters = evaluatedParameters;
51 this.uniqueName = uniqueName; 53 this.uniqueName = uniqueName;
52 this.method = null; 54 this.method = null;
53 } 55 }
54 56
55 public ExecutableTypeData(ExecutableElement method, int signatureSize, List<TypeMirror> frameTypes) { 57 public ExecutableTypeData(NodeData node, ExecutableElement method, int signatureSize, List<TypeMirror> frameTypes) {
58 this.node = node;
56 this.method = method; 59 this.method = method;
57 this.returnType = method.getReturnType(); 60 this.returnType = method.getReturnType();
58 TypeMirror foundFrameParameter = null; 61 TypeMirror foundFrameParameter = null;
59 List<? extends VariableElement> parameters = method.getParameters(); 62 List<? extends VariableElement> parameters = method.getParameters();
60 63
121 124
122 public List<TypeMirror> getEvaluatedParameters() { 125 public List<TypeMirror> getEvaluatedParameters() {
123 return evaluatedParameters; 126 return evaluatedParameters;
124 } 127 }
125 128
129 public List<TypeMirror> getSignatureParameters() {
130 List<TypeMirror> signaturetypes = new ArrayList<>();
131 int index = 0;
132 for (NodeExecutionData execution : node.getChildExecutions()) {
133 if (execution.isShortCircuit()) {
134 index++;
135 }
136 if (index < getEvaluatedCount()) {
137 signaturetypes.add(getEvaluatedParameters().get(index));
138 }
139 index++;
140 }
141 return signaturetypes;
142 }
143
126 public int getVarArgsIndex(int parameterIndex) { 144 public int getVarArgsIndex(int parameterIndex) {
127 if (method.isVarArgs()) { 145 if (method.isVarArgs()) {
128 int index = parameterIndex - (method.getParameters().size() - 1); 146 int index = parameterIndex - (method.getParameters().size() - 1);
129 return index; 147 return index;
130 } 148 }
157 175
158 public int getEvaluatedCount() { 176 public int getEvaluatedCount() {
159 return evaluatedParameters.size(); 177 return evaluatedParameters.size();
160 } 178 }
161 179
162 public boolean canDelegateTo(NodeData node, ExecutableTypeData to) { 180 public boolean canDelegateTo(ExecutableTypeData to) {
163 ExecutableTypeData from = this; 181 ExecutableTypeData from = this;
164 if (to.getEvaluatedCount() < from.getEvaluatedCount()) { 182 if (to.getEvaluatedCount() < from.getEvaluatedCount()) {
165 return false; 183 return false;
166 } 184 }
167 185
187 if (!isSubtypeBoxed(context, from.getEvaluatedParameters().get(i), to.getEvaluatedParameters().get(i))) { 205 if (!isSubtypeBoxed(context, from.getEvaluatedParameters().get(i), to.getEvaluatedParameters().get(i))) {
188 return false; 206 return false;
189 } 207 }
190 } 208 }
191 209
192 for (int i = from.getEvaluatedCount(); i < to.getEvaluatedCount(); i++) { 210 List<TypeMirror> fromSignatureParameters = from.getSignatureParameters();
193 TypeMirror delegateToParameter = to.getEvaluatedParameters().get(i); 211 List<TypeMirror> toSignatureParameters = to.getSignatureParameters();
212 for (int i = fromSignatureParameters.size(); i < toSignatureParameters.size(); i++) {
213 TypeMirror delegateToParameter = toSignatureParameters.get(i);
194 if (i < node.getChildExecutions().size()) { 214 if (i < node.getChildExecutions().size()) {
195 TypeMirror genericType = node.getGenericType(node.getChildExecutions().get(i)); 215 TypeMirror genericType = node.getGenericType(node.getChildExecutions().get(i));
196 if (!isSubtypeBoxed(context, genericType, delegateToParameter)) { 216 if (!isSubtypeBoxed(context, genericType, delegateToParameter)) {
197 return false; 217 return false;
198 } 218 }
204 224
205 public int compareTo(ExecutableTypeData o2) { 225 public int compareTo(ExecutableTypeData o2) {
206 ExecutableTypeData o1 = this; 226 ExecutableTypeData o1 = this;
207 ProcessorContext context = ProcessorContext.getInstance(); 227 ProcessorContext context = ProcessorContext.getInstance();
208 228
229 if (canDelegateTo(o2)) {
230 if (!o2.canDelegateTo(this)) {
231 return 1;
232 }
233 } else if (o2.canDelegateTo(this)) {
234 return -1;
235 }
236
209 int result = Integer.compare(o2.getEvaluatedCount(), o1.getEvaluatedCount()); 237 int result = Integer.compare(o2.getEvaluatedCount(), o1.getEvaluatedCount());
210 if (result != 0) { 238 if (result != 0) {
211 return result; 239 return result;
212 } 240 }
213 241
280 } else { 308 } else {
281 return ElementUtils.getSimpleName(signature1).compareTo(ElementUtils.getSimpleName(signature2)); 309 return ElementUtils.getSimpleName(signature1).compareTo(ElementUtils.getSimpleName(signature2));
282 } 310 }
283 } 311 }
284 312
313 public String getName() {
314 if (method != null) {
315 return method.getSimpleName().toString();
316 } else {
317 return getUniqueName();
318 }
319
320 }
321
322 private static String formatType(TypeMirror type) {
323 return type == null ? "null" : ElementUtils.getSimpleName(type);
324 }
325
285 @Override 326 @Override
286 public String toString() { 327 public String toString() {
287 return method != null ? ElementUtils.createReferenceName(method) : getUniqueName() + evaluatedParameters.toString(); 328 return String.format("%s %s(%s,%s)", formatType(getReturnType()), getName(), formatType(getFrameParameter()), getEvaluatedParameters());
288 } 329 }
289 330
290 public boolean sameParameters(ExecutableTypeData other) { 331 public boolean sameParameters(ExecutableTypeData other) {
291 if (!typeEquals(other.getFrameParameter(), getFrameParameter())) { 332 if (!typeEquals(other.getFrameParameter(), getFrameParameter())) {
292 return false; 333 return false;