2003-05-14 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Wed, 14 May 2003 14:16:08 +0000 (14:16 -0000)
committerZoltan Varga <vargaz@gmail.com>
Wed, 14 May 2003 14:16:08 +0000 (14:16 -0000)
* class.h class.c reflection.c object.c: Added support for field
defaults in dynamically generated classes.

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

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

index 9b2796d9e9a04172014ed661d7a57b2bfb2c84df..fb7a28b400811f1e2424cffeaee57331e883fc9c 100644 (file)
@@ -1,3 +1,7 @@
+2003-05-14  Zoltan Varga  <vargaz@freemail.hu>
+
+       * class.h class.c reflection.c object.c: Added support for field
+       defaults in dynamically generated classes.
 
 Wed May 14 13:35:27 CEST 2003 Paolo Molaro <lupus@ximian.com>
 
index 6df8446401f772297843b85d4e5a6517c32d9fb2..ac3a448134cd9ffd96f8f1da5896457f35bd41a0 100644 (file)
@@ -249,6 +249,8 @@ class_compute_field_layout (MonoClass *class)
        for (i = 0; i < top; i++){
                const char *sig;
                guint32 cols [MONO_FIELD_SIZE];
+               guint32 constant_cols [MONO_CONSTANT_SIZE];
+               guint32 cindex;
                int idx = class->field.first + i;
                
                mono_metadata_decode_row (t, idx, cols, CSIZE (cols));
@@ -290,6 +292,19 @@ class_compute_field_layout (MonoClass *class)
                        class->cast_class = class->element_class = mono_class_from_mono_type (class->enum_basetype);
                        blittable = class->element_class->blittable;
                }
+
+               if ((class->fields [i].type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT) &&
+                       (class->fields [i].type->attrs & FIELD_ATTRIBUTE_STATIC)) {
+                       cindex = mono_metadata_get_constant_index (class->image, MONO_TOKEN_FIELD_DEF | (class->field.first + i + 1));
+                       if (!cindex) {
+                               g_warning ("constant for field %s:%s not found", class->name, class->fields [i].name);
+                               continue;
+                       }
+                       mono_metadata_decode_row (&class->image->tables [MONO_TABLE_CONSTANT], cindex - 1, constant_cols, MONO_CONSTANT_SIZE);
+                       class->fields [i].def_value = g_new0 (MonoConstant, 1);
+                       class->fields [i].def_value->type = constant_cols [MONO_CONSTANT_TYPE];
+                       class->fields [i].def_value->value = (gpointer)mono_metadata_blob_heap (class->image, constant_cols [MONO_CONSTANT_VALUE]);
+               }
        }
 
        if (class == mono_defaults.string_class)
index 47180f38be6846c0434c77d5bb7afeb9b15b4cb5..27b5428ddeecac39fc0ce8cd5d4b86ee290bd7dc 100644 (file)
 extern gboolean mono_print_vtable;
 typedef struct MonoVTable MonoVTable;
 
+typedef struct {
+       MonoTypeEnum type;
+       gpointer value;
+} MonoConstant;
+
 typedef struct {
        MonoType        *type;
        int              offset;
        const char      *name;
        const char      *data;
        MonoClass       *parent;
+       MonoConstant    *def_value;
 } MonoClassField;
 
 typedef struct {
index 671fbc2b592249c926eb10276f05f6331fd3e4c2..36f82fee18b4b3eef6d7533dd65666f4cc566bee 100644 (file)
@@ -315,8 +315,6 @@ mono_class_vtable (MonoDomain *domain, MonoClass *class)
 {
        MonoVTable *vt;
        MonoClassField *field;
-       guint32 cindex;
-       guint32 cols [MONO_CONSTANT_SIZE];
        const char *p;
        char *t;
        int i, len;
@@ -391,17 +389,11 @@ mono_class_vtable (MonoDomain *domain, MonoClass *class)
                }
                if (!(field->type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT))
                        continue;
-               cindex = mono_metadata_get_constant_index (class->image, MONO_TOKEN_FIELD_DEF | (i + 1));
-               if (!cindex) {
-                       g_warning ("constant for field %s not found", field->name);
-                       continue;
-               }
-               mono_metadata_decode_row (&class->image->tables [MONO_TABLE_CONSTANT], cindex - 1, cols, MONO_CONSTANT_SIZE);
-               p = mono_metadata_blob_heap (class->image, cols [MONO_CONSTANT_VALUE]);
+               p = field->def_value->value;
                len = mono_metadata_decode_blob_size (p, &p);
                t = (char*)vt->data + field->offset;
                /* should we check that the type matches? */
-               switch (cols [MONO_CONSTANT_TYPE]) {
+               switch (field->def_value->type) {
                case MONO_TYPE_BOOLEAN:
                case MONO_TYPE_U1:
                case MONO_TYPE_I1:
@@ -456,7 +448,7 @@ mono_class_vtable (MonoDomain *domain, MonoClass *class)
                        /* nothing to do, we malloc0 the data and the value can be 0 only */
                        break;
                default:
-                       g_warning ("type 0x%02x should not be in constant table", cols [MONO_CONSTANT_TYPE]);
+                       g_warning ("type 0x%02x should not be in constant table", field->def_value->type);
                }
        }
 
index a52cba43208b6418da7c247724fe6071d72fe925..56d9719f4fb3651bc3175c7e71839f2bac112cc7 100644 (file)
@@ -5372,7 +5372,9 @@ typebuilder_setup_fields (MonoClass *klass)
        MonoReflectionTypeBuilder *tb = klass->reflection_info;
        MonoReflectionFieldBuilder *fb;
        MonoClassField *field;
+       const char *p, *p2;
        int i;
+       guint32 len, idx;
 
        klass->field.count = tb->fields? mono_array_length (tb->fields): 0;
        klass->field.first = 0;
@@ -5401,6 +5403,19 @@ typebuilder_setup_fields (MonoClass *klass)
                field->parent = klass;
                fb->handle = field;
                mono_save_custom_attrs (klass->image, field, fb->cattrs);
+
+               if (fb->def_value) {
+                       field->type->attrs |= FIELD_ATTRIBUTE_HAS_DEFAULT;
+                       MonoDynamicAssembly *assembly = klass->image->assembly->dynamic;
+                       field->def_value = g_new0 (MonoConstant, 1);
+                       idx = encode_constant (assembly, fb->def_value, &field->def_value->type);
+                       /* Copy the data from the blob since it might get realloc-ed */
+                       p = assembly->blob.data + idx;
+                       len = mono_metadata_decode_blob_size (p, &p2);
+                       len += p2 - p;
+                       field->def_value->value = g_malloc (len);
+                       memcpy (field->def_value->value, p, len);
+               }
        }
        mono_class_layout_fields (klass);
 }