- if ((vt = g_hash_table_lookup (domain->class_vtable_hash, class)))
- return vt;
-
- if (!class->inited)
- mono_class_init (class);
-
- vt = g_malloc0 (sizeof (MonoVTable) + class->vtable_size * sizeof (gpointer));
- vt->klass = class;
- vt->domain = domain;
-
- if (class->class_size) {
- vt->data = g_malloc0 (class->class_size + 8);
- /* align: fixme not 64 bit clean */
- if (((guint32)vt->data) & 0x7)
- vt->data += 8 - (((guint32)vt->data) & 0x7);
- }
-
- for (i = class->field.first; i < class->field.last; ++i) {
- field = &class->fields [i - class->field.first];
- if (!(field->type->attrs & FIELD_ATTRIBUTE_STATIC))
- continue;
- 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]);
- 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]) {
- case MONO_TYPE_BOOLEAN:
- case MONO_TYPE_U1:
- case MONO_TYPE_I1:
- *t = *p;
- break;
- case MONO_TYPE_CHAR:
- case MONO_TYPE_U2:
- case MONO_TYPE_I2: {
- guint16 *val = (guint16*)t;
- *val = read16 (p);
- break;
- }
- case MONO_TYPE_U4:
- case MONO_TYPE_I4: {
- guint32 *val = (guint32*)t;
- *val = read32 (p);
- break;
- }
- case MONO_TYPE_U8:
- case MONO_TYPE_I8: {
- guint64 *val = (guint64*)t;
- *val = read64 (p);
- break;
- }
- case MONO_TYPE_R4: {
- float *val = (float*)t;
- readr4 (p, val);
- break;
- }
- case MONO_TYPE_R8: {
- double *val = (double*)t;
- readr8 (p, val);
- break;
- }
- case MONO_TYPE_STRING: {
- g_warning ("we don't handle strings in constant table");
- break;
- }
- case MONO_TYPE_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]);