char *b = blob_size;
p = buf = g_malloc (size);
+ *p = 0;
if (!(mb->attrs & METHOD_ATTRIBUTE_STATIC))
*p |= 0x20; /* hasthis */
/*
{
MonoDynamicTable *table;
guint32 *values;
- char *name, *p;
+ char *p;
guint32 idx, sig_idx;
guint nl = mono_array_length (ilgen->locals);
char *buf;
static guint32
property_encode_signature (MonoDynamicAssembly *assembly, MonoReflectionPropertyBuilder *fb)
{
- /*
- * FIXME: fill me in
- */
- return 0;
+ char *buf, *p;
+ char blob_size [6];
+ char *b = blob_size;
+ guint32 nparams = 0;
+ MonoReflectionMethodBuilder *mb = fb->get_method;
+ guint32 idx, i;
+
+ if (mb && mb->parameters)
+ nparams = mono_array_length (mb->parameters);
+ buf = p = g_malloc (24 + nparams * 10);
+ *p = 0x08;
+ p++;
+ mono_metadata_encode_value (nparams, p, &p);
+ if (mb) {
+ encode_type (mb->rtype->type, p, &p);
+ for (i = 0; i < nparams; ++i) {
+ MonoReflectionType *pt = mono_array_get (mb->parameters, MonoReflectionType*, i);
+ encode_type (pt->type, p, &p);
+ }
+ } else {
+ *p++ = 1; /* void: a property should probably not be allowed without a getter */
+ }
+ /* store length */
+ mono_metadata_encode_value (p-buf, b, &b);
+ idx = mono_image_add_stream_data (&assembly->blob, blob_size, b-blob_size);
+ mono_image_add_stream_data (&assembly->blob, buf, p-buf);
+ g_free (buf);
+ return idx;
}
static void
* we need to set things in the following tables:
* PROPERTYMAP (info already filled in _get_type_info ())
* PROPERTY (rows already preallocated in _get_type_info ())
- * METHOD
+ * METHOD (method info already done with the generic method code)
* METHODSEMANTICS
*/
table = &assembly->tables [MONO_TABLE_PROPERTY];
values [MONO_PROPERTY_FLAGS] = pb->attrs;
values [MONO_PROPERTY_TYPE] = property_encode_signature (assembly, pb);
- /* alloc room for the methods (we still don't handle 'other' methods) */
+ /* FIXME: we still don't handle 'other' methods */
if (pb->get_method) num_methods ++;
if (pb->set_method) num_methods ++;
- table = &assembly->tables [MONO_TABLE_METHOD];
- table->rows += num_methods;
- alloc_table (table, table->rows);
table = &assembly->tables [MONO_TABLE_METHODSEMANTICS];
table->rows += num_methods;
alloc_table (table, table->rows);
if (pb->get_method) {
- mono_image_get_method_info (pb->get_method, assembly);
semaidx = table->next_idx ++;
- values = table->values + semaidx * MONO_METHOD_SEMA_SIZE;
+ values = table->values + semaidx * MONO_METHOD_SEMA_SIZE;
values [MONO_METHOD_SEMA_SEMANTICS] = METHOD_SEMANTIC_GETTER;
values [MONO_METHOD_SEMA_METHOD] = pb->get_method->table_idx;
values [MONO_METHOD_SEMA_ASSOCIATION] = (pb->table_idx << 1) | 1;
}
if (pb->set_method) {
- mono_image_get_method_info (pb->set_method, assembly);
semaidx = table->next_idx ++;
- values = table->values + semaidx * MONO_METHOD_SEMA_SIZE;
+ values = table->values + semaidx * MONO_METHOD_SEMA_SIZE;
values [MONO_METHOD_SEMA_SEMANTICS] = METHOD_SEMANTIC_SETTER;
values [MONO_METHOD_SEMA_METHOD] = pb->set_method->table_idx;
values [MONO_METHOD_SEMA_ASSOCIATION] = (pb->table_idx << 1) | 0;
table = &assembly->tables [MONO_TABLE_PROPERTYMAP];
table->rows ++;
alloc_table (table, table->rows);
- values = table->values + (table->rows - 1) * MONO_PROPERTY_MAP_SIZE;
+ values = table->values + table->rows * MONO_PROPERTY_MAP_SIZE;
values [MONO_PROPERTY_MAP_PARENT] = tb->table_idx;
- values [MONO_PROPERTY_MAP_PROPERTY_LIST] = assembly->tables [MONO_TABLE_PROPERTY].next_idx ++;
+ values [MONO_PROPERTY_MAP_PROPERTY_LIST] = assembly->tables [MONO_TABLE_PROPERTY].next_idx;
for (i = 0; i < mono_array_length (tb->properties); ++i)
mono_image_get_property_info (
- mono_array_get (tb->fields, MonoReflectionPropertyBuilder*, i), assembly);
+ mono_array_get (tb->properties, MonoReflectionPropertyBuilder*, i), assembly);
}
}
mono_image_get_type_info (mono_array_get (mb->types, MonoReflectionTypeBuilder*, i), assembly);
}
+#define align_pointer(base,p)\
+ do {\
+ guint32 __diff = (unsigned char*)(p)-(unsigned char*)(base);\
+ if (__diff & 3)\
+ (p) += 4 - (__diff & 3);\
+ } while (0)
+
static void
build_compressed_metadata (MonoDynamicAssembly *assembly)
{
p += 4;
memcpy (p, version, *int32val);
p += *int32val;
- p += 3; p = (guint32)p & ~3; /* align */
+ align_pointer (meta->raw_metadata, p);
int16val = (guint16*)p;
*int16val++ = 0; /* flags must be 0 */
*int16val = 5; /* number of streams */
table_offset += *int32val;
p += 8;
strcpy (p, "#~");
- /*
- * FIXME: alignment not 64 bit safe: same problem in metadata/image.c
- */
- p += 3 + 3; p = (guint32)p & ~3;
+ p += 3;
+ align_pointer (meta->raw_metadata, p);
int32val = (guint32*)p;
*int32val++ = assembly->sheap.offset = table_offset;
table_offset += *int32val;
p += 8;
strcpy (p, "#Strings");
- p += 9 + 3; p = (guint32)p & ~3;
+ p += 9;
+ align_pointer (meta->raw_metadata, p);
int32val = (guint32*)p;
*int32val++ = assembly->us.offset = table_offset;
table_offset += *int32val;
p += 8;
strcpy (p, "#US");
- p += 4 + 3; p = (guint32)p & ~3;
+ p += 4;
+ align_pointer (meta->raw_metadata, p);
int32val = (guint32*)p;
*int32val++ = assembly->blob.offset = table_offset;
table_offset += *int32val;
p += 8;
strcpy (p, "#Blob");
- p += 6 + 3; p = (guint32)p & ~3;
+ p += 6;
+ align_pointer (meta->raw_metadata, p);
int32val = (guint32*)p;
*int32val++ = assembly->guid.offset = table_offset;
table_offset += *int32val;
p += 8;
strcpy (p, "#GUID");
- p += 6 + 3; p = (guint32)p & ~3;
+ p += 6;
+ align_pointer (meta->raw_metadata, p);
/*
* now copy the data, the table stream header and contents goes first.
static void
mono_image_build_metadata (MonoReflectionAssemblyBuilder *assemblyb)
{
- char *meta;
MonoDynamicTable *table;
MonoDynamicAssembly *assembly = assemblyb->dynamic_assembly;
- GList *type;
guint32 len;
guint32 *values;
char *name;