]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/generic/CallJava.java
Merge "List the unsatisfied dependencies in CanvasContext"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / generic / CallJava.java
1 package org.simantics.scl.compiler.constants.generic;\r
2 \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
10 \r
11 /**\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
14  */\r
15 public class CallJava extends FunctionValue {\r
16     StackItem[] stackItems;\r
17     MethodRef methodRef;\r
18     OutputFilter filter;\r
19     \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
28         }\r
29         this.stackItems = stackItems;\r
30         this.methodRef = methodRef;\r
31         this.filter = filter;\r
32     }\r
33 \r
34     @Override\r
35     public Type applyExact(MethodBuilder mb, Val[] parameters) {\r
36         methodRef.invoke(mb, stackItems, parameters);\r
37         if(filter != null)\r
38             filter.filter(mb);\r
39         return getReturnType();\r
40     }\r
41     \r
42     public MethodRef getMethodRef() {\r
43         return methodRef;\r
44     }\r
45     \r
46     @Override\r
47     public String toString() {\r
48         return methodRef.getName();\r
49     }\r
50 \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
55     \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
63 \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
68                 continue;\r
69             if(!validator.isAssignableFrom(ps1[i], ps2[i])) {\r
70                 lessOrEqual = false;\r
71             }\r
72             if(!validator.isAssignableFrom(ps2[i], ps1[i])) {\r
73                 greaterOrEqual = false;\r
74             }\r
75         }\r
76         if(lessOrEqual) {\r
77             if(greaterOrEqual)\r
78                 return EQUAL;\r
79             else\r
80                 return LESS;\r
81         }\r
82         else {\r
83             if(greaterOrEqual)\r
84                 return GREATER;\r
85             else\r
86                 return INCOMPARABLE;\r
87         }\r
88     }\r
89     \r
90     @Override\r
91     public void prepare(MethodBuilder mb) {\r
92         for(StackItem item : stackItems)\r
93             item.prepare(mb);\r
94     }\r
95 }\r