]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/HashCodeFunction.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / java / HashCodeFunction.java
1 package org.simantics.scl.compiler.elaboration.java;\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.utils.Constants;\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 import org.simantics.scl.compiler.types.Types;\r
11 import org.simantics.scl.compiler.types.kinds.Kinds;\r
12 \r
13 public class HashCodeFunction extends FunctionValue {\r
14     private static final TVar A = Types.var(Kinds.STAR);\r
15     public static final HashCodeFunction INSTANCE = new HashCodeFunction();\r
16     \r
17     private HashCodeFunction() {\r
18         super(new TVar[] {A}, Types.NO_EFFECTS, Types.INTEGER, A);\r
19     }\r
20 \r
21     @Override\r
22     public Type applyExact(MethodBuilder mb, Val[] parameters) {\r
23         TypeDesc parameterType = mb.getJavaTypeTranslator().getTypeDesc(parameters[0]);\r
24         parameters[0].push(mb);\r
25         switch(parameterType.getTypeCode()) {\r
26         case TypeDesc.VOID_CODE:\r
27             mb.loadStaticField(Constants.TUPLE0, "INSTANCE", Constants.TUPLE0);\r
28             mb.invokeVirtual("java/lang/Object", "hashCode", TypeDesc.INT, Constants.OBJECTS[1]);\r
29             break;\r
30         case TypeDesc.OBJECT_CODE:\r
31             mb.invokeStatic("java/util/Objects", "hashCode", TypeDesc.INT, Constants.OBJECTS[1]);\r
32             break;\r
33         case TypeDesc.INT_CODE:\r
34             mb.invokeStatic("java/lang/Integer", "hashCode", TypeDesc.INT, new TypeDesc[] {TypeDesc.INT});\r
35             break;\r
36         case TypeDesc.LONG_CODE:\r
37             mb.invokeStatic("java/lang/Long", "hashCode", TypeDesc.LONG, new TypeDesc[] {TypeDesc.LONG});\r
38             break;\r
39         case TypeDesc.DOUBLE_CODE:\r
40             mb.invokeStatic("java/lang/Double", "hashCode", TypeDesc.DOUBLE, new TypeDesc[] {TypeDesc.DOUBLE});\r
41             break;\r
42         case TypeDesc.FLOAT_CODE:\r
43             mb.invokeStatic("java/lang/Float", "hashCode", TypeDesc.FLOAT, new TypeDesc[] {TypeDesc.FLOAT});\r
44             break;\r
45         case TypeDesc.SHORT_CODE:\r
46             mb.invokeStatic("java/lang/Short", "hashCode", TypeDesc.SHORT, new TypeDesc[] {TypeDesc.SHORT});\r
47             break;\r
48         }\r
49         return Types.INTEGER;\r
50     }\r
51 }\r