public static void GenerateSaveEx(this ITypeDescriptor descriptor, IILGen ilGenerator, Action <IILGen> pushWriter, Action <IILGen> pushCtx, Action <IILGen> pushSubValue, Type subValueType) { if (descriptor.StoredInline) { descriptor.GenerateSave(ilGenerator, pushWriter, pushCtx, pushSubValue, subValueType); } else { ilGenerator .Do(pushCtx) .Do(pushSubValue) .Callvirt(() => default(ITypeBinarySerializerContext).StoreObject(null)); } }
Layer1ComplexSaver BuildComplexSaver(ITypeDescriptor descriptor, Type type) { var method = ILBuilder.Instance.NewMethod <Layer1ComplexSaver>(descriptor.Name + "Saver" + type.ToSimpleName()); var il = method.Generator; descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), ilgen => ilgen.Ldarg(1), ilgen => { ilgen.Ldarg(2); if (type != typeof(object)) { ilgen.UnboxAny(type); } }, type); il.Ret(); return(method.Create()); }
public static void GenerateSaveEx(this ITypeDescriptor descriptor, IILGen ilGenerator, Action <IILGen> pushWriter, Action <IILGen> pushCtx, Action <IILGen> pushSubValue, Type subValueType) { if (descriptor.StoredInline) { descriptor.GenerateSave(ilGenerator, pushWriter, pushCtx, pushSubValue, subValueType); } else { ilGenerator .Do(pushCtx) .Do(pushWriter) .Do(pushSubValue) .Callvirt(typeof(ITypeBinarySerializerContext).GetMethod(nameof(ITypeBinarySerializerContext.StoreObject)) !); } }
Action <AbstractBufferedWriter, ITypeBinarySerializerContext, object> NewComplexSaver(ITypeDescriptor descriptor) { var method = ILBuilder.Instance.NewMethod <Action <AbstractBufferedWriter, ITypeBinarySerializerContext, object> >(descriptor.Name + "ComplexSaver"); var il = method.Generator; descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), ilgen => ilgen.Ldarg(1), ilgen => { ilgen.Ldarg(2); var type = descriptor.GetPreferredType(); if (type != typeof(object)) { ilgen.UnboxAny(type); } }, descriptor.GetPreferredType()); il.Ret(); return(method.Create()); }
Action <AbstractBufferedWriter, object> NewSimpleSaver(ITypeDescriptor descriptor) { if (descriptor.AnyOpNeedsCtx()) { return(null); } var method = ILBuilder.Instance.NewMethod <Action <AbstractBufferedWriter, object> >(descriptor.Name + "SimpleSaver"); var il = method.Generator; descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), null, ilgen => { ilgen.Ldarg(1); var type = descriptor.GetPreferredType(); if (type != typeof(object)) { ilgen.UnboxAny(type); } }, descriptor.GetPreferredType()); il.Ret(); return(method.Create()); }
Action<AbstractBufferedWriter, ITypeBinarySerializerContext, object> BuildComplexSaver(ITypeDescriptor descriptor) { var method = ILBuilder.Instance.NewMethod<Action<AbstractBufferedWriter, ITypeBinarySerializerContext, object>>(descriptor.Name + "Saver"); var il = method.Generator; descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), ilgen => ilgen.Ldarg(1), ilgen => { ilgen.Ldarg(2); var type = descriptor.GetPreferedType(); if (type != typeof(object)) { ilgen.Castclass(type); } }, descriptor.GetPreferedType()); il.Ret(); return method.Create(); }
Action<AbstractBufferedWriter, object> NewSimpleSaver(ITypeDescriptor descriptor) { if (descriptor.AnyOpNeedsCtx()) return null; var method = ILBuilder.Instance.NewMethod<Action<AbstractBufferedWriter, object>>(descriptor.Name + "SimpleSaver"); var il = method.Generator; descriptor.GenerateSave(il, ilgen => ilgen.Ldarg(0), null, ilgen => { ilgen.Ldarg(1); var type = descriptor.GetPreferedType(); if (type != typeof(object)) { ilgen.UnboxAny(type); } }, descriptor.GetPreferedType()); il.Ret(); return method.Create(); }