]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/generic/ConvertToListFilter.java
(refs #7250) Merging master, minor CHR bugfixes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / generic / ConvertToListFilter.java
1 package org.simantics.scl.compiler.constants.generic;
2
3 import java.util.ArrayList;
4
5 import org.cojen.classfile.TypeDesc;
6 import org.objectweb.asm.Label;
7 import org.simantics.scl.compiler.internal.codegen.utils.Constants;
8 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
9
10 public enum ConvertToListFilter implements OutputFilter {
11     INSTANCE;
12
13     private static final TypeDesc ARRAY_LIST = TypeDesc.forClass(ArrayList.class);
14     private static final TypeDesc[] CONVERSION_PARAMS =
15             new TypeDesc[] {Constants.COLLECTION};
16     
17     @Override
18     public void filter(MethodBuilder mb) {
19         Label conversionNeeded = mb.createLabel();
20         Label endFilter = mb.createLabel();
21         
22         mb.dup();
23         mb.instanceOf(Constants.LIST);        
24         mb.ifZeroComparisonBranch(conversionNeeded, "==");
25         
26         // no conversion needed
27         mb.checkCast(Constants.LIST);
28         mb.branch(endFilter);
29         
30         // conversion needed
31         mb.setLocation(conversionNeeded);
32         
33         mb.newObject(ARRAY_LIST);
34         mb.dupX1();
35         mb.swap();
36         mb.invokeConstructor(ARRAY_LIST, CONVERSION_PARAMS);
37         
38         // end
39         mb.setLocation(endFilter);
40     }
41
42 }