Beispiel #1
0
        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
            });
        }
Beispiel #2
0
    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]);
    }