string_heap_insert (sh, "");
}
-#if 0 /* never used */
static void
string_heap_free (MonoDynamicStream *sh)
{
g_hash_table_foreach (sh->hash, (GHFunc)g_free, NULL);
g_hash_table_destroy (sh->hash);
}
-#endif
static guint32
mono_image_add_stream_data (MonoDynamicStream *stream, const char *data, guint32 len)
const GenericParamTableEntry **a_entry = (const GenericParamTableEntry **) a;
const GenericParamTableEntry **b_entry = (const GenericParamTableEntry **) b;
- return (*b_entry)->owner - (*a_entry)->owner;
+ if ((*b_entry)->owner == (*a_entry)->owner)
+ return
+ (*a_entry)->gparam->type.type->data.generic_param->num -
+ (*b_entry)->gparam->type.type->data.generic_param->num;
+ else
+ return (*b_entry)->owner - (*a_entry)->owner;
}
static int
#endif
assembly->assembly.dynamic = TRUE;
+ assembly->assembly.corlib_internal = assemblyb->corlib_internal;
assemblyb->assembly.assembly = (MonoAssembly*)assembly;
assembly->assembly.basedir = mono_string_to_utf8 (assemblyb->dir);
if (assemblyb->culture)
mono_dynamic_stream_reset (&assembly->us);
mono_dynamic_stream_reset (&assembly->blob);
mono_dynamic_stream_reset (&assembly->guid);
- mono_dynamic_stream_reset (&assembly->sheap);
+ string_heap_free (&assembly->sheap);
+
+ mono_g_hash_table_foreach (assembly->blob_cache, (GHFunc)g_free, NULL);
+ mono_g_hash_table_destroy (assembly->blob_cache);
}
MonoReflectionModule *
mono_defaults.corlib, "System.Reflection", "Assembly");
res = (MonoReflectionAssembly *)mono_object_new (domain, System_Reflection_Assembly);
res->assembly = assembly;
+
CACHE_OBJECT (assembly, res, NULL);
return res;
}
break;
}
/* it may be a boxed value or a Type */
- case MONO_TYPE_OBJECT: {
- MonoClass *klass = mono_object_class (arg);
+ case MONO_TYPE_OBJECT: {\r
+ MonoClass *klass;
char *str;
guint32 slen;
+\r
+ if (arg == NULL) {\r
+ *p++ = MONO_TYPE_STRING; // It's same hack as MS uses\r
+ *p++ = 0xFF;\r
+ break;\r
+ }\r
+ klass = mono_object_class (arg);
+
if (mono_object_isinst (arg, mono_defaults.monotype_class)) {
*p++ = 0x50;
goto handle_type;
tb->generic_container = g_new0 (MonoGenericContainer, 1);
tb->generic_container->klass = klass;
- tb->generic_container->context = g_new0 (MonoGenericContext, 1);
- tb->generic_container->context->container = tb->generic_container;
+ tb->generic_container->context.container = tb->generic_container;
}
/*
MonoGenericClass *ogclass = gclass;
ogclass->context = g_new0 (MonoGenericContext, 1);
+ ogclass->context->container = ogclass->container;
ogclass->context->gclass = ogclass;
gclass = g_new0 (MonoGenericClass, 1);
geninst = g_new0 (MonoType, 1);
geninst->type = MONO_TYPE_GENERICINST;
- cached = g_hash_table_lookup (klass->image->generic_class_cache, gclass);
+ cached = mono_metadata_lookup_generic_class (gclass);
if (cached) {
g_free (gclass);
mono_loader_unlock ();
gclass->parent = parent;
gclass->context = g_new0 (MonoGenericContext, 1);
+ gclass->context->container = gclass->container;
gclass->context->gclass = gclass;
if (!strcmp (((MonoObject *) type)->vtable->klass->name, "TypeBuilder")) {
mono_class_create_generic (gclass);
mono_class_create_generic_2 (gclass);
- g_hash_table_insert (klass->image->generic_class_cache, gclass, gclass);
-
mono_loader_unlock ();
return geninst;
ginst = mono_metadata_lookup_generic_inst (ginst);
gmethod = g_new0 (MonoGenericMethod, 1);
+ gmethod->container = container;
gmethod->inst = ginst;
inflated = g_hash_table_lookup (container->method_hash, gmethod);
gmethod->reflection_info = rmethod;
context = g_new0 (MonoGenericContext, 1);
+ context->container = container;
context->gclass = method->klass->generic_class;
context->gmethod = gmethod;
}
context = g_new0 (MonoGenericContext, 1);
+ context->container = gclass->container;
context->gclass = gclass;
context->gmethod = gmethod;