From: Aleksey Kliger Date: Mon, 29 Feb 2016 22:20:21 +0000 (-0500) Subject: [reflection] Use MonoError in mono_reflection_get_type_with_rootimage X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=9d92d33c4ee355ad9679f75ed936bd28c375c1b0;p=mono.git [reflection] Use MonoError in mono_reflection_get_type_with_rootimage --- diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index 52d66d143c8..564719cc8a0 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -169,7 +169,7 @@ static char* type_get_qualified_name (MonoType *type, MonoAssembly *ass); static void encode_type (MonoDynamicImage *assembly, MonoType *type, SigBuffer *buf); static void get_default_param_value_blobs (MonoMethod *method, char **blobs, guint32 *types); static MonoReflectionType *mono_reflection_type_get_underlying_system_type (MonoReflectionType* t, MonoError *error); -static MonoType* mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve); +static MonoType* mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve, MonoError *error); static MonoReflectionType* mono_reflection_type_resolve_user_types (MonoReflectionType *type, MonoError *error); static gboolean is_sre_array (MonoClass *klass); static gboolean is_sre_byref (MonoClass *klass); @@ -8160,12 +8160,14 @@ mono_reflection_parse_type (char *name, MonoTypeNameParse *info) } static MonoType* -_mono_reflection_get_type_from_info (MonoTypeNameParse *info, MonoImage *image, gboolean ignorecase) +_mono_reflection_get_type_from_info (MonoTypeNameParse *info, MonoImage *image, gboolean ignorecase, MonoError *error) { gboolean type_resolve = FALSE; MonoType *type; MonoImage *rootimage = image; + mono_error_init (error); + if (info->assembly.name) { MonoAssembly *assembly = mono_assembly_loaded (&info->assembly); if (!assembly && image && image->assembly && mono_assembly_names_equal (&info->assembly, &image->assembly->aname)) @@ -8185,10 +8187,11 @@ _mono_reflection_get_type_from_info (MonoTypeNameParse *info, MonoImage *image, image = mono_defaults.corlib; } - type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve); + type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve, error); if (type == NULL && !info->assembly.name && image != mono_defaults.corlib) { + mono_error_cleanup (error); image = mono_defaults.corlib; - type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve); + type = mono_reflection_get_type_with_rootimage (rootimage, image, info, ignorecase, &type_resolve, error); } return type; @@ -8291,7 +8294,7 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT for (i = 0; i < info->type_arguments->len; i++) { MonoTypeNameParse *subinfo = (MonoTypeNameParse *)g_ptr_array_index (info->type_arguments, i); - type_args [i] = _mono_reflection_get_type_from_info (subinfo, rootimage, ignorecase); + type_args [i] = _mono_reflection_get_type_from_info (subinfo, rootimage, ignorecase, error); if (!type_args [i]) { g_free (type_args); return NULL; @@ -8341,7 +8344,10 @@ mono_reflection_get_type_internal (MonoImage *rootimage, MonoImage* image, MonoT MonoType* mono_reflection_get_type (MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve) { - return mono_reflection_get_type_with_rootimage(image, image, info, ignorecase, type_resolve); + MonoError error; + MonoType *result = mono_reflection_get_type_with_rootimage(image, image, info, ignorecase, type_resolve, &error); + mono_error_raise_exception (&error); /* FIXME don't raise here */ + return result; } static MonoType* @@ -8386,21 +8392,21 @@ mono_reflection_get_type_internal_dynamic (MonoImage *rootimage, MonoAssembly *a } MonoType* -mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve) +mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve, MonoError *error) { - MonoError error; MonoType *type; MonoReflectionAssembly *assembly; GString *fullName; GList *mod; + mono_error_init (error); + if (image && image_is_dynamic (image)) - type = mono_reflection_get_type_internal_dynamic (rootimage, image->assembly, info, ignorecase, &error); + type = mono_reflection_get_type_internal_dynamic (rootimage, image->assembly, info, ignorecase, error); else { - type = mono_reflection_get_type_internal (rootimage, image, info, ignorecase, &error); + type = mono_reflection_get_type_internal (rootimage, image, info, ignorecase, error); } - if (!mono_error_ok (&error)) - mono_error_raise_exception (&error); /* FIXME don't raise here */ + return_val_if_nok (error, NULL); if (type) return type; @@ -8423,20 +8429,22 @@ mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, for (mod = info->nested; mod; mod = mod->next) g_string_append_printf (fullName, "+%s", (char*)mod->data); - assembly = mono_domain_try_type_resolve_checked ( mono_domain_get (), fullName->str, NULL, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + assembly = mono_domain_try_type_resolve_checked ( mono_domain_get (), fullName->str, NULL, error); + if (!is_ok (error)) { + g_string_free (fullName, TRUE); + return NULL; + } if (assembly) { if (assembly_is_dynamic (assembly->assembly)) type = mono_reflection_get_type_internal_dynamic (rootimage, assembly->assembly, - info, ignorecase, &error); + info, ignorecase, error); else type = mono_reflection_get_type_internal (rootimage, assembly->assembly->image, - info, ignorecase, &error); + info, ignorecase, error); } g_string_free (fullName, TRUE); - if (!mono_error_ok (&error)) - mono_error_raise_exception (&error); /* FIXME don't raise here */ + return_val_if_nok (error, NULL); return type; } @@ -8474,6 +8482,7 @@ mono_reflection_free_type_info (MonoTypeNameParse *info) MonoType* mono_reflection_type_from_name (char *name, MonoImage *image) { + MonoError error; MonoType *type = NULL; MonoTypeNameParse info; char *tmp; @@ -8483,7 +8492,12 @@ mono_reflection_type_from_name (char *name, MonoImage *image) /*g_print ("requested type %s\n", str);*/ if (mono_reflection_parse_type (tmp, &info)) { - type = _mono_reflection_get_type_from_info (&info, image, FALSE); + type = _mono_reflection_get_type_from_info (&info, image, FALSE, &error); + if (!is_ok (&error)) { + g_free (tmp); + mono_reflection_free_type_info (&info); + mono_error_raise_exception (&error); /* FIXME don't raise here */ + } } g_free (tmp);