[runtime] Use MonoError for mono_try_assembly_resolve
authorLudovic Henry <ludovic@xamarin.com>
Tue, 16 Feb 2016 11:04:23 +0000 (11:04 +0000)
committerLudovic Henry <ludovic@xamarin.com>
Wed, 17 Feb 2016 13:43:15 +0000 (13:43 +0000)
mono/metadata/appdomain.c
mono/metadata/assembly.c
mono/metadata/domain-internals.h

index ce074fbe58f01fd4fec34c3c2b83df406053bf58..8e169963a094dc960b8e559ef84c1a2999addf0c 100644 (file)
@@ -969,15 +969,16 @@ leave:
 }
 
 MonoReflectionAssembly *
-mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly)
+mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly, MonoError *error)
 {
-       MonoError error;
        MonoReflectionAssembly *ret;
        MonoClass *klass;
        MonoMethod *method;
        MonoBoolean isrefonly;
        gpointer params [3];
 
+       mono_error_init (error);
+
        if (mono_runtime_get_no_exec ())
                return NULL;
 
@@ -995,15 +996,14 @@ mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *
        isrefonly = refonly ? 1 : 0;
        params [0] = fname;
        if (requesting) {
-               params[1] = mono_assembly_get_object_checked (domain, requesting, &error);
-               if (!mono_error_ok (&error))
-                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               params[1] = mono_assembly_get_object_checked (domain, requesting, error);
+               return_val_if_nok (error, NULL);
        } else
                params [1] = NULL;
        params [2] = &isrefonly;
 
-       ret = (MonoReflectionAssembly *) mono_runtime_invoke_checked (method, domain->domain, params, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       ret = (MonoReflectionAssembly *) mono_runtime_invoke_checked (method, domain->domain, params, error);
+       return_val_if_nok (error, NULL);
 
        return ret;
 }
@@ -1012,6 +1012,7 @@ MonoAssembly *
 mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *requesting,
                                                                          gboolean refonly)
 {
+       MonoError error;
        MonoReflectionAssembly *assembly;
        MonoDomain *domain = mono_domain_get ();
        char *aname_str;
@@ -1025,7 +1026,13 @@ mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *req
                g_free (aname_str);
                return NULL;
        }
-       assembly = mono_try_assembly_resolve (domain, str, requesting, refonly);
+
+       assembly = mono_try_assembly_resolve (domain, str, requesting, refonly, &error);
+       if (!mono_error_ok (&error)) {
+               g_free (aname_str);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       }
+
        g_free (aname_str);
 
        if (assembly)
@@ -2062,8 +2069,13 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad,  MonoString *assRef,
 
        if (!parsed) {
                /* This is a parse error... */
-               if (!refOnly)
-                       refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly);
+               if (!refOnly) {
+                       refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
+               }
                return refass;
        }
 
@@ -2072,8 +2084,13 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad,  MonoString *assRef,
 
        if (!ass) {
                /* MS.NET doesn't seem to call the assembly resolve handler for refonly assemblies */
-               if (!refOnly)
-                       refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly);
+               if (!refOnly) {
+                       refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
+               }
                else
                        refass = NULL;
                if (!refass) {
index 381d102b39bddab4358193835d8bb065ac4b454c..fde74b06b7a9248adc026b939471555d9c2a9ae8 100644 (file)
@@ -2511,6 +2511,7 @@ probe_for_partial_name (const char *basepath, const char *fullname, MonoAssembly
 MonoAssembly*
 mono_assembly_load_with_partial_name (const char *name, MonoImageOpenStatus *status)
 {
+       MonoError error;
        MonoAssembly *res;
        MonoAssemblyName *aname, base_name;
        MonoAssemblyName mapped_aname;
@@ -2570,7 +2571,15 @@ mono_assembly_load_with_partial_name (const char *name, MonoImageOpenStatus *sta
                res->in_gac = TRUE;
        else {
                MonoDomain *domain = mono_domain_get ();
-               MonoReflectionAssembly *refasm = mono_try_assembly_resolve (domain, mono_string_new (domain, name), NULL, FALSE);
+               MonoReflectionAssembly *refasm;
+
+               refasm = mono_try_assembly_resolve (domain, mono_string_new (domain, name), NULL, FALSE, &error);
+               if (!mono_error_ok (&error)) {
+                       g_free (fullname);
+                       mono_assembly_name_free (aname);
+                       mono_error_raise_exception (&error); /* FIXME don't raise here */
+               }
+
                if (refasm)
                        res = refasm->assembly;
        }
index 04eec95154a6152d5d40b182f835430e147edcc3..f095ea66752203f43220abbe501438f57cff83fb 100644 (file)
@@ -670,7 +670,7 @@ MONO_API void
 mono_domain_add_class_static_data (MonoDomain *domain, MonoClass *klass, gpointer data, guint32 *bitmap);
 
 MonoReflectionAssembly *
-mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly);
+mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly, MonoError *error);
 
 MonoAssembly *
 mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *requesting, gboolean refonly);