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