package org.simantics.scl.compiler.internal.codegen.ssa.exits; import java.util.ArrayList; import java.util.Arrays; import org.objectweb.asm.Label; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.constants.BooleanConstant; import org.simantics.scl.compiler.constants.IntegerConstant; import org.simantics.scl.compiler.constants.NoRepConstant; import org.simantics.scl.compiler.internal.codegen.continuations.BranchRef; import org.simantics.scl.compiler.internal.codegen.continuations.Cont; import org.simantics.scl.compiler.internal.codegen.continuations.ContRef; import org.simantics.scl.compiler.internal.codegen.references.Val; import org.simantics.scl.compiler.internal.codegen.references.ValRef; import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock; import org.simantics.scl.compiler.internal.codegen.ssa.SSAExit; import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder; import org.simantics.scl.compiler.internal.codegen.utils.CopyContext; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext; import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext; import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext; import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import gnu.trove.map.hash.TIntObjectHashMap; public class Switch extends SSAExit implements ValRefBinder { ValRef scrutinee; BranchRef[] branches; public Switch(ValRef scrutinee, BranchRef[] branches) { this.scrutinee = scrutinee; this.branches = branches; scrutinee.setParent(this); for(BranchRef branch : branches) branch.cont.setParent(this); } public ValRef getScrutinee() { return scrutinee; } public BranchRef[] getBranches() { return branches; } private boolean isIntegerSwitch() { if(scrutinee.getType() != Types.INTEGER) return false; for(BranchRef branch : branches) if(branch.constructor != null && !(branch.constructor instanceof IntegerConstant)) return false; return true; } private void generateIntegerSwitch(MethodBuilder mb) { int defaultId; for(defaultId=0;defaultId labelMap = new TIntObjectHashMap