From ef88a33d1c36393dc79c4cbc72a51d1f5ab0d6a7 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 22 Feb 2017 14:24:28 -0800 Subject: [PATCH] [loader] When loading the parent of a GTD fails. We must disable gclass recording for it. mono_class_create_from_typedef: When loading a GTD, we track what ginsts' of it were loaded in the meanwhile so we can fix some information that will be wrong (such as if it's a VT or not). Were not stopping the recording when a GTD type failed to load its parent. This would result in *A LOT* of ginsts being captured and would cause issues during domain unload. --- mono/metadata/class.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mono/metadata/class.c b/mono/metadata/class.c index c1ebbbb3a96..fca116671a0 100644 --- a/mono/metadata/class.c +++ b/mono/metadata/class.c @@ -5418,6 +5418,12 @@ mono_class_setup_supertypes (MonoClass *klass) mono_loader_unlock (); } +static gboolean +discard_gclass_due_to_failure (MonoClass *gclass, void *user_data) +{ + return mono_class_get_generic_class (gclass)->container_class == user_data; +} + static gboolean fix_gclass_incomplete_instantiation (MonoClass *gclass, void *user_data) { @@ -5711,6 +5717,9 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token, MonoError return klass; parent_failure: + if (mono_class_is_gtd (klass)) + disable_gclass_recording (discard_gclass_due_to_failure, klass); + mono_class_setup_mono_type (klass); mono_loader_unlock (); mono_profiler_class_loaded (klass, MONO_PROFILE_FAILED); -- 2.25.1