internal static unsafe void ConstructIL(RuntimeIshtarMethod method, byte[] body, short stacksize, RuntimeIshtarModule module) { var offset = 0; var body_r = ILReader.Deconstruct(body, &offset, method); var labels = ILReader.DeconstructLabels(body, &offset); var exceptions = ILReader.DeconstructExceptions(body, offset, module); method.Header.max_stack = stacksize; method.Header.exception_handler_list = exceptions; method.Header.code = (uint *)Marshal.AllocHGlobal(sizeof(uint) * body_r.opcodes.Count); for (var i = 0; i != body_r.opcodes.Count; i++) { method.Header.code[i] = body_r.opcodes[i]; } method.Header.code_size = (uint)body_r.opcodes.Count; method.Header.labels = labels; method.Header.labels_map = body_r.map.ToDictionary(x => x.Key, x => new ILLabel { opcode = x.Value.opcode, pos = x.Value.pos }); }
public unsafe void DeconstructOpcodes3() { var gen = CreateGenerator(); var l1 = gen.DefineLabel(); var l2 = gen.DefineLabel(); gen.Emit(OpCodes.ADD); gen.Emit(OpCodes.LDC_I4_S, 228); gen.Emit(OpCodes.ADD); gen.Emit(OpCodes.JMP_HQ, l2); gen.Emit(OpCodes.LDC_I4_S, 228); gen.Emit(OpCodes.ADD); gen.Emit(OpCodes.LDC_I4_S, 228); gen.Emit(OpCodes.LDC_I4_S, 228); gen.Emit(OpCodes.ADD); gen.Emit(OpCodes.JMP_HQ, l1); gen.UseLabel(l1); gen.Emit(OpCodes.SUB); gen.Emit(OpCodes.SUB); gen.UseLabel(l2); gen.Emit(OpCodes.SUB); gen.Emit(OpCodes.SUB); var offset = 0; var body = gen.BakeByteArray(); var(result, map) = ILReader.Deconstruct(body, &offset, null); var labels = ILReader.DeconstructLabels(body, &offset); var first_label = result[map[labels[0]].pos]; Assert.AreEqual(first_label, OpCodes.SUB.Value); //Assert.AreEqual(second_label, OpCodes.SUB.Value); Assert.AreEqual(OpCodes.ADD.Value, result[0]); Assert.AreEqual(OpCodes.LDC_I4_S.Value, result[1]); Assert.AreEqual((uint)228, result[2]); }