Mercurial > hg > graal-jvmci-8
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; |