public void EmitArrayStore (ArrayContainer ac)
{
if (ac.Rank > 1) {
if (IsAnonymousStoreyMutateRequired)
ac = (ArrayContainer) ac.Mutate (CurrentAnonymousMethod.Storey.Mutator);
ig.Emit (OpCodes.Call, ac.GetSetMethod ());
return;
}
var type = ac.Element;
if (type.IsEnum)
type = EnumSpec.GetUnderlyingType (type);
if (type == TypeManager.byte_type || type == TypeManager.sbyte_type || type == TypeManager.bool_type)
Emit (OpCodes.Stelem_I1);
else if (type == TypeManager.short_type || type == TypeManager.ushort_type || type == TypeManager.char_type)
Emit (OpCodes.Stelem_I2);
else if (type == TypeManager.int32_type || type == TypeManager.uint32_type)
Emit (OpCodes.Stelem_I4);
else if (type == TypeManager.int64_type || type == TypeManager.uint64_type)
Emit (OpCodes.Stelem_I8);
else if (type == TypeManager.float_type)
Emit (OpCodes.Stelem_R4);
else if (type == TypeManager.double_type)
Emit (OpCodes.Stelem_R8);
else if (type == TypeManager.intptr_type)
Emit (OpCodes.Stobj, type);
else if (TypeManager.IsStruct (type))
Emit (OpCodes.Stobj, type);
else if (type.IsGenericParameter)
Emit (OpCodes.Stelem, type);
else if (type.IsPointer)
Emit (OpCodes.Stelem_I);
else
Emit (OpCodes.Stelem_Ref);
}