public void EmitArrayLoad (ArrayContainer ac)
{
if (ac.Rank > 1) {
if (IsAnonymousStoreyMutateRequired)
ac = (ArrayContainer) ac.Mutate (CurrentAnonymousMethod.Storey.Mutator);
ig.Emit (OpCodes.Call, ac.GetGetMethod ());
return;
}
var type = ac.Element;
if (TypeManager.IsEnumType (type))
type = EnumSpec.GetUnderlyingType (type);
if (type == TypeManager.byte_type || type == TypeManager.bool_type)
Emit (OpCodes.Ldelem_U1);
else if (type == TypeManager.sbyte_type)
Emit (OpCodes.Ldelem_I1);
else if (type == TypeManager.short_type)
Emit (OpCodes.Ldelem_I2);
else if (type == TypeManager.ushort_type || type == TypeManager.char_type)
Emit (OpCodes.Ldelem_U2);
else if (type == TypeManager.int32_type)
Emit (OpCodes.Ldelem_I4);
else if (type == TypeManager.uint32_type)
Emit (OpCodes.Ldelem_U4);
else if (type == TypeManager.uint64_type)
Emit (OpCodes.Ldelem_I8);
else if (type == TypeManager.int64_type)
Emit (OpCodes.Ldelem_I8);
else if (type == TypeManager.float_type)
Emit (OpCodes.Ldelem_R4);
else if (type == TypeManager.double_type)
Emit (OpCodes.Ldelem_R8);
else if (type == TypeManager.intptr_type)
Emit (OpCodes.Ldelem_I);
else if (TypeManager.IsStruct (type)) {
Emit (OpCodes.Ldelema, type);
Emit (OpCodes.Ldobj, type);
} else if (type.IsGenericParameter) {
Emit (OpCodes.Ldelem, type);
} else if (type.IsPointer)
Emit (OpCodes.Ldelem_I);
else
Emit (OpCodes.Ldelem_Ref);
}