From d02c43e23e1ae9ac293e1bf2f41592959b5f664c Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Wed, 6 Mar 2019 08:41:55 -0800 Subject: [PATCH] Propagate type load errors out of IsAssignableFrom instead of erroneously returning false. Makes the underlying cause of #13113 discoverable. (#13324) --- mono/metadata/class.c | 11 +++++++++-- mono/metadata/icall.c | 5 ++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/mono/metadata/class.c b/mono/metadata/class.c index a9ac72058d7..a016be58664 100644 --- a/mono/metadata/class.c +++ b/mono/metadata/class.c @@ -3543,13 +3543,20 @@ mono_class_is_assignable_from_checked (MonoClass *klass, MonoClass *oklass, gboo if (!m_class_is_inited (oklass)) mono_class_init_internal (oklass); - if (mono_class_has_failure (klass) || mono_class_has_failure (oklass)) { + if (mono_class_has_failure (klass)) { + mono_error_set_for_class_failure (error, klass); + *result = FALSE; + return; + } + + if (mono_class_has_failure (oklass)) { + mono_error_set_for_class_failure (error, oklass); *result = FALSE; return; } MonoType *klass_byval_arg = m_class_get_byval_arg (klass); - MonoType *oklass_byval_arg = m_class_get_byval_arg (oklass); + MonoType *oklass_byval_arg = m_class_get_byval_arg (oklass); if (mono_type_is_generic_argument (klass_byval_arg)) { if (!mono_type_is_generic_argument (oklass_byval_arg)) { diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index b2cdf8e3c34..0a2b7b8f6b2 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -1752,7 +1752,10 @@ ves_icall_RuntimeTypeHandle_type_is_assignable_from (MonoReflectionTypeHandle re return m_class_is_valuetype (klass) == m_class_is_valuetype (klassc); } } - return mono_class_is_assignable_from_internal (klass, klassc); + + gboolean result; + mono_class_is_assignable_from_checked (klass, klassc, &result, error); + return (guint32)result; } MonoBoolean -- 2.11.4.GIT