Better handle of loading the interfaces of a type.
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 16 Nov 2010 20:31:46 +0000 (18:31 -0200)
committerRodrigo Kumpera <kumpera@gmail.com>
Tue, 16 Nov 2010 20:31:46 +0000 (18:31 -0200)
* loader.c (find_method): Instead of asserting when
a type has its interfaces missing, ignore them and
keep searching.

Fixes #560346

mono/metadata/loader.c

index bd0f8356a436b9762a2fff7a17c650437cac5f15..0dcbfc748afc5d38d86da30c13e9fc9f724845b1 100644 (file)
@@ -681,7 +681,16 @@ find_method (MonoClass *in_class, MonoClass *ic, const char* name, MonoMethodSig
                if (name [0] == '.' && (!strcmp (name, ".ctor") || !strcmp (name, ".cctor")))
                        break;
 
-               g_assert (from_class->interface_offsets_count == in_class->interface_offsets_count);
+               /*
+                * This happens when we fail to lazily load the interfaces of one of the types.
+                * On such case we can't just bail out since user code depends on us trying harder.
+                */
+               if (from_class->interface_offsets_count != in_class->interface_offsets_count) {
+                       in_class = in_class->parent;
+                       from_class = from_class->parent;
+                       continue;
+               }
+
                for (i = 0; i < in_class->interface_offsets_count; i++) {
                        MonoClass *in_ic = in_class->interfaces_packed [i];
                        MonoClass *from_ic = from_class->interfaces_packed [i];