Beispiel #1
0
 public static void GenerateSkipEx(this ITypeDescriptor descriptor, IILGen ilGenerator, Action <IILGen> pushReader, Action <IILGen> pushCtx)
 {
     if (descriptor.StoredInline)
     {
         descriptor.GenerateSkip(ilGenerator, pushReader, pushCtx);
     }
     else
     {
         ilGenerator
         .Do(pushCtx)
         .Callvirt(() => default(ITypeBinaryDeserializerContext).SkipObject());
     }
 }
 public static void GenerateSkipEx(this ITypeDescriptor descriptor, IILGen ilGenerator,
                                   Action <IILGen> pushReader, Action <IILGen> pushCtx)
 {
     if (descriptor.StoredInline)
     {
         descriptor.GenerateSkip(ilGenerator, pushReader, pushCtx);
     }
     else
     {
         ilGenerator
         .Do(pushCtx)
         .Do(pushReader)
         .Callvirt(typeof(ITypeBinaryDeserializerContext).GetMethod(nameof(ITypeBinaryDeserializerContext.SkipObject)) !);
     }
 }
Beispiel #3
0
        Func <AbstractBufferedReader, ITypeBinaryDeserializerContext, ITypeSerializersId2LoaderMapping, ITypeDescriptor, object> LoaderFactory(ITypeDescriptor descriptor)
        {
            Type loadAsType = null;

            try
            {
                loadAsType = LoadAsType(descriptor);
            }
            catch (EventSkippedException)
            {
            }
            var methodBuilder = ILBuilder.Instance.NewMethod <Func <AbstractBufferedReader, ITypeBinaryDeserializerContext, ITypeSerializersId2LoaderMapping, ITypeDescriptor, object> >("DeserializerFor" + descriptor.Name);
            var il            = methodBuilder.Generator;

            if (descriptor.AnyOpNeedsCtx())
            {
                var localCtx = il.DeclareLocal(typeof(ITypeBinaryDeserializerContext), "ctx");
                var haveCtx  = il.DefineLabel();
                il
                .Ldarg(1)
                .Dup()
                .Stloc(localCtx)
                .Brtrue(haveCtx)
                .Ldarg(0)
                .Ldarg(2)
                .Newobj(() => new DeserializerCtx(null, null))
                .Castclass(typeof(ITypeBinaryDeserializerContext))
                .Stloc(localCtx)
                .Mark(haveCtx);
                if (loadAsType == null)
                {
                    descriptor.GenerateSkip(il, ilGen => ilGen.Ldarg(0), ilGen => ilGen.Ldloc(localCtx));
                }
                else
                {
                    descriptor.GenerateLoad(il, ilGen => ilGen.Ldarg(0), ilGen => ilGen.Ldloc(localCtx), ilGen => ilGen.Ldarg(3), loadAsType);
                }
            }
            else
            {
                if (loadAsType == null)
                {
                    descriptor.GenerateSkip(il, ilGen => ilGen.Ldarg(0), ilGen => ilGen.Ldarg(1));
                }
                else
                {
                    descriptor.GenerateLoad(il, ilGen => ilGen.Ldarg(0), ilGen => ilGen.Ldarg(1), ilGen => ilGen.Ldarg(3), loadAsType);
                }
            }
            if (loadAsType == null)
            {
                il.Ldnull();
            }
            else if (loadAsType.IsValueType)
            {
                il.Box(loadAsType);
            }
            else if (loadAsType != typeof(object))
            {
                il.Castclass(typeof(object));
            }
            il.Ret();
            return(methodBuilder.Create());
        }