[reflection] Use coop handles for MonoEventInfo.get_event_info
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 16 Mar 2017 21:25:13 +0000 (17:25 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Fri, 14 Apr 2017 14:59:24 +0000 (10:59 -0400)
mono/metadata/icall-def.h
mono/metadata/icall.c

index 6611e02de6bf6a96a29b6ff242fd6392523675e6..a8367ddda0b693e6c0559b0808513aa6a9e94b06 100644 (file)
@@ -604,7 +604,7 @@ ICALL(MCMETH_2, "InternalInvoke", ves_icall_InternalInvoke)
 HANDLES(ICALL(MCMETH_3, "get_core_clr_security_level", ves_icall_MonoMethod_get_core_clr_security_level))
 
 ICALL_TYPE(MEVIN, "System.Reflection.MonoEventInfo", MEVIN_1)
-ICALL(MEVIN_1, "get_event_info", ves_icall_MonoEventInfo_get_event_info)
+HANDLES(ICALL(MEVIN_1, "get_event_info", ves_icall_MonoEventInfo_get_event_info))
 
 ICALL_TYPE(MFIELD, "System.Reflection.MonoField", MFIELD_1)
 ICALL(MFIELD_1, "GetFieldOffset", ves_icall_MonoField_GetFieldOffset)
index 2765f97166ff20012c0d2d460f2c0d297ebb242c..0da1d6c6e1b711ca5919f1140f87c43f7de4f02a 100644 (file)
@@ -2224,75 +2224,83 @@ ves_icall_MonoPropertyInfo_get_property_info (MonoReflectionPropertyHandle prope
         */
 }
 
+static gboolean
+add_event_other_methods_to_array (MonoDomain *domain, MonoMethod *m, MonoArrayHandle dest, int i, MonoError *error)
+{
+       HANDLE_FUNCTION_ENTER ();
+       error_init (error);
+       MonoReflectionMethodHandle rm = mono_method_get_object_handle (domain, m, NULL, error);
+       if (!is_ok (error))
+               goto leave;
+       MONO_HANDLE_ARRAY_SETREF (dest, i, rm);
+leave:
+       HANDLE_FUNCTION_RETURN_VAL (is_ok (error));
+}
+
 ICALL_EXPORT void
-ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)
+ves_icall_MonoEventInfo_get_event_info (MonoReflectionMonoEventHandle ref_event, MonoEventInfo *info, MonoError *error)
 {
-       MonoError error;
-       MonoReflectionType *rt;
-       MonoReflectionMethod *rm;
-       MonoDomain *domain = mono_object_domain (event); 
+       error_init (error);
+       MonoDomain *domain = MONO_HANDLE_DOMAIN (ref_event); 
 
-       rt = mono_type_get_object_checked (domain, &event->klass->byval_arg, &error);
-       if (mono_error_set_pending_exception (&error))
-               return;
+       MonoClass *klass = MONO_HANDLE_GETVAL (ref_event, klass);
+       MonoEvent *event = MONO_HANDLE_GETVAL (ref_event, event);
 
-       MONO_STRUCT_SETREF (info, reflected_type, rt);
+       MonoReflectionTypeHandle rt = mono_type_get_object_handle (domain, &klass->byval_arg, error);
+       return_if_nok (error);
+       MONO_STRUCT_SETREF (info, reflected_type, MONO_HANDLE_RAW (rt));
 
-       rt = mono_type_get_object_checked (domain, &event->event->parent->byval_arg, &error);
-       if (mono_error_set_pending_exception (&error))
-               return;
+       rt = mono_type_get_object_handle (domain, &event->parent->byval_arg, error);
+       return_if_nok (error);
+       MONO_STRUCT_SETREF (info, declaring_type, MONO_HANDLE_RAW (rt));
 
-       MONO_STRUCT_SETREF (info, declaring_type, rt);
+       MonoStringHandle ev_name = mono_string_new_handle (domain, event->name, error);
+       return_if_nok (error);
+       MONO_STRUCT_SETREF (info, name, MONO_HANDLE_RAW (ev_name));
 
-       MONO_STRUCT_SETREF (info, name, mono_string_new (domain, event->event->name));
-       info->attrs = event->event->attrs;
+       info->attrs = event->attrs;
 
-       if (event->event->add) {
-               rm = mono_method_get_object_checked (domain, event->event->add, NULL, &error);
-               if (mono_error_set_pending_exception (&error))
-                       return;
+       MonoReflectionMethodHandle rm;
+       if (event->add) {
+               rm = mono_method_get_object_handle (domain, event->add, NULL, error);
+               return_if_nok (error);
        } else {
-               rm = NULL;
+               rm = MONO_HANDLE_NEW (MonoReflectionMethod, NULL);
        }
 
-       MONO_STRUCT_SETREF (info, add_method, rm);
+       MONO_STRUCT_SETREF (info, add_method, MONO_HANDLE_RAW (rm));
 
-       if (event->event->remove) {
-               rm = mono_method_get_object_checked (domain, event->event->remove, NULL, &error);
-               if (mono_error_set_pending_exception (&error))
-                       return;
+       if (event->remove) {
+               rm = mono_method_get_object_handle (domain, event->remove, NULL, error);
+               return_if_nok (error);
        } else {
-               rm = NULL;
+               rm = MONO_HANDLE_NEW (MonoReflectionMethod, NULL);
        }
 
-       MONO_STRUCT_SETREF (info, remove_method, rm);
+       MONO_STRUCT_SETREF (info, remove_method, MONO_HANDLE_RAW (rm));
 
-       if (event->event->raise) {
-               rm = mono_method_get_object_checked (domain, event->event->raise, NULL, &error);
-               if (mono_error_set_pending_exception (&error))
-                       return;
+       if (event->raise) {
+               rm = mono_method_get_object_handle (domain, event->raise, NULL, error);
+               return_if_nok (error);
        } else {
-               rm = NULL;
+               rm = MONO_HANDLE_NEW (MonoReflectionMethod, NULL);
        }
 
-       MONO_STRUCT_SETREF (info, raise_method, rm);
+       MONO_STRUCT_SETREF (info, raise_method, MONO_HANDLE_RAW (rm));
 
 #ifndef MONO_SMALL_CONFIG
-       if (event->event->other) {
+       if (event->other) {
                int i, n = 0;
-               while (event->event->other [n])
+               while (event->other [n])
                        n++;
-               MonoArray *info_arr = mono_array_new_checked (domain, mono_defaults.method_info_class, n, &error);
-               if (mono_error_set_pending_exception (&error))
-                       return;
-               MONO_STRUCT_SETREF (info, other_methods, info_arr);
+               MonoArrayHandle info_arr = mono_array_new_handle (domain, mono_defaults.method_info_class, n, error);
+               return_if_nok (error);
 
-               for (i = 0; i < n; i++) {
-                       rm = mono_method_get_object_checked (domain, event->event->other [i], NULL, &error);
-                       if (mono_error_set_pending_exception (&error))
+               MONO_STRUCT_SETREF (info, other_methods, MONO_HANDLE_RAW  (info_arr));
+
+               for (i = 0; i < n; i++)
+                       if (!add_event_other_methods_to_array (domain, event->other [i], info_arr, i, error))
                                return;
-                       mono_array_setref (info->other_methods, i, rm);
-               }
        }               
 #endif
 }