- /// <summary>
- /// Returns the right opcode to store an object of Type `t'
- /// from an array of T.
- /// </summary>
- static public OpCode GetStoreOpcode (Type t, out bool is_stobj, out bool has_type_arg)
- {
- has_type_arg = false; is_stobj = false;
- t = TypeManager.TypeToCoreType (t);
- if (TypeManager.IsEnumType (t))
- t = TypeManager.GetEnumUnderlyingType (t);
- if (t == TypeManager.byte_type || t == TypeManager.sbyte_type ||
- t == TypeManager.bool_type)
- return OpCodes.Stelem_I1;
- else if (t == TypeManager.short_type || t == TypeManager.ushort_type ||
- t == TypeManager.char_type)
- return OpCodes.Stelem_I2;
- else if (t == TypeManager.int32_type || t == TypeManager.uint32_type)
- return OpCodes.Stelem_I4;
- else if (t == TypeManager.int64_type || t == TypeManager.uint64_type)
- return OpCodes.Stelem_I8;
- else if (t == TypeManager.float_type)
- return OpCodes.Stelem_R4;
- else if (t == TypeManager.double_type)
- return OpCodes.Stelem_R8;
- else if (t == TypeManager.intptr_type) {
- has_type_arg = true;
- is_stobj = true;
- return OpCodes.Stobj;
- } else if (TypeManager.IsStruct (t)) {
- has_type_arg = true;
- is_stobj = true;
- return OpCodes.Stobj;
- } else if (t.IsGenericParameter) {
- has_type_arg = true;
- return OpCodes.Stelem;
- } else if (t.IsPointer)
- return OpCodes.Stelem_I;
- else
- return OpCodes.Stelem_Ref;
- }
-
- MethodInfo FetchGetMethod ()
- {
- ModuleBuilder mb = RootContext.ToplevelTypes.Builder;
- int arg_count = ea.Arguments.Count;
- Type [] args = new Type [arg_count];
- MethodInfo get;
-
- for (int i = 0; i < arg_count; i++){
- //args [i++] = a.Type;
- args [i] = TypeManager.int32_type;
- }
-
- get = mb.GetArrayMethod (
- ea.Expr.Type, "Get",
- CallingConventions.HasThis |
- CallingConventions.Standard,
- type, args);
- return get;
- }
-
-
- MethodInfo FetchAddressMethod ()
- {
- ModuleBuilder mb = RootContext.ToplevelTypes.Builder;
- int arg_count = ea.Arguments.Count;
- Type [] args = new Type [arg_count];
- MethodInfo address;
- Type ret_type;
-
- ret_type = TypeManager.GetReferenceType (type);
-
- for (int i = 0; i < arg_count; i++){
- //args [i++] = a.Type;
- args [i] = TypeManager.int32_type;
- }
-
- address = mb.GetArrayMethod (
- ea.Expr.Type, "Address",
- CallingConventions.HasThis |
- CallingConventions.Standard,
- ret_type, args);
-
- return address;
- }
-