public void toDoBody(CFHelper cFHelper, MethodDef method, Blocks blocks, PandaContext pandaContext) { blocks.Scramble(out blocks); method.Body.Instructions.Clear(); Local local = new Local(pandaContext.moduleDef.CorLibTypes.Int32); method.Body.Variables.Add(local); Instruction target = Instruction.Create(OpCodes.Nop); Instruction instr = Instruction.Create(OpCodes.Br, target); foreach (Instruction instruction in cFHelper.Calc(0)) { method.Body.Instructions.Add(instruction); } method.Body.Instructions.Add(Instruction.Create(OpCodes.Stloc, local)); method.Body.Instructions.Add(Instruction.Create(OpCodes.Br, instr)); method.Body.Instructions.Add(target); foreach (Block block in blocks.blocks) { if (block != blocks.getBlock((blocks.blocks.Count - 1))) { method.Body.Instructions.Add(Instruction.Create(OpCodes.Ldloc, local)); foreach (Instruction instruction in cFHelper.Calc(block.ID)) { method.Body.Instructions.Add(instruction); } method.Body.Instructions.Add(Instruction.Create(OpCodes.Ceq)); Instruction instruction4 = Instruction.Create(OpCodes.Nop); method.Body.Instructions.Add(Instruction.Create(OpCodes.Brfalse, instruction4)); foreach (Instruction instruction in block.instructions) { method.Body.Instructions.Add(instruction); } foreach (Instruction instruction in cFHelper.Calc(block.nextBlock)) { method.Body.Instructions.Add(instruction); } method.Body.Instructions.Add(Instruction.Create(OpCodes.Stloc, local)); method.Body.Instructions.Add(instruction4); } } method.Body.Instructions.Add(Instruction.Create(OpCodes.Ldloc, local)); foreach (Instruction instruction in cFHelper.Calc(blocks.blocks.Count - 1)) { method.Body.Instructions.Add(instruction); } method.Body.Instructions.Add(Instruction.Create(OpCodes.Ceq)); method.Body.Instructions.Add(Instruction.Create(OpCodes.Brfalse, instr)); method.Body.Instructions.Add(Instruction.Create(OpCodes.Br, blocks.getBlock((blocks.blocks.Count - 1)).instructions[0])); method.Body.Instructions.Add(instr); foreach (Instruction lastBlock in blocks.getBlock((blocks.blocks.Count - 1)).instructions) { method.Body.Instructions.Add(lastBlock); } }
public void toDoSwitcher(CFHelper cFHelper, MethodDef method, Blocks blocks, PandaContext pandaContext) { List <Instruction> instructionsOperand = new List <Instruction>(); method.Body.Instructions.Clear(); Local local = new Local(pandaContext.moduleDef.CorLibTypes.Int32); method.Body.Variables.Add(local); foreach (Instruction instruction in cFHelper.Calc(0)) { method.Body.Instructions.Add(instruction); } method.Body.Instructions.Add(Instruction.Create(OpCodes.Stloc, local)); Instruction target = Instruction.Create(OpCodes.Nop); method.Body.Instructions.Add(target); method.Body.Instructions.Add(Instruction.Create(OpCodes.Ldloc, local)); Instruction targetSwitch = Instruction.Create(OpCodes.Switch, instructionsOperand); method.Body.Instructions.Add(targetSwitch); method.Body.Instructions.Add(Instruction.Create(OpCodes.Br, blocks.getBlock((blocks.blocks.Count - 1)).instructions[blocks.getBlock((blocks.blocks.Count - 1)).instructions.Count - 1])); foreach (Block block in blocks.blocks) { if (block != blocks.getBlock((blocks.blocks.Count - 1))) { Instruction instr = Instruction.Create(OpCodes.Stloc, local); instructionsOperand.Add(block.instructions[0]); Instruction instruction4 = Instruction.Create(OpCodes.Nop); foreach (Instruction instruction in block.instructions) { method.Body.Instructions.Add(instruction); } foreach (Instruction instruction in cFHelper.Calc(block.nextBlock)) { method.Body.Instructions.Add(instruction); } method.Body.Instructions.Add(instr); method.Body.Instructions.Add(instruction4); method.Body.Instructions.Add(new Instruction(OpCodes.Br, target)); method.Body.Instructions.Add(instruction4); } } method.Body.Instructions.Add(Instruction.Create(OpCodes.Br, blocks.getBlock((blocks.blocks.Count - 1)).instructions[0])); method.Body.Instructions.Add(new Instruction(OpCodes.Br, target)); foreach (Instruction lastBlock in blocks.getBlock((blocks.blocks.Count - 1)).instructions) { method.Body.Instructions.Add(lastBlock); } instructionsOperand.Add(blocks.getBlock((blocks.blocks.Count - 1)).instructions[0]); targetSwitch.Operand = instructionsOperand; }