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;
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);
module_initialized = TRUE;
}
+/* This is an icall, it will return NULL and set pending exception on failure */
static MonoReflectionType *
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;
}
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));
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);
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);
}
* 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;
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:
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;
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;
+}