X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Futils%2FMethodBuilderBase.java;h=7fb83fb49e3fd210dddd0ed7228a9febdaa792da;hp=0f56aba8e2fbeae1c22c8b8893d3091a8921326c;hb=a8758de5bc19e5adb3f618d3038743a164f09912;hpb=12d9af17384d960b75d58c3935d2b7b46d93e87b diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java index 0f56aba8e..7fb83fb49 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java @@ -429,6 +429,10 @@ public class MethodBuilderBase { public void newObject(TypeDesc type) { methodVisitor.visitTypeInsn(Opcodes.NEW, getClassName(type)); } + + public void newObject(String type) { + methodVisitor.visitTypeInsn(Opcodes.NEW, type); + } public void newObject(TypeDesc type, int dimensions) { methodVisitor.visitMultiANewArrayInsn(type.getDescriptor(), dimensions); @@ -576,4 +580,30 @@ public class MethodBuilderBase { public static String getClassName(Class clazz) { return clazz.getName().replace('.', '/'); } + + public void switch_(int[] values, Label[] labels, Label defaultLabel) { + int lo = values[0]; + int hi = values[values.length-1]; + long table_space_cost = 4 + ((long) hi - lo + 1); // words + long table_time_cost = 3; // comparisons + long lookup_space_cost = 3 + 2 * (long) values.length; + long lookup_time_cost = values.length; + if(values.length > 0 && + table_space_cost + 3 * table_time_cost <= + lookup_space_cost + 3 * lookup_time_cost) { + Label[] table = new Label[hi - lo + 1]; + for(int i=0,j=0;i