void EmitDefaultValue(IType type)
{
var isGenericParameter = GenericsServices.IsGenericParameter(type);
if (!type.IsValueType && !isGenericParameter)
_il.Emit(OpCodes.Ldnull);
else if (type == TypeSystemServices.BoolType)
_il.Emit(OpCodes.Ldc_I4_0);
else if (TypeSystemServices.IsFloatingPointNumber(type))
EmitLoadLiteral(type, 0.0);
else if (TypeSystemServices.IsPrimitiveNumber(type) || type == TypeSystemServices.CharType)
EmitLoadLiteral(type, 0);
else if (isGenericParameter && TypeSystemServices.IsReferenceType(type))
{
_il.Emit(OpCodes.Ldnull);
_il.Emit(OpCodes.Unbox_Any, GetSystemType(type));
}
else //valuetype or valuetype/unconstrained generic parameter
{
//TODO: if MethodBody.InitLocals is false
//_il.Emit(OpCodes.Ldloca, GetDefaultValueHolder(type));
//_il.Emit(OpCodes.Initobj, GetSystemType(type));
_il.Emit(OpCodes.Ldloc, GetDefaultValueHolder(type));
}
PushType(type);
}