package org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.Instructions; import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.BytecodeGenerator; import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.CodeBlock; import org.rascalmpl.value.IList; import org.rascalmpl.value.IListWriter; import org.rascalmpl.value.IString; import org.rascalmpl.value.IValue; public class TypeSwitch extends Instruction { IList labels; public TypeSwitch(CodeBlock ins, IList labels){ super(ins, Opcode.TYPESWITCH); this.labels = labels; } public String toString() { String res = "TYPESWITCH "; String sep = ""; for(IValue vlabel : labels){ String label = ((IString) vlabel).getValue(); res += sep + label; sep = ", "; } return res; } public void generate(){ IListWriter w = codeblock.vf.listWriter(); for(IValue vlabel : labels){ String label = ((IString) vlabel).getValue(); w.append(codeblock.vf.integer(codeblock.getLabelPC(label))); } codeblock.addCode1(opcode.getOpcode(), codeblock.getConstantIndex(w.done())); } public void generateByteCode(BytecodeGenerator codeEmittor, boolean debug){ if (debug) codeEmittor.emitDebugCall(opcode.name()); codeEmittor.emitInlineTypeSwitch(labels,debug) ; } }