]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/ApplyUnit.java
Builtins and JavaModule SCL modules may leak memory
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / java / ApplyUnit.java
1 package org.simantics.scl.compiler.elaboration.java;
2
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
4 import org.simantics.scl.compiler.constants.FunctionValue;
5 import org.simantics.scl.compiler.internal.codegen.references.Val;
6 import org.simantics.scl.compiler.internal.codegen.types.BTypes;
7 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
8 import org.simantics.scl.compiler.types.TVar;
9 import org.simantics.scl.compiler.types.Type;
10 import org.simantics.scl.compiler.types.Types;
11 import org.simantics.scl.compiler.types.exceptions.MatchException;
12 import org.simantics.scl.compiler.types.kinds.Kinds;
13
14 public class ApplyUnit extends FunctionValue {
15     
16     private static final TVar A = Types.var(Kinds.STAR);
17     private static final TVar E = Types.var(Kinds.EFFECT);
18     
19     public static final ApplyUnit INSTANCE = new ApplyUnit();
20     
21     private ApplyUnit() {
22         super(new TVar[] {A}, E, A, Types.functionE(Types.PUNIT, E, A));
23     }
24
25     @Override
26     public Type applyExact(MethodBuilder mb, Val[] parameters) {
27         parameters[0].push(mb);
28         mb.pushTuple0();
29         mb.genericApply(1);
30         try {
31             return BTypes.matchFunction(parameters[0].getType(), 1)[1];
32         } catch (MatchException e) {
33             throw new InternalCompilerError();
34         }   
35     }
36     
37     @Override
38     public String toString() {
39         return "applyUnit";
40     }
41
42 }