public void LeaveDataOnStackBetweenBranches() { var il = Emit <Func <int> > .NewDynamicMethod("LeaveDataOnStackBetweenBranches", doVerify : false); Sigil.Label b0 = il.DefineLabel("b0"), b1 = il.DefineLabel("b1"), b2 = il.DefineLabel("b2"); il.LoadConstant("abc"); il.Branch(b0); // jump to b0 with "abc" il.MarkLabel(b1); // incoming: 3 il.LoadConstant(4); il.Call(typeof(Math).GetMethod("Max", new[] { typeof(int), typeof(int) })); il.Branch(b2); // jump to b2 with 4 il.MarkLabel(b0); // incoming: "abc" il.CallVirtual(typeof(string).GetProperty("Length").GetGetMethod()); il.Branch(b1); // jump to b1 with 3 il.MarkLabel(b2); // incoming: 4 il.Return(); int i = il.CreateDelegate()(); Assert.AreEqual(4, i); }
public void BigSwitch() { var e1 = Emit <Func <uint, uint> > .NewDynamicMethod(); // prep labels var before = e1.DefineLabel(); var first = e1.DefineLabel(); var defaultLabel = e1.DefineLabel(); // prep switch targets var labels = new Sigil.Label[30]; for (int i = 1; i < labels.Length; i++) { labels[i] = defaultLabel; } labels[0] = first; // emit trivial switch e1.MarkLabel(before); e1.LoadArgument(0); e1.Switch(labels); e1.MarkLabel(defaultLabel); e1.LoadConstant(0u); e1.StoreArgument(0); e1.Branch(before); e1.MarkLabel(first); e1.LoadArgument(0); e1.Return(); var del = e1.CreateDelegate(); Assert.AreEqual(0u, del(42)); }
public void BigSwitch() { var e1 = Emit<Func<uint, uint>>.NewDynamicMethod(); // prep labels var before = e1.DefineLabel(); var first = e1.DefineLabel(); var defaultLabel = e1.DefineLabel(); // prep switch targets var labels = new Sigil.Label[30]; for (int i = 1; i < labels.Length; i++) labels[i] = defaultLabel; labels[0] = first; // emit trivial switch e1.MarkLabel(before); e1.LoadArgument(0); e1.Switch(labels); e1.MarkLabel(defaultLabel); e1.LoadConstant(0u); e1.StoreArgument(0); e1.Branch(before); e1.MarkLabel(first); e1.LoadArgument(0); e1.Return(); var del = e1.CreateDelegate(); Assert.AreEqual(0u, del(42)); }
internal ExceptionBlock(Label label) { Label = label; }