public Func <SerializationContext, PolymorphismSchema, MessagePackSerializer> CreateObjectConstructor(AssemblyBuilderEmittingContext context, AssemblyBuilderSerializerBuilder builder, SerializationTarget targetInfo) { var hasPackActions = targetInfo != null && !typeof(IPackable).IsAssignableFrom(builder.TargetType); var hasUnpackActions = targetInfo != null && !typeof(IUnpackable).IsAssignableFrom(builder.TargetType); var hasUnpackActionTables = hasUnpackActions && targetInfo.Members.Any(m => m.Member != null); // Except tuples #if FEATURE_TAP var hasPackAsyncActions = targetInfo != null && !typeof(IAsyncPackable).IsAssignableFrom(builder.TargetType); var hasUnpackAsyncActions = targetInfo != null && !typeof(IAsyncUnpackable).IsAssignableFrom(builder.TargetType); var hasUnpackAsyncActionTables = hasUnpackAsyncActions && targetInfo.Members.Any(m => m.Member != null); // Except tuples #endif // FEATURE_TAP // ReSharper disable RedundantDelegateCreation Func <bool, Func <ILConstruct> > packActionsInitialization = isAsync => new Func <ILConstruct>(() => builder.EmitPackOperationListInitialization(context, targetInfo, isAsync)); Func <bool, Func <ILConstruct> > packActionTableInitialization = isAsync => new Func <ILConstruct>(() => builder.EmitPackOperationTableInitialization(context, targetInfo, isAsync)); Func <bool, Func <ILConstruct> > unpackActionsInitialization = isAsync => new Func <ILConstruct>(() => builder.EmitUnpackOperationListInitialization(context, targetInfo, isAsync)); Func <bool, Func <ILConstruct> > unpackActionTableInitialization = isAsync => new Func <ILConstruct>(() => builder.EmitUnpackOperationTableInitialization(context, targetInfo, isAsync)); // ReSharper restore RedundantDelegateCreation var contextfulConstructor = this.CreateConstructor( MethodAttributes.Public, ConstructorParameterTypes, (type, il) => this.CreateContextfulObjectConstructor( context, type, il, hasPackActions ? packActionsInitialization(false) : default(Func <ILConstruct>), hasPackActions ? packActionTableInitialization(false) : default(Func <ILConstruct>), hasUnpackActions ? unpackActionsInitialization(false) : default(Func <ILConstruct>), hasUnpackActionTables ? unpackActionTableInitialization(false) : default(Func <ILConstruct>), #if FEATURE_TAP hasPackAsyncActions&& context.SerializationContext.SerializerOptions.WithAsync ? packActionsInitialization(true) : default(Func <ILConstruct>), hasPackAsyncActions && context.SerializationContext.SerializerOptions.WithAsync ? packActionTableInitialization(true) : default(Func <ILConstruct>), hasUnpackAsyncActions && context.SerializationContext.SerializerOptions.WithAsync ? unpackActionsInitialization(true) : default(Func <ILConstruct>), hasUnpackAsyncActionTables && context.SerializationContext.SerializerOptions.WithAsync ? unpackActionTableInitialization(true) : default(Func <ILConstruct>), #endif // FEATURE_TAP ( hasUnpackActions #if FEATURE_TAP || hasUnpackAsyncActions #endif // FEATURE_TAP ) ? () => builder.EmitMemberListInitialization(context, targetInfo) : default(Func <ILConstruct>), context.IsUnpackToUsed ? () => builder.EmitUnpackToInitialization(context) : default(Func <ILConstruct>) ) ); this.CreateConstructor( MethodAttributes.Public, ReflectionAbstractions.EmptyTypes, (_, il) => CreateDefaultObjectConstructor(contextfulConstructor, il) ); #if !NETSTANDARD1_1 && !NETSTANDARD1_3 var ctor = this._typeBuilder.CreateType().GetConstructor(ConstructorParameterTypes); #else var ctor = this._typeBuilder.CreateTypeInfo().GetConstructor(ConstructorParameterTypes); #endif // !NETSTANDARD1_1 && !NETSTANDARD1_3 var contextParameter = Expression.Parameter(typeof(SerializationContext), "context"); var schemaParameter = Expression.Parameter(typeof(PolymorphismSchema), "schema"); #if DEBUG Contract.Assert(ctor != null, "ctor != null"); #endif return (Expression.Lambda <Func <SerializationContext, PolymorphismSchema, MessagePackSerializer> >( Expression.New( ctor, contextParameter ), contextParameter, schemaParameter ).Compile()); }
public Func <SerializationContext, PolymorphismSchema, MessagePackSerializer> CreateObjectConstructor( AssemblyBuilderEmittingContext context, AssemblyBuilderSerializerBuilder builder, SerializationTarget targetInfo, SerializerCapabilities?capabilities ) { var hasPackActions = targetInfo != null && !typeof(IPackable).IsAssignableFrom(builder.TargetType); var hasUnpackActions = targetInfo != null && !typeof(IUnpackable).IsAssignableFrom(builder.TargetType); var hasUnpackActionTables = hasUnpackActions && targetInfo.Members.Any(m => m.Member != null); // Except tuples #if FEATURE_TAP var hasPackAsyncActions = targetInfo != null && !typeof(IAsyncPackable).IsAssignableFrom(builder.TargetType); var hasUnpackAsyncActions = targetInfo != null && !typeof(IAsyncUnpackable).IsAssignableFrom(builder.TargetType); var hasUnpackAsyncActionTables = hasUnpackAsyncActions && targetInfo.Members.Any(m => m.Member != null); // Except tuples #endif // FEATURE_TAP // ReSharper disable RedundantDelegateCreation Func <bool, Func <ILConstruct> > packActionsInitialization = isAsync => new Func <ILConstruct>(() => builder.EmitPackOperationListInitialization(context, targetInfo, isAsync)); Func <bool, Func <ILConstruct> > packActionTableInitialization = isAsync => new Func <ILConstruct>(() => builder.EmitPackOperationTableInitialization(context, targetInfo, isAsync)); Func <ILConstruct> nullCheckerTableInitializtion = () => builder.EmitPackNullCheckerTableInitialization(context, targetInfo); Func <bool, Func <ILConstruct> > unpackActionsInitialization = isAsync => new Func <ILConstruct>(() => builder.EmitUnpackOperationListInitialization(context, targetInfo, isAsync)); Func <bool, Func <ILConstruct> > unpackActionTableInitialization = isAsync => new Func <ILConstruct>(() => builder.EmitUnpackOperationTableInitialization(context, targetInfo, isAsync)); // ReSharper restore RedundantDelegateCreation var contextfulConstructor = this.CreateConstructor( MethodAttributes.Public, ConstructorParameterTypesWithoutCapabilities, (type, il) => this.CreateContextfulObjectConstructor( context, type, capabilities, il, hasPackActions ? packActionsInitialization(false) : default(Func <ILConstruct>), hasPackActions ? packActionTableInitialization(false) : default(Func <ILConstruct>), #if DEBUG !SerializerDebugging.UseLegacyNullMapEntryHandling && #endif // DEBUG hasPackActions #if FEATURE_TAP || hasPackAsyncActions #endif // FEATURE_TAP ? nullCheckerTableInitializtion : default(Func <ILConstruct>), hasUnpackActions ? unpackActionsInitialization(false) : default(Func <ILConstruct>), hasUnpackActionTables ? unpackActionTableInitialization(false) : default(Func <ILConstruct>), #if FEATURE_TAP hasPackAsyncActions&& context.SerializationContext.SerializerOptions.WithAsync ? packActionsInitialization(true) : default(Func <ILConstruct>), hasPackAsyncActions && context.SerializationContext.SerializerOptions.WithAsync ? packActionTableInitialization(true) : default(Func <ILConstruct>), hasUnpackAsyncActions && context.SerializationContext.SerializerOptions.WithAsync ? unpackActionsInitialization(true) : default(Func <ILConstruct>), hasUnpackAsyncActionTables && context.SerializationContext.SerializerOptions.WithAsync ? unpackActionTableInitialization(true) : default(Func <ILConstruct>), #endif // FEATURE_TAP ( hasUnpackActions #if FEATURE_TAP || hasUnpackAsyncActions #endif // FEATURE_TAP ) ? () => builder.EmitMemberListInitialization(context, targetInfo) : default(Func <ILConstruct>), context.IsUnpackToUsed ? () => builder.EmitUnpackToInitialization(context) : default(Func <ILConstruct>) ) ); this.CreateConstructor( MethodAttributes.Public, ReflectionAbstractions.EmptyTypes, (_, il) => CreateDefaultObjectConstructor(contextfulConstructor, il) ); #if !NETSTANDARD1_1 && !NETSTANDARD1_3 && !NETSTANDARD2_0 var ctor = this._typeBuilder.CreateType().GetConstructor(ConstructorParameterTypesWithoutCapabilities); #else var ctor = this._typeBuilder.CreateTypeInfo().GetConstructor(ConstructorParameterTypesWithoutCapabilities); #endif // !NETSTANDARD1_1 && !NETSTANDARD1_3 && !NETSTANDARD2_0 #if DEBUG Contract.Assert(ctor != null, "ctor != null"); #endif var actualFunc = ctor.CreateConstructorDelegate <Func <SerializationContext, MessagePackSerializer> >(); return((c, _) => actualFunc(c)); }