Esempio n. 1
0
        public void Volatile()
        {
            Action <_Volatile, int> d1 = (a, b) => { var x = a.Foo; x += b; a.Foo = b; };

            var ops = Sigil.Disassembler <Action <_Volatile, int> > .Disassemble(d1);

            var loadField = ops[1];

            Assert.AreEqual(OpCodes.Ldfld, loadField.OpCode);
            Assert.AreEqual(typeof(_Volatile).GetField("Foo"), loadField.Parameters.ElementAt(0));
            Assert.AreEqual(true, loadField.Parameters.ElementAt(1));
            Assert.IsTrue(ops.CanEmit);

            var    e1 = ops.EmitAll();
            string instrs;
            var    r1 = e1.CreateDelegate(out instrs);

            var v1 = new _Volatile();
            var v2 = new _Volatile();

            for (var i = 0; i < 100; i++)
            {
                d1(v1, i);
                r1(v2, i);

                Assert.AreEqual(v1.Foo, v2.Foo);
            }

            const string Pre4_6  = "ldarg.0\r\nvolatile.ldfld Int32 Foo\r\nstloc.0\r\nldloc.0\r\nldarg.1\r\nadd\r\nstloc.0\r\nldarg.0\r\nldarg.1\r\nvolatile.stfld Int32 Foo\r\nret\r\n";
            const string Post4_6 = "ldarg.1\r\nvolatile.ldfld Int32 Foo\r\npop\r\nldarg.1\r\nldarg.2\r\nvolatile.stfld Int32 Foo\r\nret\r\n";

            var isValid = Pre4_6 == instrs || Post4_6 == instrs;

            Assert.IsTrue(isValid, instrs);
        }
Esempio n. 2
0
        public void Volatile()
        {
            Action <_Volatile, int> d1 = (a, b) => { var x = a.Foo; x += b; a.Foo = b; };

            var ops = Sigil.Disassembler <Action <_Volatile, int> > .Disassemble(d1);

            var loadField = ops[1];

            Assert.Equal(OpCodes.Ldfld, loadField.OpCode);
            Assert.Equal(typeof(_Volatile).GetField("Foo"), loadField.Parameters.ElementAt(0));
            Assert.Equal(true, loadField.Parameters.ElementAt(1));
            Assert.True(ops.CanEmit);

            var e1 = ops.EmitAll();
            var r1 = e1.CreateDelegate(out string instrs);

            var v1 = new _Volatile();
            var v2 = new _Volatile();

            for (var i = 0; i < 100; i++)
            {
                d1(v1, i);
                r1(v2, i);

                Assert.Equal(v1.Foo, v2.Foo);
            }

            const string expected = @"ldarg.1
volatile.ldfld Int32 Foo
stloc.0
ldloc.0
ldarg.2
add
stloc.0
ldarg.1
ldarg.2
volatile.stfld Int32 Foo
ret
";

            Assert.Equal(expected, instrs, ignoreLineEndingDifferences: true);
        }
Esempio n. 3
0
        public void Volatile()
        {
            Action<_Volatile, int> d1 = (a, b) => { var x = a.Foo; x += b; a.Foo = b; };

            var ops = Sigil.Disassembler<Action<_Volatile, int>>.Disassemble(d1);

            var loadField = ops[1];
            Assert.AreEqual(OpCodes.Ldfld, loadField.OpCode);
            Assert.AreEqual(typeof(_Volatile).GetField("Foo"), loadField.Parameters.ElementAt(0));
            Assert.AreEqual(true, loadField.Parameters.ElementAt(1));
            Assert.IsTrue(ops.CanEmit);

            var e1 = ops.EmitAll();
            string instrs;
            var r1 = e1.CreateDelegate(out instrs);

            var v1 = new _Volatile();
            var v2 = new _Volatile();

            for (var i = 0; i < 100; i++)
            {
                d1(v1, i);
                r1(v2, i);

                Assert.AreEqual(v1.Foo, v2.Foo);
            }

            Assert.AreEqual("ldarg.0\r\nvolatile.ldfld Int32 Foo\r\nstloc.0\r\nldloc.0\r\nldarg.1\r\nadd\r\nstloc.0\r\nldarg.0\r\nldarg.1\r\nvolatile.stfld Int32 Foo\r\nret\r\n", instrs);
        }