1 package org.simantics.scl.compiler.constants.generic;
3 import java.util.ArrayList;
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;
10 public enum ConvertToListFilter implements OutputFilter {
13 private static final TypeDesc ARRAY_LIST = TypeDesc.forClass(ArrayList.class);
14 private static final TypeDesc[] CONVERSION_PARAMS =
15 new TypeDesc[] {Constants.COLLECTION};
18 public void filter(MethodBuilder mb) {
19 Label conversionNeeded = mb.createLabel();
20 Label endFilter = mb.createLabel();
23 mb.instanceOf(Constants.LIST);
24 mb.ifZeroComparisonBranch(conversionNeeded, "==");
26 // no conversion needed
27 mb.checkCast(Constants.LIST);
31 mb.setLocation(conversionNeeded);
33 mb.newObject(ARRAY_LIST);
36 mb.invokeConstructor(ARRAY_LIST, CONVERSION_PARAMS);
39 mb.setLocation(endFilter);