[runtime] MonoError-ize mono_message_init
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 11 May 2016 21:22:42 +0000 (17:22 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Wed, 18 May 2016 19:35:09 +0000 (15:35 -0400)
mono/metadata/icall.c
mono/metadata/marshal.c
mono/metadata/object-internals.h
mono/metadata/object.c

index 4b348f4526131ac8e73f2ffb0d14fab149530fba..21e0da4f6ef7a9fe19692358b2e08aa85f62221a 100644 (file)
@@ -7309,7 +7309,9 @@ ves_icall_MonoMethodMessage_InitMessage (MonoMethodMessage *this_obj,
                                         MonoReflectionMethod *method,
                                         MonoArray *out_args)
 {
-       mono_message_init (mono_object_domain (this_obj), this_obj, method, out_args);
+       MonoError error;
+       mono_message_init (mono_object_domain (this_obj), this_obj, method, out_args, &error);
+       mono_error_set_pending_exception (&error);
 }
 
 #ifndef DISABLE_REMOTING
index defc239505bd86e60a9804184407b0a8dd3cfba5..3d287127eb737452d3f8f03c21304f12f3bc1433 100644 (file)
@@ -2994,7 +2994,9 @@ mono_delegate_end_invoke (MonoDelegate *delegate, gpointer *params)
                        mono_error_set_pending_exception (&error);
                        return NULL;
                }
-               mono_message_init (domain, msg, delegate->method_info, NULL);
+               mono_message_init (domain, msg, delegate->method_info, NULL, &error);
+               if (mono_error_set_pending_exception (&error))
+                       return NULL;
                msg->call_type = CallType_EndInvoke;
                MONO_OBJECT_SETREF (msg, async_result, ares);
                res = mono_remoting_invoke ((MonoObject *)tp->rp, msg, &exc, &out_args, &error);
index 0fd9f00c4104a0aaeef05ad4b610bc825c6bb07d..a0df86df8ef17c7c8368916427810a6f9a8afa32 100644 (file)
@@ -605,9 +605,9 @@ mono_wait_handle_new            (MonoDomain *domain, HANDLE handle, MonoError *error);
 HANDLE
 mono_wait_handle_get_handle (MonoWaitHandle *handle);
 
-void
+gboolean
 mono_message_init          (MonoDomain *domain, MonoMethodMessage *this_obj, 
-                            MonoReflectionMethod *method, MonoArray *out_args);
+                            MonoReflectionMethod *method, MonoArray *out_args, MonoError *error);
 
 MonoObject *
 mono_message_invoke        (MonoObject *target, MonoMethodMessage *msg, 
index 3b27b7e1725e7089dcb46871cd569e6e3632f920..7e967ff304cd68de9a746a6a5973acfa55030c73 100644 (file)
@@ -7155,18 +7155,19 @@ ves_icall_System_Runtime_Remoting_Messaging_AsyncResult_Invoke (MonoAsyncResult
        return res;
 }
 
-void
+gboolean
 mono_message_init (MonoDomain *domain,
                   MonoMethodMessage *this_obj, 
                   MonoReflectionMethod *method,
-                  MonoArray *out_args)
+                  MonoArray *out_args,
+                  MonoError *error)
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
        static MonoClass *object_array_klass;
        static MonoClass *byte_array_klass;
        static MonoClass *string_array_klass;
-       MonoError error;
+       mono_error_init (error);
        MonoMethodSignature *sig = mono_method_signature (method->method);
        MonoString *name;
        MonoArray *arr;
@@ -7193,13 +7194,13 @@ mono_message_init (MonoDomain *domain,
 
        MONO_OBJECT_SETREF (this_obj, method, method);
 
-       arr = mono_array_new_specific_checked (mono_class_vtable (domain, object_array_klass), sig->param_count, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       arr = mono_array_new_specific_checked (mono_class_vtable (domain, object_array_klass), sig->param_count, error);
+       return_val_if_nok (error, FALSE);
 
        MONO_OBJECT_SETREF (this_obj, args, arr);
 
-       arr = mono_array_new_specific_checked (mono_class_vtable (domain, byte_array_klass), sig->param_count, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       arr = mono_array_new_specific_checked (mono_class_vtable (domain, byte_array_klass), sig->param_count, error);
+       return_val_if_nok (error, FALSE);
 
        MONO_OBJECT_SETREF (this_obj, arg_types, arr);
 
@@ -7209,13 +7210,16 @@ mono_message_init (MonoDomain *domain,
        names = g_new (char *, sig->param_count);
        mono_method_get_param_names (method->method, (const char **) names);
 
-       arr = mono_array_new_specific_checked (mono_class_vtable (domain, string_array_klass), sig->param_count, &error);
-       mono_error_raise_exception (&error); /* FIXME don't raise here */
+       arr = mono_array_new_specific_checked (mono_class_vtable (domain, string_array_klass), sig->param_count, error);
+       if (!is_ok (error))
+               goto fail;
 
        MONO_OBJECT_SETREF (this_obj, names, arr);
        
        for (i = 0; i < sig->param_count; i++) {
-               name = mono_string_new (domain, names [i]);
+               name = mono_string_new_checked (domain, names [i], error);
+               if (!is_ok (error))
+                       goto fail;
                mono_array_setref (this_obj->names, i, name);   
        }
 
@@ -7237,6 +7241,11 @@ mono_message_init (MonoDomain *domain,
                }
                mono_array_set (this_obj->arg_types, guint8, i, arg_type);
        }
+
+       return TRUE;
+fail:
+       g_free (names);
+       return FALSE;
 }
 
 #ifndef DISABLE_REMOTING
@@ -7581,12 +7590,14 @@ mono_method_call_message_new (MonoMethod *method, gpointer *params, MonoMethod *
        if (invoke) {
                MonoReflectionMethod *rm = mono_method_get_object_checked (domain, invoke, NULL, error);
                return_val_if_nok (error, NULL);
-               mono_message_init (domain, msg, rm, NULL);
+               mono_message_init (domain, msg, rm, NULL, error);
+               return_val_if_nok (error, NULL);
                count =  sig->param_count - 2;
        } else {
                MonoReflectionMethod *rm = mono_method_get_object_checked (domain, method, NULL, error);
                return_val_if_nok (error, NULL);
-               mono_message_init (domain, msg, rm, NULL);
+               mono_message_init (domain, msg, rm, NULL, error);
+               return_val_if_nok (error, NULL);
                count =  sig->param_count;
        }
 
@@ -7758,7 +7769,8 @@ mono_load_remote_field_checked (MonoObject *this_obj, MonoClass *klass, MonoClas
        return_val_if_nok (error, NULL);
        MonoReflectionMethod *rm = mono_method_get_object_checked (domain, getter, NULL, error);
        return_val_if_nok (error, NULL);
-       mono_message_init (domain, msg, rm, out_args);
+       mono_message_init (domain, msg, rm, out_args, error);
+       return_val_if_nok (error, NULL);
 
        full_name = mono_type_get_full_name (klass);
        mono_array_setref (msg->args, 0, mono_string_new (domain, full_name));
@@ -7885,7 +7897,8 @@ mono_load_remote_field_new_checked (MonoObject *this_obj, MonoClass *klass, Mono
 
        MonoReflectionMethod *rm = mono_method_get_object_checked (domain, getter, NULL, error);
        return_val_if_nok (error, NULL);
-       mono_message_init (domain, msg, rm, out_args);
+       mono_message_init (domain, msg, rm, out_args, error);
+       return_val_if_nok (error, NULL);
 
        full_name = mono_type_get_full_name (klass);
        mono_array_setref (msg->args, 0, mono_string_new (domain, full_name));
@@ -7989,7 +8002,8 @@ mono_store_remote_field_checked (MonoObject *this_obj, MonoClass *klass, MonoCla
        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);
+       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));
@@ -8089,7 +8103,8 @@ mono_store_remote_field_new_checked (MonoObject *this_obj, MonoClass *klass, Mon
        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);
+       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));