Example #1
0
        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);
        }
Example #2
0
        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));
        }
Example #3
0
        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));
        }
Example #4
0
 internal ExceptionBlock(Label label)
 {
     Label = label;
 }