Example #1
0
        public void ForEachEnumerableOk()
        {
            var method = EmitEx.CreateMethod <Func <IEnumerable, int> >();
            var il     = method.GetILGenerator();
            var s      = il.DeclareLocal(typeof(int));

            il.EmitLdcI4(0);
            il.EmitStloc(s);
            il.EmitLdarg(0);
            il.EmitForEach(typeof(IEnumerable),
                           c =>
            {
                il.EmitUnBoxAnyOrCastClass(typeof(int));
                il.EmitLdloc(s);
                il.Emit(OpCodes.Add);
                il.EmitStloc(s);
            });
            il.EmitLdloc(s);
            il.Emit(OpCodes.Ret);
            var del  = method.CreateDelegate <Func <IEnumerable, int> >();
            var list = new List <object>(Enumerable.Range(0, 6).Cast <object>());

            /*list.Insert(2, "test");
             * list.Insert(4, 2.3);
             * list.Add(null);*/
            Assert.Equal(Enumerable.Range(0, 6).Sum(), del(list));
            Assert.Equal(Enumerable.Range(0, 4).Sum(), del(Enumerable.Range(0, 4)));
        }
Example #2
0
        public JsonWriterMember(FieldInfo f, PropertyInfo p)
        {
            MemberInfo memberInfo;
            Type       type;

            if (f != null)
            {
                memberInfo    = f;
                type          = f.FieldType;
                this.GetValue = EmitEx.CreateGet(f, null);
            }
            else
            {
                memberInfo    = p;
                type          = p.PropertyType;
                this.GetValue = EmitEx.CreateGet(p, null);
            }
            JsonNameAttribute customAttribute = memberInfo.GetCustomAttribute <JsonNameAttribute>();

            this.JsonName = ((customAttribute != null) ? Json.Encode(customAttribute.Name) : memberInfo.Name);
            JsonFormatAttribute customAttribute2 = memberInfo.GetCustomAttribute <JsonFormatAttribute>();

            if (customAttribute2 != null && typeof(IFormattable).IsAssignableFrom(Nullable.GetUnderlyingType(type) ?? type))
            {
                this.FormatString   = customAttribute2.Format;
                this.FormatProvider = customAttribute2.Provider;
            }
        }
Example #3
0
        public void CastToBoxTest()
        {
            var method = EmitEx.CreateMethod <Func <int, object> >();
            var il     = method.GetILGenerator();

            il.EmitLdarg(0);
            il.EmitCast(typeof(int), typeof(object));
            il.Emit(OpCodes.Ret);
            var del = method.CreateDelegate <Func <int, object> >();

            Assert.Equal(1, del(1));
            Assert.Equal(5, del(5));
        }
Example #4
0
        public void CastFromOpTest()
        {
            var method = EmitEx.CreateMethod <Func <int, SomeClass> >();
            var il     = method.GetILGenerator();

            il.EmitLdarg(0);
            il.EmitCast(typeof(int), typeof(SomeClass));
            il.Emit(OpCodes.Ret);
            var del = method.CreateDelegate <Func <int, SomeClass> >();

            Assert.Equal(1, del(1).SomeField);
            Assert.Equal(5, del(5).SomeField);
        }
Example #5
0
        public void CastToCastClassFromObjectTest()
        {
            var method = EmitEx.CreateMethod <Func <object, string> >();
            var il     = method.GetILGenerator();

            il.EmitLdarg(0);
            il.EmitCast(typeof(object), typeof(string));
            il.Emit(OpCodes.Ret);
            var del = method.CreateDelegate <Func <object, string> >();

            Assert.Equal("1", del("1"));
            Assert.Equal("5", del("5"));
        }
Example #6
0
        public void CastToOpTest()
        {
            var method = EmitEx.CreateMethod <Func <SomeClass, int> >();
            var il     = method.GetILGenerator();

            il.EmitLdarg(0);
            il.EmitCast(typeof(SomeClass), typeof(int));
            il.Emit(OpCodes.Ret);
            var del = method.CreateDelegate <Func <SomeClass, int> >();

            Assert.Equal(1, del(new SomeClass {
                SomeField = 1
            }));
            Assert.Equal(5, del(new SomeClass {
                SomeField = 5
            }));
        }
Example #7
0
        public void ForOk()
        {
            var method = EmitEx.CreateMethod <Func <int, int> >();
            var il     = method.GetILGenerator();
            var s      = il.DeclareLocal(typeof(int));
            var i      = il.DeclareLocal(typeof(int));

            il.EmitLdcI4(0);
            il.EmitStloc(s);
            il.EmitLdarg(0);
            il.EmitStloc(i);
            il.EmitFor(
                b =>
            {
                il.EmitLdloc(i);
                il.EmitLdcI4(0);
                il.Emit(OpCodes.Bgt_S, b);
            },
                () =>
            {
                il.EmitLdloc(i);
                il.EmitLdcI4(1);
                il.Emit(OpCodes.Sub);
                il.EmitStloc(i);
            },
                c =>
            {
                il.EmitLdloc(s);
                il.EmitLdloc(i);
                il.Emit(OpCodes.Add);
                il.EmitStloc(s);
            }
                );
            il.EmitLdloc(s);
            il.Emit(OpCodes.Ret);
            var del = method.CreateDelegate <Func <int, int> >();

            Assert.Equal(Enumerable.Range(0, 6).Sum(), del(5));
            Assert.Equal(Enumerable.Range(0, 4).Sum(), del(3));
        }
Example #8
0
        public void UsingOk()
        {
            var method = EmitEx.CreateMethod <Func <IDisposable, int> >();
            var il     = method.GetILGenerator();

            il.EmitLdarg(0);
            var disp = il.DeclareLocal(typeof(IDisposable));

            il.EmitStloc(disp);
            il.EmitUsing(disp, () =>
            {
            });
            il.EmitLdcI4(42);
            il.Emit(OpCodes.Ret);

            var compiled = method.CreateDelegate <Func <IDisposable, int> >();
            var disposed = false;
            var dis      = DisposableEx.Action(() => disposed = true);

            Assert.Equal(42, compiled(dis));
            Assert.True(disposed);
        }
Example #9
0
        public void ForEachOk()
        {
            var method = EmitEx.CreateMethod <Func <IEnumerable <int>, int> >();
            var il     = method.GetILGenerator();
            var s      = il.DeclareLocal(typeof(int));

            il.EmitLdcI4(0);
            il.EmitStloc(s);
            il.EmitLdarg(0);
            il.EmitForEach(typeof(IEnumerable <int>),
                           c =>
            {
                il.EmitLdloc(s);
                il.Emit(OpCodes.Add);
                il.EmitStloc(s);
            });
            il.EmitLdloc(s);
            il.Emit(OpCodes.Ret);
            var del = method.CreateDelegate <Func <IEnumerable <int>, int> >();

            Assert.Equal(Enumerable.Range(0, 6).Sum(), del(Enumerable.Range(0, 6)));
            Assert.Equal(Enumerable.Range(0, 4).Sum(), del(Enumerable.Range(0, 4)));
        }