Author: zoltan
Date: 2007-10-21 13:28:14 -0400 (Sun, 21 Oct 2007)
New Revision: 87870

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/class.c
Log:
2007-10-21  Zoltan Varga  <[EMAIL PROTECTED]>

        * class.c (mono_generic_class_get_class): Avoid setting 
klass->size_inited and
        related fields for dynamic classes. Fixes #334493.


Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-10-21 15:45:43 UTC (rev 87869)
+++ trunk/mono/mono/metadata/ChangeLog  2007-10-21 17:28:14 UTC (rev 87870)
@@ -1,3 +1,8 @@
+2007-10-21  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * class.c (mono_generic_class_get_class): Avoid setting 
klass->size_inited and
+       related fields for dynamic classes. Fixes #334493.
+
 2007-10-20  Zoltan Varga  <[EMAIL PROTECTED]>
 
        * class.c (mono_generic_class_get_class): Set klass->field.count as 
well.

Modified: trunk/mono/mono/metadata/class.c
===================================================================
--- trunk/mono/mono/metadata/class.c    2007-10-21 15:45:43 UTC (rev 87869)
+++ trunk/mono/mono/metadata/class.c    2007-10-21 17:28:14 UTC (rev 87870)
@@ -3592,6 +3592,8 @@
        klass->this_arg.type = klass->byval_arg.type = MONO_TYPE_GENERICINST;
        klass->this_arg.data.generic_class = 
klass->byval_arg.data.generic_class = gclass;
        klass->this_arg.byref = TRUE;
+       klass->enumtype = gklass->enumtype;
+       klass->valuetype = gklass->valuetype;
 
        klass->cast_class = klass->element_class = klass;
 
@@ -3599,14 +3601,20 @@
                klass->cast_class = klass->element_class = 
mono_class_get_nullable_param (klass);
 
        if (gclass->is_dynamic) {
-               klass->instance_size = gklass->instance_size;
-               klass->sizes.class_size = gklass->sizes.class_size;
-               klass->size_inited = 1;
                klass->inited = 1;
 
-               klass->valuetype = gklass->valuetype;
+               mono_class_setup_supertypes (klass);
 
-               mono_class_setup_supertypes (klass);
+               if (klass->enumtype) {
+                       /*
+                        * For enums, gklass->fields might not been set, but 
instance_size etc. is 
+                        * already set in mono_reflection_create_internal_class 
(). For non-enums,
+                        * these will be computed normally in 
mono_class_layout_fields ().
+                        */
+                       klass->instance_size = gklass->instance_size;
+                       klass->sizes.class_size = gklass->sizes.class_size;
+                       klass->size_inited = 1;
+               }
        }
 
        klass->interface_count = gklass->interface_count;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to