2003-05-14 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / metadata / reflection.c
index cdd03ac972d93153b502232aba715be77b197843..56d9719f4fb3651bc3175c7e71839f2bac112cc7 100644 (file)
@@ -747,6 +747,15 @@ mono_save_custom_attrs (MonoImage *image, void *obj, MonoArray *cattrs)
        g_hash_table_insert (dynamic_custom_attrs, obj, ainfo);
 }
 
+void
+mono_custom_attrs_free (MonoCustomAttrInfo *ainfo)
+{
+       /* they are cached, so we don't free them */
+       if (dynamic_custom_attrs && g_hash_table_lookup (dynamic_custom_attrs, ainfo))
+               return;
+       g_free (ainfo);
+}
+
 /*
  * idx is the table index of the object
  * type is one of CUSTOM_ATTR_*
@@ -903,7 +912,8 @@ mono_image_get_method_info (MonoReflectionMethodBuilder *mb, MonoDynamicAssembly
                table->rows ++;
                alloc_table (table, table->rows);
                values = table->values + table->rows * MONO_IMPLMAP_SIZE;
-               values [MONO_IMPLMAP_FLAGS] = (mb->native_cc << 8) | mb->charset;
+               /* map CharSet values to on-disk values */
+               values [MONO_IMPLMAP_FLAGS] = (mb->native_cc << 8) | (mb->charset ? (mb->charset - 1) * 2: 1);
                values [MONO_IMPLMAP_MEMBER] = (mb->table_idx << 1) | 1; /* memberforwarded: method */
                name = mono_string_to_utf8 (mb->dllentry);
                values [MONO_IMPLMAP_NAME] = string_heap_insert (&assembly->sheap, name);
@@ -4900,6 +4910,7 @@ mono_reflection_get_custom_attrs_blob (MonoObject *ctor, MonoArray *ctorArgs, Mo
        } else {
                sig = ((MonoReflectionMethod*)ctor)->method->signature;
        }
+       g_assert (mono_array_length (ctorArgs) == sig->param_count);
        buflen = 256;
        p = buffer = g_malloc (buflen);
        /* write the prolog */
@@ -5361,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;
@@ -5390,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);
 }
@@ -5634,3 +5660,4 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token)
 
 
 
+