2008-03-16 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Sun, 16 Mar 2008 00:37:21 +0000 (00:37 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sun, 16 Mar 2008 00:37:21 +0000 (00:37 -0000)
* class.c (mono_class_setup_fields): Ignore calls made to this function for
classes which are generic instances of not-yet finished typebuilders. Fixes
#351172.

* reflection.c (fixup_method): Add support for FieldOnTypeBuilderInst.

svn path=/trunk/mono/; revision=98409

mono/metadata/ChangeLog
mono/metadata/class.c
mono/metadata/reflection.c

index 8284273b750ad58c7cb528430741baf99511a75a..508aec8be5b02d2f0fbf61b68a0bb71b15ee7993 100644 (file)
@@ -1,3 +1,11 @@
+2008-03-16  Zoltan Varga  <vargaz@gmail.com>
+
+       * class.c (mono_class_setup_fields): Ignore calls made to this function for
+       classes which are generic instances of not-yet finished typebuilders. Fixes
+       #351172.
+
+       * reflection.c (fixup_method): Add support for FieldOnTypeBuilderInst.
+
 2008-03-15  Zoltan Varga  <vargaz@gmail.com>
 
        * metadata-internals.h (MonoDynamicImage): Add 'generic_def_objects' hash table.
index 43455ba98a3987aa24e75f8aca9382c0fb0b78e1..d473cbfafd66be25f9b9070b4c90d78b8a98c161 100644 (file)
@@ -817,6 +817,16 @@ mono_class_setup_fields (MonoClass *class)
        if (class->size_inited)
                return;
 
+       if (class->generic_class && class->generic_class->container_class->image->dynamic && !class->generic_class->container_class->wastypebuilder) {
+               /*
+                * This happens when a generic instance of an unfinished generic typebuilder
+                * is used as an element type for creating an array type. We can't initialize
+                * the fields of this class using the fields of gklass, since gklass is not
+                * finished yet, fields could be added to it later.
+                */
+               return;
+       }
+
        if (class->generic_class) {
                MonoClass *gklass = class->generic_class->container_class;
                mono_class_setup_fields (gklass);
index d2209ae013933bf012b935d45db851f6b1a626ff..df7582645fc388b29e75f070f477b9af47829bbf 100644 (file)
@@ -3595,7 +3595,8 @@ build_compressed_metadata (MonoDynamicImage *assembly)
  * tokens for the method with ILGenerator @ilgen.
  */
 static void
-fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *assembly) {
+fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *assembly)
+{
        guint32 code_idx = GPOINTER_TO_UINT (value);
        MonoReflectionILTokenInfo *iltoken;
        MonoReflectionFieldBuilder *field;
@@ -3662,6 +3663,8 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MethodBuilder") ||
                                        !strcmp (iltoken->member->vtable->klass->name, "ConstructorBuilder")) {
                                continue;
+                       } else if (!strcmp (iltoken->member->vtable->klass->name, "FieldOnTypeBuilderInst")) {
+                               continue;
                        } else {
                                g_assert_not_reached ();
                        }