public void ShortInlineI()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x1F, 0x12, // ldc.i4.s 0x12
                0x2A        // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Ldc_I4_S, (sbyte)0x12),
                new CilInstruction(2, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
        public void InlineI8()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x21, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, // ldc.i8 0x0102030405060708
                0x2A                                                  // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Ldc_I8, 0x0102030405060708),
                new CilInstruction(9, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
        public void ShortInlineVariable()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x11, 0x01,  // ldloc.s 1
                0x2A         // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Ldloc_S, (byte)1),
                new CilInstruction(2, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
        public void InlineTok()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0xD0, 0x02, 0x00, 0x00, 0x01, // ldtoken 0x01000002
                0x2A                          // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Ldtoken, new MetadataToken(0x01000002)),
                new CilInstruction(5, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
        public void InlineArgument()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0xFE, 0x09, 0x01, 0x00,  // ldarg 1
                0x2A                     // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Ldarg, (ushort)1),
                new CilInstruction(4, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
        public void InlineMethod()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x28, 0x01, 0x00, 0x00, 0x0A, // call 0x0A000001
                0x2A                          // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Call, new MetadataToken(0x0A000001)),
                new CilInstruction(5, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
示例#7
0
        public void InlineI()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x20, 0x04, 0x03, 0x02, 0x01, // ldc.i4 0x01020304
                0x2A                          // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Ldc_I4, 0x01020304),
                new CilInstruction(5, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadInstructions());
        }
        public void InlineType()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x02,                         // ldarg.0
                0x74, 0x02, 0x00, 0x00, 0x01, // castclass 0x01000002
                0x2A                          // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Ldarg_0),
                new CilInstruction(1, CilOpCodes.Castclass, new MetadataToken(0x01000002)),
                new CilInstruction(6, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
        public void InlineBrTarget()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x38, 0x02, 0x00, 0x00, 0x00, // br IL_0007
                0x00,                         // nop
                0x00,                         // nop
                0x2A                          // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Br, new CilOffsetLabel(0x0007)),
                new CilInstruction(5, CilOpCodes.Nop),
                new CilInstruction(6, CilOpCodes.Nop),
                new CilInstruction(7, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
示例#10
0
        public void ShortInlineBrTarget()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x2B, 0x02, // br IL_0004
                0x00,       // nop
                0x00,       // nop
                0x2A        // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Br_S, new CilOffsetLabel(0x0004)),
                new CilInstruction(2, CilOpCodes.Nop),
                new CilInstruction(3, CilOpCodes.Nop),
                new CilInstruction(4, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadInstructions());
        }
示例#11
0
        public void InlineSwitch()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x45, 0x03, 0x00, 0x00, 0x00,  // switch
                0x02, 0x00, 0x00, 0x00,        // IL_0013
                0x04, 0x00, 0x00, 0x00,        // IL_0015
                0x06, 0x00, 0x00, 0x00,        // IL_0017
                0x00,                          // nop
                0x00,                          // nop
                0x00,                          // nop
                0x00,                          // nop
                0x00,                          // nop
                0x00,                          // nop
                0x2A                           // ret
            });

            var expectedLabels = new[] { 0x0013, 0x0015, 0x0017 }
            .Select(offset => new CilOffsetLabel(offset))
            .Cast <ICilLabel>()
            .ToArray();

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Switch, expectedLabels),
                new CilInstruction(17, CilOpCodes.Nop),
                new CilInstruction(18, CilOpCodes.Nop),
                new CilInstruction(19, CilOpCodes.Nop),
                new CilInstruction(20, CilOpCodes.Nop),
                new CilInstruction(21, CilOpCodes.Nop),
                new CilInstruction(22, CilOpCodes.Nop),
                new CilInstruction(23, CilOpCodes.Ret)
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }
示例#12
0
        public void InlineNone()
        {
            var rawCode = new DataSegment(new byte[]
            {
                0x00, // nop
                0x17, // ldc.i4.1
                0x18, // ldc.i4.2
                0x58, // add
                0x2A  // ret
            });

            var expected = new[]
            {
                new CilInstruction(0, CilOpCodes.Nop),
                new CilInstruction(1, CilOpCodes.Ldc_I4_1),
                new CilInstruction(2, CilOpCodes.Ldc_I4_2),
                new CilInstruction(3, CilOpCodes.Add),
                new CilInstruction(4, CilOpCodes.Ret),
            };

            var disassembler = new CilDisassembler(rawCode.CreateReader());

            Assert.Equal(expected, disassembler.ReadAllInstructions());
        }