X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Ficall.c;h=bc3bb782175165fb6805fc1a08dc21aa92dc20f2;hb=f0834d5407f492a2a21e2f62f8f8c418d64ba6fa;hp=98b09a50c0490e8bb3c24d75e339fa3412b5569d;hpb=0cdfb23e29f3a8a354b667a2959f1be7bbbc94f6;p=mono.git diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 98b09a50c04..bc3bb782175 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -907,11 +907,12 @@ ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunClassConstructor (Mo ICALL_EXPORT void ves_icall_System_Runtime_CompilerServices_RuntimeHelpers_RunModuleConstructor (MonoImage *image) { - MONO_ARCH_SAVE_REGS; + MonoError error; mono_image_check_for_module_cctor (image); if (image->has_module_cctor) { - MonoClass *module_klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | 1); + MonoClass *module_klass = mono_class_get_checked (image, MONO_TOKEN_TYPE_DEF | 1, &error); + mono_error_raise_exception (&error); /*It's fine to raise the exception here*/ mono_runtime_class_init (mono_class_vtable_full (mono_domain_get (), module_klass, TRUE)); } @@ -1673,8 +1674,7 @@ ves_icall_System_Reflection_FieldInfo_GetTypeModifiers (MonoReflectionField *fie { MonoError error; MonoType *type = mono_field_get_type_checked (field->field, &error); - if (!mono_error_ok (&error)) - mono_error_raise_exception (&error); + mono_error_raise_exception (&error); return type_array_from_modifiers (field->field->parent->image, type, optional); } @@ -1898,14 +1898,23 @@ ves_icall_MonoField_GetRawConstantValue (MonoReflectionField *this) mono_raise_exception (mono_get_exception_invalid_operation (NULL)); if (image_is_dynamic (field->parent->image)) { - /* FIXME: */ - g_assert_not_reached (); + MonoClass *klass = field->parent; + int fidx = field - klass->fields; + + g_assert (fidx >= 0 && fidx < klass->field.count); + g_assert (klass->ext); + g_assert (klass->ext->field_def_values); + def_type = klass->ext->field_def_values [fidx].def_type; + def_value = klass->ext->field_def_values [fidx].data; + if (def_type == MONO_TYPE_END) + mono_raise_exception (mono_get_exception_invalid_operation (NULL)); + } else { + def_value = mono_class_get_field_default_value (field, &def_type); + /* FIXME, maybe we should try to raise TLE if field->parent is broken */ + if (!def_value) + mono_raise_exception (mono_get_exception_invalid_operation (NULL)); } - def_value = mono_class_get_field_default_value (field, &def_type); - if (!def_value) /*FIXME, maybe we should try to raise TLE if field->parent is broken */ - mono_raise_exception (mono_get_exception_invalid_operation (NULL)); - /*FIXME unify this with reflection.c:mono_get_object_from_blob*/ switch (def_type) { case MONO_TYPE_U1: @@ -2843,6 +2852,18 @@ ves_icall_InternalInvoke (MonoReflectionMethod *method, MonoObject *this, MonoAr for (i = 0; i < pcount; ++i) lengths [i] = *(int32_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject)); + if (m->klass->rank == 1 && sig->param_count == 2 && m->klass->element_class->rank) { + /* This is a ctor for jagged arrays. MS creates an array of arrays. */ + MonoArray *arr = mono_array_new_full (mono_object_domain (params), m->klass, lengths, NULL); + + for (i = 0; i < mono_array_length (arr); ++i) { + MonoArray *subarray = mono_array_new_full (mono_object_domain (params), m->klass->element_class, &lengths [1], NULL); + + mono_array_setref_fast (arr, i, subarray); + } + return (MonoObject*)arr; + } + if (m->klass->rank == pcount) { /* Only lengths provided. */ lower_bounds = NULL; @@ -2992,10 +3013,12 @@ static guint64 read_enum_value (char *mem, int type) { switch (type) { + case MONO_TYPE_BOOLEAN: case MONO_TYPE_U1: return *(guint8*)mem; case MONO_TYPE_I1: return *(gint8*)mem; + case MONO_TYPE_CHAR: case MONO_TYPE_U2: return *(guint16*)mem; case MONO_TYPE_I2: @@ -3071,7 +3094,7 @@ ves_icall_System_Enum_ToObject (MonoReflectionType *enumType, MonoObject *value) if (!enumc->enumtype) mono_raise_exception (mono_get_exception_argument ("enumType", "Type provided must be an Enum.")); - if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_I1 && objc->byval_arg.type <= MONO_TYPE_U8))) + if (!((objc->enumtype) || (objc->byval_arg.type >= MONO_TYPE_BOOLEAN && objc->byval_arg.type <= MONO_TYPE_U8))) mono_raise_exception (mono_get_exception_argument ("value", "The value passed in must be an enum base or an underlying type for an enum, such as an Int32.")); etype = mono_class_enum_basetype (enumc); @@ -5161,21 +5184,16 @@ mono_module_get_types (MonoDomain *domain, MonoImage *image, MonoArray **excepti attrs = mono_metadata_decode_row_col (tdef, i, MONO_TYPEDEF_FLAGS); visibility = attrs & TYPE_ATTRIBUTE_VISIBILITY_MASK; if (!exportedOnly || (visibility == TYPE_ATTRIBUTE_PUBLIC || visibility == TYPE_ATTRIBUTE_NESTED_PUBLIC)) { - klass = mono_class_get (image, (i + 1) | MONO_TOKEN_TYPE_DEF); + MonoError error; + klass = mono_class_get_checked (image, (i + 1) | MONO_TOKEN_TYPE_DEF, &error); + g_assert (!mono_loader_get_last_error ()); /* Plug any leaks */ + if (klass) { mono_array_setref (res, count, mono_type_get_object (domain, &klass->byval_arg)); } else { - MonoLoaderError *error; - MonoException *ex; - - error = mono_loader_get_last_error (); - g_assert (error != NULL); - - ex = mono_loader_error_prepare_exception (error); + MonoException *ex = mono_error_convert_to_exception (&error); mono_array_setref (*exceptions, count, ex); } - if (mono_loader_get_last_error ()) - mono_loader_clear_error (); count++; } } @@ -5266,7 +5284,7 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, mono_loader_clear_error (); exl = mono_array_new (domain, mono_defaults.exception_class, length); - /* Types for which mono_class_get () succeeded */ + /* Types for which mono_class_get_checked () succeeded */ for (i = 0, tmp = list; tmp; i++, tmp = tmp->next) { MonoException *exc = mono_class_get_exception_for_failure (tmp->data); mono_array_setref (exl, i, exc); @@ -5321,6 +5339,7 @@ ves_icall_System_Reflection_AssemblyName_ParseName (MonoReflectionAssemblyName * ICALL_EXPORT MonoReflectionType* ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module) { + MonoError error; MonoDomain *domain = mono_object_domain (module); MonoClass *klass; @@ -5332,7 +5351,8 @@ ves_icall_System_Reflection_Module_GetGlobalType (MonoReflectionModule *module) /* These images do not have a global type */ return NULL; - klass = mono_class_get (module->image, 1 | MONO_TOKEN_TYPE_DEF); + klass = mono_class_get_checked (module->image, 1 | MONO_TOKEN_TYPE_DEF, &error); + mono_error_raise_exception (&error); return mono_type_get_object (domain, &klass->byval_arg); } @@ -5442,19 +5462,20 @@ init_generic_context_from_args (MonoGenericContext *context, MonoArray *type_arg } ICALL_EXPORT MonoType* -ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error) +ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *resolve_error) { MonoClass *klass; int table = mono_metadata_token_table (token); int index = mono_metadata_token_index (token); MonoGenericContext context; + MonoError error; - *error = ResolveTokenError_Other; + *resolve_error = ResolveTokenError_Other; /* Validate token */ if ((table != MONO_TABLE_TYPEDEF) && (table != MONO_TABLE_TYPEREF) && (table != MONO_TABLE_TYPESPEC)) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5470,15 +5491,15 @@ ves_icall_System_Reflection_Module_ResolveTypeToken (MonoImage *image, guint32 t } if ((index <= 0) || (index > image->tables [table].rows)) { - *error = ResolveTokenError_OutOfRange; + *resolve_error = ResolveTokenError_OutOfRange; return NULL; } init_generic_context_from_args (&context, type_args, method_args); - klass = mono_class_get_full (image, token, &context); - - if (mono_loader_get_last_error ()) - mono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); + klass = mono_class_get_checked (image, token, &error); + if (klass) + klass = mono_class_inflate_generic_class_checked (klass, &context, &error); + mono_error_raise_exception (&error); if (klass) return &klass->byval_arg; @@ -5561,19 +5582,20 @@ ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 } ICALL_EXPORT MonoClassField* -ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *error) +ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 token, MonoArray *type_args, MonoArray *method_args, MonoResolveTokenError *resolve_error) { + MonoError error; MonoClass *klass; int table = mono_metadata_token_table (token); int index = mono_metadata_token_index (token); MonoGenericContext context; MonoClassField *field; - *error = ResolveTokenError_Other; + *resolve_error = ResolveTokenError_Other; /* Validate token */ if ((table != MONO_TABLE_FIELD) && (table != MONO_TABLE_MEMBERREF)) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5582,7 +5604,7 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 return mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL); if (mono_memberref_is_method (image, token)) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } @@ -5591,19 +5613,17 @@ ves_icall_System_Reflection_Module_ResolveFieldToken (MonoImage *image, guint32 } if ((index <= 0) || (index > image->tables [table].rows)) { - *error = ResolveTokenError_OutOfRange; + *resolve_error = ResolveTokenError_OutOfRange; return NULL; } if ((table == MONO_TABLE_MEMBERREF) && (mono_memberref_is_method (image, token))) { - *error = ResolveTokenError_BadTable; + *resolve_error = ResolveTokenError_BadTable; return NULL; } init_generic_context_from_args (&context, type_args, method_args); - field = mono_field_from_token (image, token, &klass, &context); - - if (mono_loader_get_last_error ()) - mono_raise_exception (mono_loader_error_prepare_exception (mono_loader_get_last_error ())); + field = mono_field_from_token_checked (image, token, &klass, &context, &error); + mono_error_raise_exception (&error); return field; } @@ -7412,15 +7432,11 @@ ves_icall_System_Char_GetDataTablePointers (int category_data_version, *to_upper_data_high = ToUpperDataHigh; } -ICALL_EXPORT gint32 -ves_icall_MonoDebugger_GetMethodToken (MonoReflectionMethod *method) -{ - return method->method->token; -} - /* * We return NULL for no modifiers so the corlib code can return Type.EmptyTypes * and avoid useless allocations. + * + * MAY THROW */ static MonoArray* type_array_from_modifiers (MonoImage *image, MonoType *type, int optional) @@ -7437,7 +7453,9 @@ type_array_from_modifiers (MonoImage *image, MonoType *type, int optional) count = 0; for (i = 0; i < type->num_mods; ++i) { if ((optional && !type->modifiers [i].required) || (!optional && type->modifiers [i].required)) { - MonoClass *klass = mono_class_get (image, type->modifiers [i].token); + MonoError error; + MonoClass *klass = mono_class_get_checked (image, type->modifiers [i].token, &error); + mono_error_raise_exception (&error); /* this is safe, no cleanup needed on callers */ mono_array_setref (res, count, mono_type_get_object (mono_domain_get (), &klass->byval_arg)); count++; }