Merge pull request #3344 from alexanderkyte/propagate_mono_error_async
authorAleksey Kliger (λgeek) <akliger@gmail.com>
Tue, 2 Aug 2016 15:31:44 +0000 (11:31 -0400)
committerGitHub <noreply@github.com>
Tue, 2 Aug 2016 15:31:44 +0000 (11:31 -0400)
[runtime] Propagate async MonoError to AsyncResult

1  2 
mono/metadata/object.c

diff --combined mono/metadata/object.c
index 7bb2b43beaf795a85ecf1bcd9c94fb7804a30c98,d17062d55ac74486fb71c507b51169e70ca9fa07..3f61428872f77097b9890ebc75896f26de35786d
@@@ -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