internal static void GenerateWriteDeferredReference(WriterGenerationContext context, Variable valueLocal, Type formalType) { var finish = context.Generator.DefineLabel(); var isNotNull = context.Generator.DefineLabel(); var isNotTransient = context.Generator.DefineLabel(); context.Generator.PushVariableOntoStack(valueLocal); context.Generator.Emit(OpCodes.Brtrue_S, isNotNull); context.PushNullReferenceOnStack(); context.Generator.Emit(OpCodes.Br, finish); context.Generator.MarkLabel(isNotNull); var formalTypeIsActualType = (formalType.Attributes & TypeAttributes.Sealed) != 0; if (!formalTypeIsActualType) { context.Generator.PushVariableOntoStack(valueLocal); context.Generator.Call(() => Helpers.IsTransient((object)null)); context.Generator.Emit(OpCodes.Brfalse_S, isNotTransient); context.PushNullReferenceOnStack(); context.Generator.Emit(OpCodes.Br, finish); context.Generator.MarkLabel(isNotTransient); context.PushObjectWriterOntoStack(); context.Generator.PushVariableOntoStack(valueLocal); context.Generator.Call <ObjectWriter>(x => x.WriteDeferredReference(null)); } else { if (Helpers.IsTransient(formalType)) { context.PushNullReferenceOnStack(); } else { context.PushObjectWriterOntoStack(); context.Generator.PushVariableOntoStack(valueLocal); context.Generator.Call <ObjectWriter>(x => x.WriteDeferredReference(null)); } } context.Generator.MarkLabel(finish); }