]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/EmptyListConstructor.java
Builtins and JavaModule SCL modules may leak memory
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / java / EmptyListConstructor.java
1 package org.simantics.scl.compiler.elaboration.java;
2
3 import org.cojen.classfile.TypeDesc;
4 import org.objectweb.asm.Label;
5 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
6 import org.simantics.scl.compiler.constants.Constant;
7 import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
8 import org.simantics.scl.compiler.internal.codegen.references.IVal;
9 import org.simantics.scl.compiler.internal.codegen.utils.Constants;
10 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
11 import org.simantics.scl.compiler.types.TVar;
12 import org.simantics.scl.compiler.types.Types;
13 import org.simantics.scl.compiler.types.kinds.Kinds;
14
15
16 public class EmptyListConstructor extends Constant {
17     
18     private static final TVar A = Types.var(Kinds.STAR);
19
20     public EmptyListConstructor() {
21         super(Types.forAll(A, Types.list(A)));
22     }
23     
24     @Override
25     public void push(MethodBuilder mb) {
26         mb.loadStaticField("java/util/Collections", "EMPTY_LIST", Constants.LIST);
27     }
28     
29     @Override
30     public void deconstruct(MethodBuilder mb, IVal parameter, Cont success,
31             Label failure) {
32         if(failure == null)
33             throw new InternalCompilerError("List deconstruction may always fail");
34         
35         parameter.push(mb);
36         mb.invokeInterface(Constants.LIST, "size", TypeDesc.INT, Constants.EMPTY_TYPEDESC_ARRAY);
37         mb.ifZeroComparisonBranch(failure, "!=");
38         mb.jump(success);
39     }
40     
41     @Override
42     public int constructorTag() {
43         return 0;
44     }
45     
46 }