[reflection] Use MonoError in mono_reflection_get_type_with_rootimage
authorAleksey Kliger <aleksey@xamarin.com>
Mon, 29 Feb 2016 22:20:21 +0000 (17:20 -0500)
committerAleksey Kliger <aleksey@xamarin.com>
Wed, 2 Mar 2016 16:11:12 +0000 (11:11 -0500)
mono/metadata/reflection.c

index 52d66d143c8303ca2cbfc78712fc0ab64740a854..564719cc8a09c0329828ce9fe00da78d886bb9cb 100644 (file)
@@ -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);