]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/singletons/JustConstant.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / singletons / JustConstant.java
1 package org.simantics.scl.compiler.constants.singletons;\r
2 \r
3 import org.cojen.classfile.TypeDesc;\r
4 import org.objectweb.asm.Label;\r
5 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
6 import org.simantics.scl.compiler.constants.FunctionValue;\r
7 import org.simantics.scl.compiler.constants.GetPrimitiveConstant;\r
8 import org.simantics.scl.compiler.constants.LocalVariableConstant;\r
9 import org.simantics.scl.compiler.constants.NoRepConstant;\r
10 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;\r
11 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
12 import org.simantics.scl.compiler.internal.codegen.references.Val;\r
13 import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;\r
14 import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable;\r
15 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;\r
16 import org.simantics.scl.compiler.types.TVar;\r
17 import org.simantics.scl.compiler.types.Type;\r
18 import org.simantics.scl.compiler.types.Types;\r
19 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
20 import org.simantics.scl.compiler.types.kinds.Kinds;\r
21 \r
22 public class JustConstant extends FunctionValue {\r
23     \r
24     private static final TVar A = Types.var(Kinds.STAR);\r
25     public static final JustConstant INSTANCE = new JustConstant();\r
26     \r
27     private JustConstant() {\r
28         super(new TVar[] {A}, Types.NO_EFFECTS, Types.apply(Types.MAYBE, A), A);\r
29     }\r
30     \r
31     @Override\r
32     public Type applyExact(MethodBuilder mb, Val[] parameters) {                \r
33         parameters[0].push(mb);\r
34         mb.box(parameters[0].getType());\r
35         return getReturnType();\r
36     }\r
37     \r
38     @Override\r
39     public void deconstruct(MethodBuilder mb, IVal parameter,\r
40             Cont success, Label failure) {\r
41         Type componentType;\r
42         try {\r
43             componentType = Types.matchApply(Types.MAYBE, parameter.getType());\r
44         } catch (MatchException e) {\r
45             throw new InternalCompilerError();\r
46         }\r
47         TypeDesc componentTypeDesc =\r
48                 mb.getJavaTypeTranslator().toTypeDesc(componentType);\r
49         \r
50         if(failure == null) {\r
51             IVal val = componentTypeDesc.isPrimitive() \r
52                     ? new GetPrimitiveConstant(componentType, parameter, componentTypeDesc)\r
53                     : parameter;\r
54             mb.jump(success, val);\r
55         }\r
56         else {\r
57             Label failureLabel = mb.createLabel();\r
58             \r
59             parameter.push(mb);\r
60             mb.dup();\r
61             mb.ifNullBranch(failureLabel, true);\r
62             \r
63             if(componentTypeDesc.equals(TypeDesc.VOID)) {\r
64                 mb.pop();\r
65                 mb.jump(success, new NoRepConstant(componentType));\r
66             }\r
67             else {\r
68                 if(componentTypeDesc.isPrimitive())\r
69                     mb.convert(JavaTypeTranslator.toObjectType(componentTypeDesc), componentTypeDesc);\r
70                 \r
71                 LocalVariable lv = mb.createLocalVariable("temp", componentTypeDesc);\r
72                 mb.storeLocal(lv);\r
73                 \r
74                 mb.jump(success, new LocalVariableConstant(componentType, lv));\r
75             }\r
76             \r
77             //\r
78             mb.setLocation(failureLabel);\r
79             mb.pop();\r
80             mb.branch(failure);\r
81         }\r
82     }\r
83     public int constructorTag() {\r
84         return 1;\r
85     }\r
86     @Override\r
87     public String toString() {\r
88         return "Just";\r
89     }\r
90 }