+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>
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));
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)
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 {
{
MonoVTable *vt;
MonoClassField *field;
- guint32 cindex;
- guint32 cols [MONO_CONSTANT_SIZE];
const char *p;
char *t;
int i, len;
}
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:
/* 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);
}
}
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;
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);
}