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); }
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); }
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); }