[sre] Handle typeref tokens in fixup_method (Fixes #58421)
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 26 Jul 2017 23:37:20 +0000 (19:37 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Thu, 27 Jul 2017 15:00:10 +0000 (11:00 -0400)
This may occur if there are two AssemblyBuilders in progress and one of them
refers to a TypeBuilder from the other.

https://bugzilla.xamarin.com/show_bug.cgi?id=58421

mono/metadata/sre-save.c

index d36381357caaa2355b4eec5b4169ab7d4fe66f33..5d26024218b6b989b631d52daecf5db42bb53530 100644 (file)
@@ -1759,6 +1759,14 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
                                g_assert_not_reached ();
                        }
                        break;
+               case MONO_TABLE_TYPEREF:
+                       g_assert (!strcmp (iltoken->member->vtable->klass->name, "RuntimeType"));
+                       MonoClass *k = mono_class_from_mono_type (((MonoReflectionType*)iltoken->member)->type);
+                       MonoObject *obj = mono_class_get_ref_info_raw (k); /* FIXME use handles */
+                       g_assert (obj);
+                       g_assert (!strcmp (mono_object_class (obj)->name, "TypeBuilder"));
+                       g_assert (((MonoReflectionTypeBuilder*)obj)->module->dynamic_image != assembly);
+                       continue;
                case MONO_TABLE_MEMBERREF:
                        if (!strcmp (iltoken->member->vtable->klass->name, "MonoArrayMethod")) {
                                am = (MonoReflectionArrayMethod*)iltoken->member;