1 package org.simantics.scl.compiler.constants.generic;
\r
3 import org.cojen.classfile.TypeDesc;
\r
4 import org.simantics.scl.compiler.constants.FunctionValue;
\r
5 import org.simantics.scl.compiler.internal.codegen.references.Val;
\r
6 import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidator;
\r
7 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
\r
8 import org.simantics.scl.compiler.types.TVar;
\r
9 import org.simantics.scl.compiler.types.Type;
\r
12 * This class represents a call to a Java method as an SCL function value.
\r
13 * It is instantiated by the {@link org.simantics.scl.compiler.compilation.Elaboration.matchType(MethodRef, Type)} method.
\r
15 public class CallJava extends FunctionValue {
\r
16 StackItem[] stackItems;
\r
17 MethodRef methodRef;
\r
18 OutputFilter filter;
\r
20 public CallJava(TVar[] typeParameters, Type effect, Type returnType,
\r
21 Type[] parameterTypes, StackItem[] stackItems, MethodRef methodRef,
\r
22 OutputFilter filter) {
\r
23 super(typeParameters, effect, returnType, parameterTypes);
\r
24 if(stackItems == null) {
\r
25 stackItems = new StackItem[parameterTypes.length];
\r
26 for(int i=0;i<parameterTypes.length;++i)
\r
27 stackItems[i] = new ParameterStackItem(i, parameterTypes[i]);
\r
29 this.stackItems = stackItems;
\r
30 this.methodRef = methodRef;
\r
31 this.filter = filter;
\r
35 public Type applyExact(MethodBuilder mb, Val[] parameters) {
\r
36 methodRef.invoke(mb, stackItems, parameters);
\r
39 return getReturnType();
\r
42 public MethodRef getMethodRef() {
\r
47 public String toString() {
\r
48 return methodRef.getName();
\r
51 public final static int INCOMPARABLE = -2;
\r
52 public final static int LESS = -1;
\r
53 public final static int EQUAL = 0;
\r
54 public final static int GREATER = 1;
\r
56 public int compareTo(JavaReferenceValidator validator, CallJava other) {
\r
57 MethodRef m1 = methodRef;
\r
58 MethodRef m2 = other.methodRef;
\r
59 TypeDesc[] ps1 = m1.getParameterTypes();
\r
60 TypeDesc[] ps2 = m2.getParameterTypes();
\r
61 if(ps1.length != ps2.length)
\r
62 return INCOMPARABLE;
\r
64 boolean lessOrEqual = true;
\r
65 boolean greaterOrEqual = true;
\r
66 for(int i=0;i<ps1.length;++i) {
\r
67 if(ps1[i].equals(ps2[i]))
\r
69 if(!validator.isAssignableFrom(ps1[i], ps2[i])) {
\r
70 lessOrEqual = false;
\r
72 if(!validator.isAssignableFrom(ps2[i], ps1[i])) {
\r
73 greaterOrEqual = false;
\r
86 return INCOMPARABLE;
\r
91 public void prepare(MethodBuilder mb) {
\r
92 for(StackItem item : stackItems)
\r