From: Alexander Kyte Date: Tue, 31 May 2016 21:13:21 +0000 (-0400) Subject: [runtime] Use new mono_error_set_for_class_failure where applicable. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=356d3c3e2509154cd1f08e0eb205d7269bf7962d;p=mono.git [runtime] Use new mono_error_set_for_class_failure where applicable. We were seeing an issue where attempts to create the MonoClass for an exception in a no-exec context was causing failure. No-exec will forbid the constructor call. Our solution was to realize that there was no need to allocate an exception, as MonoError could already encode the errors. --- diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 5f9cabfc9e8..4376addf3e0 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -133,7 +133,7 @@ mono_class_init_checked (MonoClass *klass, MonoError *error) mono_error_init (error); if (!mono_class_init (klass)) - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (klass)); + mono_error_set_for_class_failure (error, klass); } ICALL_EXPORT MonoObject * @@ -4320,9 +4320,8 @@ handle_parent: loader_error: - if (mono_class_has_failure (klass)) { - mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass)); - } + if (mono_class_has_failure (klass)) + mono_error_set_for_class_failure (&error, klass); failure: if (properties) @@ -4469,9 +4468,8 @@ handle_parent: return res; loader_error: - if (mono_class_has_failure (klass)) { - mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass)); - } + if (mono_class_has_failure (klass)) + mono_error_set_for_class_failure (&error, klass); failure: diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 5da5f6bbf33..18f9bbf017c 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -1905,7 +1905,7 @@ mono_class_vtable_full (MonoDomain *domain, MonoClass *klass, MonoError *error) g_assert (klass); if (mono_class_has_failure (klass)) { - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (klass)); + mono_error_set_for_class_failure (error, klass); return NULL; } @@ -1992,7 +1992,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *klass, MonoErro if (!mono_class_init (klass) || mono_class_has_failure (klass)) { mono_domain_unlock (domain); mono_loader_unlock (); - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (klass)); + mono_error_set_for_class_failure (error, klass); return NULL; } } @@ -2013,7 +2013,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *klass, MonoErro mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, NULL); mono_domain_unlock (domain); mono_loader_unlock (); - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (klass)); + mono_error_set_for_class_failure (error, klass); return NULL; } } @@ -2034,7 +2034,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *klass, MonoErro if (mono_class_has_failure (klass)) { mono_domain_unlock (domain); mono_loader_unlock (); - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (klass)); + mono_error_set_for_class_failure (error, klass); return NULL; } diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index a9b46372aa6..2dd53c18b14 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -8989,7 +8989,7 @@ mono_reflection_get_token_checked (MonoObject *obj, MonoError *error) return_val_if_nok (error, 0); MonoClass *mc = mono_class_from_mono_type (type); if (!mono_class_init (mc)) { - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (mc)); + mono_error_set_for_class_failure (error, mc); return 0; } @@ -9818,7 +9818,7 @@ reflection_resolve_custom_attribute_data (MonoReflectionMethod *ref_method, Mono domain = mono_object_domain (ref_method); if (!mono_class_init (method->klass)) { - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (method->klass)); + mono_error_set_for_class_failure (error, method->klass); goto leave; } @@ -13952,7 +13952,7 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon return_val_if_nok (error, NULL); MonoClass *mc = mono_class_from_mono_type (type); if (!mono_class_init (mc)) { - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (mc)); + mono_error_set_for_class_failure (error, mc); return NULL; } diff --git a/mono/mini/mini-generic-sharing.c b/mono/mini/mini-generic-sharing.c index 84c21c5890e..e1e2eb19b43 100644 --- a/mono/mini/mini-generic-sharing.c +++ b/mono/mini/mini-generic-sharing.c @@ -862,7 +862,7 @@ class_type_info (MonoDomain *domain, MonoClass *klass, MonoRgctxInfoType info_ty case MONO_RGCTX_INFO_STATIC_DATA: { MonoVTable *vtable = mono_class_vtable (domain, klass); if (!vtable) { - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (klass)); + mono_error_set_for_class_failure (error, klass); return NULL; } return mono_vtable_get_static_field_data (vtable); @@ -874,7 +874,7 @@ class_type_info (MonoDomain *domain, MonoClass *klass, MonoRgctxInfoType info_ty case MONO_RGCTX_INFO_VTABLE: { MonoVTable *vtable = mono_class_vtable (domain, klass); if (!vtable) { - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (klass)); + mono_error_set_for_class_failure (error, klass); return NULL; } return vtable; @@ -1704,7 +1704,7 @@ instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti vtable = mono_class_vtable (domain, method->method.method.klass); if (!vtable) { - mono_error_set_exception_instance (error, mono_class_get_exception_for_failure (method->method.method.klass)); + mono_error_set_for_class_failure (error, method->method.method.klass); return NULL; }