[runtime] MonoError-ize mono_marshal_xdomain_copy_value
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 11 May 2016 21:14:57 +0000 (17:14 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Wed, 18 May 2016 19:35:09 +0000 (15:35 -0400)
mono/metadata/appdomain.c
mono/metadata/marshal.h
mono/metadata/remoting.c

index b8be86856554388123c952a9a4036e2fac283153..774151fa5b94ec1f68243e0de603818e873a8064 100644 (file)
@@ -485,27 +485,36 @@ copy_app_domain_setup (MonoDomain *domain, MonoAppDomainSetup *setup, MonoError
 
        mono_domain_set_internal (domain);
 
-       MONO_OBJECT_SETREF (copy, application_base, mono_marshal_xdomain_copy_value ((MonoObject*)setup->application_base));
-       MONO_OBJECT_SETREF (copy, application_name, mono_marshal_xdomain_copy_value ((MonoObject*)setup->application_name));
-       MONO_OBJECT_SETREF (copy, cache_path, mono_marshal_xdomain_copy_value ((MonoObject*)setup->cache_path));
-       MONO_OBJECT_SETREF (copy, configuration_file, mono_marshal_xdomain_copy_value ((MonoObject*)setup->configuration_file));
-       MONO_OBJECT_SETREF (copy, dynamic_base, mono_marshal_xdomain_copy_value ((MonoObject*)setup->dynamic_base));
-       MONO_OBJECT_SETREF (copy, license_file, mono_marshal_xdomain_copy_value ((MonoObject*)setup->license_file));
-       MONO_OBJECT_SETREF (copy, private_bin_path, mono_marshal_xdomain_copy_value ((MonoObject*)setup->private_bin_path));
-       MONO_OBJECT_SETREF (copy, private_bin_path_probe, mono_marshal_xdomain_copy_value ((MonoObject*)setup->private_bin_path_probe));
-       MONO_OBJECT_SETREF (copy, shadow_copy_directories, mono_marshal_xdomain_copy_value ((MonoObject*)setup->shadow_copy_directories));
-       MONO_OBJECT_SETREF (copy, shadow_copy_files, mono_marshal_xdomain_copy_value ((MonoObject*)setup->shadow_copy_files));
+#define XCOPY_FIELD(dst,field,src,error)                                       \
+       do {                                                            \
+               MonoObject *copied_val = mono_marshal_xdomain_copy_value ((MonoObject*)(src), error); \
+               return_val_if_nok (error, NULL);                        \
+               MONO_OBJECT_SETREF ((dst),field,copied_val);            \
+       } while (0)
+
+       XCOPY_FIELD (copy, application_base, setup->application_base, error);
+       XCOPY_FIELD (copy, application_name, setup->application_name, error);
+       XCOPY_FIELD (copy, cache_path, setup->cache_path, error);
+       XCOPY_FIELD (copy, configuration_file, setup->configuration_file, error);
+       XCOPY_FIELD (copy, dynamic_base, setup->dynamic_base, error);
+       XCOPY_FIELD (copy, license_file, setup->license_file, error);
+       XCOPY_FIELD (copy, private_bin_path, setup->private_bin_path, error);
+       XCOPY_FIELD (copy, private_bin_path_probe, setup->private_bin_path_probe, error);
+       XCOPY_FIELD (copy, shadow_copy_directories, setup->shadow_copy_directories, error);
+       XCOPY_FIELD (copy, shadow_copy_files, setup->shadow_copy_files, error);
        copy->publisher_policy = setup->publisher_policy;
        copy->path_changed = setup->path_changed;
        copy->loader_optimization = setup->loader_optimization;
        copy->disallow_binding_redirects = setup->disallow_binding_redirects;
        copy->disallow_code_downloads = setup->disallow_code_downloads;
-       MONO_OBJECT_SETREF (copy, domain_initializer_args, mono_marshal_xdomain_copy_value ((MonoObject*)setup->domain_initializer_args));
+       XCOPY_FIELD (copy, domain_initializer_args, setup->domain_initializer_args, error);
        copy->disallow_appbase_probe = setup->disallow_appbase_probe;
-       MONO_OBJECT_SETREF (copy, application_trust, mono_marshal_xdomain_copy_value ((MonoObject*)setup->application_trust));
-       MONO_OBJECT_SETREF (copy, configuration_bytes, mono_marshal_xdomain_copy_value ((MonoObject*)setup->configuration_bytes));
-       MONO_OBJECT_SETREF (copy, serialized_non_primitives, mono_marshal_xdomain_copy_value ((MonoObject*)setup->serialized_non_primitives));
+       XCOPY_FIELD (copy, application_trust, setup->application_trust, error);
+       XCOPY_FIELD (copy, configuration_bytes, setup->configuration_bytes, error);
+       XCOPY_FIELD (copy, serialized_non_primitives, setup->serialized_non_primitives, error);
 
+#undef COPY_FIELD
+       
        mono_domain_set_internal (caller_domain);
 
        return copy;
index e3efe674fb90dcc4abf21fc316673c030b8ee7d7..d3c0a2b051762f2ec82b4f7b8095a053f78c9e9b 100644 (file)
@@ -593,7 +593,10 @@ void
 mono_marshal_use_aot_wrappers (gboolean use);
 
 MonoObject *
-mono_marshal_xdomain_copy_value (MonoObject *val);
+mono_marshal_xdomain_copy_value (MonoObject *val, MonoError *error);
+
+MonoObject *
+ves_icall_mono_marshal_xdomain_copy_value (MonoObject *val);
 
 int
 mono_mb_emit_save_args (MonoMethodBuilder *mb, MonoMethodSignature *sig, gboolean save_this);
index e047c51f1b68e7f638c0bb7dac2752a7b30cf945..e36eed07e37a50b15e863bfdc8808af2cdb19f8c 100644 (file)
@@ -193,7 +193,7 @@ mono_remoting_marshal_init (void)
                register_icall (type_from_handle, "type_from_handle", "object ptr", FALSE);
                register_icall (mono_marshal_set_domain_by_id, "mono_marshal_set_domain_by_id", "int32 int32 int32", FALSE);
                register_icall (mono_marshal_check_domain_image, "mono_marshal_check_domain_image", "int32 int32 ptr", FALSE);
-               register_icall (mono_marshal_xdomain_copy_value, "mono_marshal_xdomain_copy_value", "object object", FALSE);
+               register_icall (ves_icall_mono_marshal_xdomain_copy_value, "ves_icall_mono_marshal_xdomain_copy_value", "object object", FALSE);
                register_icall (mono_marshal_xdomain_copy_out_value, "mono_marshal_xdomain_copy_out_value", "void object object", FALSE);
                register_icall (mono_remoting_wrapper, "mono_remoting_wrapper", "object ptr ptr", FALSE);
                register_icall (mono_upgrade_remote_class_wrapper, "mono_upgrade_remote_class_wrapper", "void object object", FALSE);
@@ -210,6 +210,7 @@ mono_remoting_marshal_init (void)
        module_initialized = TRUE;
 }
 
+/* This is an icall, it will return NULL and set pending exception on failure */
 static MonoReflectionType *
 type_from_handle (MonoType *handle)
 {
@@ -221,7 +222,7 @@ type_from_handle (MonoType *handle)
        mono_class_init (klass);
 
        ret = mono_type_get_object_checked (domain, handle, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       mono_error_set_pending_exception (&error);
 
        return ret;
 }
@@ -507,6 +508,7 @@ mono_marshal_get_remoting_invoke (MonoMethod *method)
 static void
 mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst)
 {
+       MonoError error;
        if (src == NULL || dst == NULL) return;
        
        g_assert (mono_object_class (src) == mono_object_class (dst));
@@ -520,7 +522,9 @@ mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst)
                        int i, len = mono_array_length ((MonoArray *)dst);
                        for (i = 0; i < len; i++) {
                                MonoObject *item = (MonoObject *)mono_array_get ((MonoArray *)src, gpointer, i);
-                               mono_array_setref ((MonoArray *)dst, i, mono_marshal_xdomain_copy_value (item));
+                               MonoObject *item_copy = mono_marshal_xdomain_copy_value (item, &error);
+                               mono_error_raise_exception (&error); /* FIXME don't raise here */
+                               mono_array_setref ((MonoArray *)dst, i, item_copy);
                        }
                } else {
                        mono_array_full_copy ((MonoArray *)src, (MonoArray *)dst);
@@ -538,7 +542,7 @@ mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst)
 static void
 mono_marshal_emit_xdomain_copy_value (MonoMethodBuilder *mb, MonoClass *pclass)
 {
-       mono_mb_emit_icall (mb, mono_marshal_xdomain_copy_value);
+       mono_mb_emit_icall (mb, ves_icall_mono_marshal_xdomain_copy_value);
        mono_mb_emit_op (mb, CEE_CASTCLASS, pclass);
 }
 
@@ -2017,9 +2021,9 @@ mono_get_xdomain_marshal_type (MonoType *t)
  * Makes a copy of "val" suitable for the current domain.
  */
 MonoObject *
-mono_marshal_xdomain_copy_value (MonoObject *val)
+mono_marshal_xdomain_copy_value (MonoObject *val, MonoError *error)
 {
-       MonoError error;
+       mono_error_init (error);
        MonoDomain *domain;
        if (val == NULL) return NULL;
 
@@ -2041,16 +2045,14 @@ mono_marshal_xdomain_copy_value (MonoObject *val)
        case MONO_TYPE_U8:
        case MONO_TYPE_R4:
        case MONO_TYPE_R8: {
-               MonoObject *res = mono_value_box_checked (domain, mono_object_class (val), ((char*)val) + sizeof(MonoObject), &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               MonoObject *res = mono_value_box_checked (domain, mono_object_class (val), ((char*)val) + sizeof(MonoObject), error);
                return res;
 
        }
        case MONO_TYPE_STRING: {
                MonoString *str = (MonoString *) val;
                MonoObject *res = NULL;
-               res = (MonoObject *) mono_string_new_utf16_checked (domain, mono_string_chars (str), mono_string_length (str), &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               res = (MonoObject *) mono_string_new_utf16_checked (domain, mono_string_chars (str), mono_string_length (str), error);
                return res;
        }
        case MONO_TYPE_ARRAY:
@@ -2058,14 +2060,16 @@ mono_marshal_xdomain_copy_value (MonoObject *val)
                MonoArray *acopy;
                MonoXDomainMarshalType mt = mono_get_xdomain_marshal_type (&(mono_object_class (val)->element_class->byval_arg));
                if (mt == MONO_MARSHAL_SERIALIZE) return NULL;
-               acopy = mono_array_clone_in_domain (domain, (MonoArray *) val, &error);
-               mono_error_raise_exception (&error); /* FIXME don't raise here */
+               acopy = mono_array_clone_in_domain (domain, (MonoArray *) val, error);
+               return_val_if_nok (error, NULL);
 
                if (mt == MONO_MARSHAL_COPY) {
                        int i, len = mono_array_length (acopy);
                        for (i = 0; i < len; i++) {
                                MonoObject *item = (MonoObject *)mono_array_get (acopy, gpointer, i);
-                               mono_array_setref (acopy, i, mono_marshal_xdomain_copy_value (item));
+                               MonoObject *item_copy = mono_marshal_xdomain_copy_value (item, error);
+                               return_val_if_nok (error, NULL);
+                               mono_array_setref (acopy, i, item_copy);
                        }
                }
                return (MonoObject *) acopy;
@@ -2076,3 +2080,15 @@ mono_marshal_xdomain_copy_value (MonoObject *val)
 
        return NULL;
 }
+
+/* mono_marshal_xdomain_copy_value
+ * Makes a copy of "val" suitable for the current domain.
+ */
+MonoObject *
+ves_icall_mono_marshal_xdomain_copy_value (MonoObject *val)
+{
+       MonoError error;
+       MonoObject *result = mono_marshal_xdomain_copy_value (val, &error);
+       mono_error_set_pending_exception (&error);
+       return result;
+}