Fix typo.
[mono.git] / mono / metadata / reflection.c
index b4f7d67b4366c3040edd340858f9ae1220a01cc8..0fe23865ee7b9d581f1f6a0889bc8316dea5989a 100644 (file)
@@ -220,7 +220,6 @@ string_heap_init (MonoDynamicStream *sh)
        string_heap_insert (sh, "");
 }
 
-#if 0 /* never used */
 static void
 string_heap_free (MonoDynamicStream *sh)
 {
@@ -228,7 +227,6 @@ 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)
@@ -3232,7 +3230,12 @@ compare_genericparam (const void *a, const void *b)
        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
@@ -4274,6 +4277,7 @@ mono_image_basic_init (MonoReflectionAssemblyBuilder *assemblyb)
 #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)
@@ -4905,7 +4909,10 @@ mono_image_create_pefile (MonoReflectionModuleBuilder *mb, HANDLE file) {
        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 *
@@ -5066,6 +5073,7 @@ mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly)
                        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;
 }
@@ -7033,11 +7041,19 @@ handle_type:
                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;
@@ -7349,8 +7365,7 @@ mono_reflection_setup_generic_class (MonoReflectionTypeBuilder *tb)
        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;
 }
 
 /*
@@ -7837,6 +7852,7 @@ do_mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_a
                MonoGenericClass *ogclass = gclass;
 
                ogclass->context = g_new0 (MonoGenericContext, 1);
+               ogclass->context->container = ogclass->container;
                ogclass->context->gclass = ogclass;
 
                gclass = g_new0 (MonoGenericClass, 1);
@@ -7862,7 +7878,7 @@ do_mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_a
        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 ();
@@ -7878,6 +7894,7 @@ do_mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_a
        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")) {
@@ -7916,8 +7933,6 @@ do_mono_reflection_bind_generic_parameters (MonoReflectionType *type, int type_a
        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;
@@ -8026,6 +8041,7 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
        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);
@@ -8038,6 +8054,7 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
        gmethod->reflection_info = rmethod;
 
        context = g_new0 (MonoGenericContext, 1);
+       context->container = container;
        context->gclass = method->klass->generic_class;
        context->gmethod = gmethod;
 
@@ -8073,6 +8090,7 @@ inflate_mono_method (MonoReflectionGenericClass *type, MonoMethod *method, MonoO
        }
 
        context = g_new0 (MonoGenericContext, 1);
+       context->container = gclass->container;
        context->gclass = gclass;
        context->gmethod = gmethod;