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