[sre] Propagate MonoError in mono_image_load_module_dynamic
authorAleksey Kliger <aleksey@xamarin.com>
Mon, 29 Feb 2016 22:02:26 +0000 (17:02 -0500)
committerAleksey Kliger <aleksey@xamarin.com>
Wed, 2 Mar 2016 16:09:59 +0000 (11:09 -0500)
mono/metadata/icall-def.h
mono/metadata/icall.c
mono/metadata/object-internals.h
mono/metadata/reflection.c

index f3ad20af90be86d7e438712650b1caad94308a27..7dcb662ad04e3c97934870b37fd313d66c0b97b3 100644 (file)
@@ -499,7 +499,7 @@ ICALL_TYPE(CATTR_DATA, "System.Reflection.CustomAttributeData", CATTR_DATA_1)
 ICALL(CATTR_DATA_1, "ResolveArgumentsInternal", mono_reflection_resolve_custom_attribute_data)
 
 ICALL_TYPE(ASSEMB, "System.Reflection.Emit.AssemblyBuilder", ASSEMB_1)
-ICALL(ASSEMB_1, "InternalAddModule", mono_image_load_module_dynamic)
+ICALL(ASSEMB_1, "InternalAddModule", ves_icall_System_Reflection_Emit_AssemblyBuilder_InternalAddModule)
 ICALL(ASSEMB_2, "basic_init", mono_image_basic_init)
 
 ICALL_TYPE(CATTRB, "System.Reflection.Emit.CustomAttributeBuilder", CATTRB_1)
index 5851f37bfbe7bfc95b8a55975605081b6221fec1..bcabe77f2a254e94b6fab3c33c8ea405ab833169 100644 (file)
@@ -1233,6 +1233,15 @@ ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilder *mb, gui
        return obj;
 }
 
+ICALL_EXPORT MonoReflectionModule*
+ves_icall_System_Reflection_Emit_AssemblyBuilder_InternalAddModule (MonoReflectionAssemblyBuilder *ab, MonoString *fileName)
+{
+       MonoError error;
+       MonoReflectionModule *result = mono_image_load_module_dynamic (ab, fileName, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
+}
+
 static gboolean
 get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data)
 {
index 95bb108e9dfdc68c7359aca49507dae0b95d66e2..8acb6660a291bb7fb44ce10e752687a31610c126 100644 (file)
@@ -1379,7 +1379,7 @@ typedef struct {
 
 gboolean          mono_image_create_pefile (MonoReflectionModuleBuilder *module, HANDLE file, MonoError *error);
 void          mono_image_basic_init (MonoReflectionAssemblyBuilder *assembly);
-MonoReflectionModule * mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name);
+MonoReflectionModule * mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *assembly, MonoString *file_name, MonoError *error);
 guint32       mono_image_insert_string (MonoReflectionModuleBuilder *module, MonoString *str);
 guint32       mono_image_create_token  (MonoDynamicImage *assembly, MonoObject *obj, gboolean create_methodspec, gboolean register_token, MonoError *error);
 guint32       mono_image_create_method_token (MonoDynamicImage *assembly, MonoObject *obj, MonoArray *opt_param_types, MonoError *error);
index 52d66d143c8303ca2cbfc78712fc0ab64740a854..9116663cafbd28dc76ddfe2bb6208cb4476726d3 100644 (file)
@@ -6431,10 +6431,8 @@ mono_image_create_pefile (MonoReflectionModuleBuilder *mb, HANDLE file, MonoErro
 #ifndef DISABLE_REFLECTION_EMIT
 
 MonoReflectionModule *
-mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName)
+mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName, MonoError *error)
 {
-       MonoError error;
-       MonoReflectionModule *result = NULL;
        char *name;
        MonoImage *image;
        MonoImageOpenStatus status;
@@ -6443,17 +6441,18 @@ mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *f
        MonoImage **new_modules;
        gboolean *new_modules_loaded;
        
+       mono_error_init (error);
+       
        name = mono_string_to_utf8 (fileName);
 
        image = mono_image_open (name, &status);
        if (!image) {
-               MonoException *exc;
                if (status == MONO_IMAGE_ERROR_ERRNO)
-                       exc = mono_get_exception_file_not_found (fileName);
+                       mono_error_set_exception_instance (error, mono_get_exception_file_not_found (fileName));
                else
-                       exc = mono_get_exception_bad_image_format (name);
+                       mono_error_set_bad_image_name (error, name, NULL);
                g_free (name);
-               mono_raise_exception (exc);
+               return NULL;
        }
 
        g_free (name);
@@ -6481,12 +6480,11 @@ mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *f
        mono_assembly_load_references (image, &status);
        if (status) {
                mono_image_close (image);
-               mono_raise_exception (mono_get_exception_file_not_found (fileName));
+               mono_error_set_exception_instance (error, mono_get_exception_file_not_found (fileName));
+               return NULL;
        }
 
-       result = mono_module_get_object_checked (mono_domain_get (), image, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
-       return result;
+       return mono_module_get_object_checked (mono_domain_get (), image, error);
 }
 
 #endif /* DISABLE_REFLECTION_EMIT */
@@ -13380,7 +13378,7 @@ mono_image_set_wrappers_type (MonoReflectionModuleBuilder *moduleb, MonoReflecti
 }
 
 MonoReflectionModule *
-mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName)
+mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName, MonoError *error)
 {
        g_assert_not_reached ();
        return NULL;