From: Aleksey Kliger (λgeek) Date: Tue, 2 Aug 2016 15:31:44 +0000 (-0400) Subject: Merge pull request #3344 from alexanderkyte/propagate_mono_error_async X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=3a980691bc2bca44ed45a4dc2fdf8fee8fbb2914;hp=-c;p=mono.git Merge pull request #3344 from alexanderkyte/propagate_mono_error_async [runtime] Propagate async MonoError to AsyncResult --- 3a980691bc2bca44ed45a4dc2fdf8fee8fbb2914 diff --combined mono/metadata/object.c index 7bb2b43beaf,d17062d55ac..3f61428872f --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@@ -7532,9 -7532,17 +7532,17 @@@ ves_icall_System_Runtime_Remoting_Messa gpointer wait_event = NULL; ac->msg->exc = NULL; - res = mono_message_invoke (ares->async_delegate, ac->msg, &ac->msg->exc, &ac->out_args, &error); - if (mono_error_set_pending_exception (&error)) - return NULL; + + MonoError invoke_error; + res = mono_message_invoke (ares->async_delegate, ac->msg, &ac->msg->exc, &ac->out_args, &invoke_error); + + if (!ac->msg->exc) { + MonoException *ex = mono_error_convert_to_exception (&invoke_error); + ac->msg->exc = (MonoObject *)ex; + } else { + mono_error_cleanup (&invoke_error); + } + MONO_OBJECT_SETREF (ac, res, res); mono_monitor_enter ((MonoObject*) ares); @@@ -8288,24 -8296,65 +8296,24 @@@ mono_store_remote_field_checked (MonoOb MONO_REQ_GC_UNSAFE_MODE; - static MonoMethod *setter = NULL; + mono_error_init (error); MonoDomain *domain = mono_domain_get (); - MonoTransparentProxy *tp = (MonoTransparentProxy *) this_obj; MonoClass *field_class; - MonoMethodMessage *msg; - MonoArray *out_args; - MonoObject *exc; MonoObject *arg; - char* full_name; - - mono_error_init (error); g_assert (mono_object_is_transparent_proxy (this_obj)); field_class = mono_class_from_mono_type (field->type); - if (mono_class_is_contextbound (tp->remote_class->proxy_class) && tp->rp->context == (MonoObject *) mono_context_get ()) { - if (field_class->valuetype) mono_field_set_value (tp->rp->unwrapped_server, field, val); - else mono_field_set_value (tp->rp->unwrapped_server, field, *((MonoObject **)val)); - return TRUE; - } - - if (!setter) { - setter = mono_class_get_method_from_name (mono_defaults.object_class, "FieldSetter", -1); - if (!setter) { - mono_error_set_not_supported (error, "Linked away."); - return FALSE; - } - } - if (field_class->valuetype) { arg = mono_value_box_checked (domain, field_class, val, error); return_val_if_nok (error, FALSE); - } else - arg = *((MonoObject **)val); - - - msg = (MonoMethodMessage *)mono_object_new_checked (domain, mono_defaults.mono_method_message_class, error); - return_val_if_nok (error, FALSE); - MonoReflectionMethod *rm = mono_method_get_object_checked (domain, setter, NULL, error); - return_val_if_nok (error, FALSE); - mono_message_init (domain, msg, rm, NULL, error); - return_val_if_nok (error, FALSE); - - full_name = mono_type_get_full_name (klass); - mono_array_setref (msg->args, 0, mono_string_new (domain, full_name)); - mono_array_setref (msg->args, 1, mono_string_new (domain, mono_field_get_name (field))); - mono_array_setref (msg->args, 2, arg); - g_free (full_name); - - mono_remoting_invoke ((MonoObject *)(tp->rp), msg, &exc, &out_args, error); - return_val_if_nok (error, FALSE); - - if (exc) { - mono_error_set_exception_instance (error, (MonoException *)exc); - return FALSE; + } else { + arg = *((MonoObject**)val); } - return TRUE; + + return mono_store_remote_field_new_checked (this_obj, klass, field, arg, error); } /** @@@ -8325,6 -8374,23 +8333,6 @@@ mono_store_remote_field_new (MonoObjec mono_error_cleanup (&error); } -/** - * mono_store_remote_field_new_icall: - * @this_obj: - * @klass: - * @field: - * @arg: - * - * Missing documentation - */ -void -mono_store_remote_field_new_icall (MonoObject *this_obj, MonoClass *klass, MonoClassField *field, MonoObject *arg) -{ - MonoError error; - (void) mono_store_remote_field_new_checked (this_obj, klass, field, arg, &error); - mono_error_set_pending_exception (&error); -} - /** * mono_store_remote_field_new_checked: * @this_obj: @@@ -8340,27 -8406,56 +8348,27 @@@ mono_store_remote_field_new_checked (Mo { MONO_REQ_GC_UNSAFE_MODE; - static MonoMethod *setter = NULL; - MonoDomain *domain = mono_domain_get (); - MonoTransparentProxy *tp = (MonoTransparentProxy *) this_obj; - MonoClass *field_class; - MonoMethodMessage *msg; - MonoArray *out_args; - MonoObject *exc; - char* full_name; + static MonoMethod *tp_store = NULL; mono_error_init (error); g_assert (mono_object_is_transparent_proxy (this_obj)); - field_class = mono_class_from_mono_type (field->type); - - if (mono_class_is_contextbound (tp->remote_class->proxy_class) && tp->rp->context == (MonoObject *) mono_context_get ()) { - if (field_class->valuetype) mono_field_set_value (tp->rp->unwrapped_server, field, ((gchar *) arg) + sizeof (MonoObject)); - else mono_field_set_value (tp->rp->unwrapped_server, field, arg); - return TRUE; - } - - if (!setter) { - setter = mono_class_get_method_from_name (mono_defaults.object_class, "FieldSetter", -1); - if (!setter) { + if (!tp_store) { + tp_store = mono_class_get_method_from_name (mono_defaults.transparent_proxy_class, "StoreRemoteField", -1); + if (!tp_store) { mono_error_set_not_supported (error, "Linked away."); return FALSE; } } - msg = (MonoMethodMessage *)mono_object_new_checked (domain, mono_defaults.mono_method_message_class, error); - return_val_if_nok (error, FALSE); - MonoReflectionMethod *rm = mono_method_get_object_checked (domain, setter, NULL, error); - return_val_if_nok (error, FALSE); - mono_message_init (domain, msg, rm, NULL, error); - return_val_if_nok (error, FALSE); - - full_name = mono_type_get_full_name (klass); - mono_array_setref (msg->args, 0, mono_string_new (domain, full_name)); - mono_array_setref (msg->args, 1, mono_string_new (domain, mono_field_get_name (field))); - mono_array_setref (msg->args, 2, arg); - g_free (full_name); - - mono_remoting_invoke ((MonoObject *)(tp->rp), msg, &exc, &out_args, error); - return_val_if_nok (error, FALSE); + gpointer args[3]; + args [0] = &klass; + args [1] = &field; + args [2] = arg; - if (exc) { - mono_error_set_exception_instance (error, (MonoException *)exc); - return FALSE; - } - return TRUE; + mono_runtime_invoke_checked (tp_store, this_obj, args, error); + return is_ok (error); } #endif