Merge pull request #2653 from lambdageek/dev/exception_type-1
authormonojenkins <jo.shields+jenkins@xamarin.com>
Mon, 22 Feb 2016 19:30:33 +0000 (19:30 +0000)
committermonojenkins <jo.shields+jenkins@xamarin.com>
Mon, 22 Feb 2016 19:30:33 +0000 (19:30 +0000)
[runtime] Don't access MonoClass::exception_type directly.

Use `mono_class_get_failure ()` and `mono_class_has_failed ()`

This is mostly just cleanup refactoring at this point that will make it easier to change how exception_type is used.

Also from this exercise we've learned that most of the class handling code just cares whether the class has an error or not, not what sort of error it was.

1  2 
mono/metadata/object.c

diff --combined mono/metadata/object.c
index 8d0abf7f987dad246d19ebc24eca0641fc40d4d4,d1178cc1b78e8d991d19b35604b32e07145aa281..fdb00751ccd909b2f7fcbfac24451c47f8e9b6ba
@@@ -1872,7 -1872,7 +1872,7 @@@ mono_class_vtable_full (MonoDomain *dom
  
        g_assert (klass);
  
-       if (klass->exception_type) {
+       if (mono_class_has_failure (klass)) {
                if (raise_on_error)
                        mono_raise_exception (mono_class_get_exception_for_failure (klass));
                return NULL;
@@@ -1956,8 -1956,8 +1956,8 @@@ mono_class_create_runtime_vtable (MonoD
                mono_loader_unlock ();
                return runtime_info->domain_vtables [domain->domain_id];
        }
-       if (!klass->inited || klass->exception_type) {
-               if (!mono_class_init (klass) || klass->exception_type) {
+       if (!klass->inited || mono_class_has_failure (klass)) {
+               if (!mono_class_init (klass) || mono_class_has_failure (klass)) {
                        mono_domain_unlock (domain);
                        mono_loader_unlock ();
                        if (raise_on_error)
                        mono_class_init (element_class);
  
                /*mono_class_init can leave the vtable layout to be lazily done and we can't afford this here*/
-               if (element_class->exception_type == MONO_EXCEPTION_NONE && !element_class->vtable_size)
+               if (!mono_class_has_failure (element_class) && !element_class->vtable_size)
                        mono_class_setup_vtable (element_class);
                
-               if (element_class->exception_type != MONO_EXCEPTION_NONE) {
+               if (mono_class_has_failure (element_class)) {
                        /*Can happen if element_class only got bad after mono_class_setup_vtable*/
-                       if (klass->exception_type == MONO_EXCEPTION_NONE)
+                       if (!mono_class_has_failure (klass))
                                mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, NULL);
                        mono_domain_unlock (domain);
                        mono_loader_unlock ();
        /* Initialize klass->has_finalize */
        mono_class_has_finalizer (klass);
  
-       if (klass->exception_type) {
+       if (mono_class_has_failure (klass)) {
                mono_domain_unlock (domain);
                mono_loader_unlock ();
                if (raise_on_error)
@@@ -3730,7 -3730,7 +3730,7 @@@ mono_get_delegate_invoke (MonoClass *kl
  
        /* This is called at runtime, so avoid the slower search in metadata */
        mono_class_setup_methods (klass);
-       if (klass->exception_type)
+       if (mono_class_has_failure (klass))
                return NULL;
        im = mono_class_get_method_from_name (klass, "Invoke", -1);
        return im;
@@@ -3751,7 -3751,7 +3751,7 @@@ mono_get_delegate_begin_invoke (MonoCla
  
        /* This is called at runtime, so avoid the slower search in metadata */
        mono_class_setup_methods (klass);
-       if (klass->exception_type)
+       if (mono_class_has_failure (klass))
                return NULL;
        im = mono_class_get_method_from_name (klass, "BeginInvoke", -1);
        return im;
@@@ -3772,7 -3772,7 +3772,7 @@@ mono_get_delegate_end_invoke (MonoClas
  
        /* This is called at runtime, so avoid the slower search in metadata */
        mono_class_setup_methods (klass);
-       if (klass->exception_type)
+       if (mono_class_has_failure (klass))
                return NULL;
        im = mono_class_get_method_from_name (klass, "EndInvoke", -1);
        return im;
@@@ -6604,16 -6604,23 +6604,16 @@@ mono_wait_handle_get_handle (MonoWaitHa
  {
        MONO_REQ_GC_UNSAFE_MODE;
  
 -      static MonoClassField *f_os_handle;
 -      static MonoClassField *f_safe_handle;
 +      static MonoClassField *f_safe_handle = NULL;
 +      MonoSafeHandle *sh;
  
 -      if (!f_os_handle && !f_safe_handle) {
 -              f_os_handle = mono_class_get_field_from_name (mono_defaults.manualresetevent_class, "os_handle");
 -              f_safe_handle = mono_class_get_field_from_name (mono_defaults.manualresetevent_class, "safe_wait_handle");
 +      if (!f_safe_handle) {
 +              f_safe_handle = mono_class_get_field_from_name (mono_defaults.manualresetevent_class, "safeWaitHandle");
 +              g_assert (f_safe_handle);
        }
  
 -      if (f_os_handle) {
 -              HANDLE retval;
 -              mono_field_get_value ((MonoObject*)handle, f_os_handle, &retval);
 -              return retval;
 -      } else {
 -              MonoSafeHandle *sh;
 -              mono_field_get_value ((MonoObject*)handle, f_safe_handle, &sh);
 -              return sh->handle;
 -      }
 +      mono_field_get_value ((MonoObject*)handle, f_safe_handle, &sh);
 +      return sh->handle;
  }