public virtual void Insert(int addr, Bytecode opcode, string s)
{
//System.out.println("before insert of "+opcode+"("+s+"):"+ Arrays.toString(impl.instrs));
EnsureCapacity(1 + Instruction.OperandSizeInBytes);
int instrSize = 1 + Instruction.OperandSizeInBytes;
// make room for opcode, opnd
Array.Copy(impl.instrs, addr, impl.instrs, addr + instrSize, ip - addr);
int save = ip;
ip = addr;
Emit1(null, opcode, s);
ip = save + instrSize;
//System.out.println("after insert of "+opcode+"("+s+"):"+ Arrays.toString(impl.instrs));
// adjust addresses for BR and BRF
int a = addr + instrSize;
while (a < ip)
{
Bytecode op = (Bytecode)impl.instrs[a];
Instruction I = Instruction.instructions[(int)op];
if (op == Bytecode.INSTR_BR || op == Bytecode.INSTR_BRF)
{
int opnd = BytecodeDisassembler.GetShort(impl.instrs, a + 1);
WriteShort(impl.instrs, a + 1, (short)(opnd + instrSize));
}
a += I.nopnds * Instruction.OperandSizeInBytes + 1;
}
//System.out.println("after insert of "+opcode+"("+s+"):"+ Arrays.toString(impl.instrs));
}