void SetField(Node sourceNode, IField field, Expression reference, Expression value, bool leaveValueOnStack)
{
OpCode opSetField = OpCodes.Stsfld;
if (!field.IsStatic)
{
opSetField = OpCodes.Stfld;
if (null != reference)
{
LoadMemberTarget(
((MemberReferenceExpression)reference).Target,
field);
}
}
LoadExpressionWithType(field.Type, value);
LocalBuilder local = null;
if (leaveValueOnStack)
{
Dup();
local = _il.DeclareLocal(GetSystemType(field.Type));
_il.Emit(OpCodes.Stloc, local);
}
if (field.IsVolatile)
_il.Emit(OpCodes.Volatile);
_il.Emit(opSetField, GetFieldInfo(field));
if (leaveValueOnStack)
{
_il.Emit(OpCodes.Ldloc, local);
PushType(field.Type);
}
}