2004-12-29 Martin Baulig <martin@ximian.com>
[mono.git] / mono / metadata / metadata.c
index aa812daeac83f3424bbc422a91a55232fc4d0de8..523bec047179b46f0e840cb2847a3fc09e0a45e5 100644 (file)
@@ -27,7 +27,8 @@ static void do_mono_metadata_parse_type (MonoType *type, MonoImage *m, MonoGener
                                         const char *ptr, const char **rptr);
 
 static gboolean do_mono_metadata_type_equal (MonoType *t1, MonoType *t2, gboolean signature_only);
-static gboolean _mono_metadata_generic_class_equal (MonoGenericClass *g1, MonoGenericClass *g2,
+static gboolean mono_metadata_class_equal (MonoClass *c1, MonoClass *c2, gboolean signature_only);
+static gboolean _mono_metadata_generic_class_equal (const MonoGenericClass *g1, const MonoGenericClass *g2,
                                                    gboolean signature_only);
 
 /*
@@ -1116,7 +1117,7 @@ mono_metadata_free_array (MonoArrayType *array)
  * private static
  * private static literal
  */
-static MonoType
+static const MonoType
 builtin_types[] = {
        /* data, attrs, type,              nmods, byref, pinned */
        {{NULL}, 0,     MONO_TYPE_VOID,    0,     0,     0},
@@ -1238,7 +1239,7 @@ mono_metadata_init (void)
        generic_class_cache = g_hash_table_new (mono_generic_class_hash, mono_generic_class_equal);
 
        for (i = 0; i < NBUILTIN_TYPES (); ++i)
-               g_hash_table_insert (type_cache, &builtin_types [i], &builtin_types [i]);
+               g_hash_table_insert (type_cache, (gpointer) &builtin_types [i], (gpointer) &builtin_types [i]);
 }
 
 /**
@@ -1667,6 +1668,7 @@ do_mono_metadata_parse_generic_class (MonoType *type, MonoImage *m, MonoGenericC
                                      const char *ptr, const char **rptr)
 {
        MonoGenericClass *gclass = g_new0 (MonoGenericClass, 1);
+       MonoGenericContainer *container;
        MonoGenericClass *cached;
        MonoGenericInst *ginst;
        MonoClass *gklass;
@@ -1684,7 +1686,6 @@ do_mono_metadata_parse_generic_class (MonoType *type, MonoImage *m, MonoGenericC
        gclass->container_class = gklass = mono_class_from_mono_type (gtype);
 
        g_assert ((gclass->context->container = gklass->generic_container) != NULL);
-
        count = mono_metadata_decode_value (ptr, &ptr);
 
        /*
@@ -1755,7 +1756,12 @@ mono_metadata_parse_generic_param (MonoImage *m, MonoGenericContext *generic_con
                *rptr = ptr;
 
        g_assert (generic_context);
-       generic_container = generic_context->container;
+       if (generic_context->gmethod)
+               generic_container = generic_context->gmethod->container;
+       else if (generic_context->gclass)
+               generic_container = generic_context->gclass->container_class->generic_container;
+       else
+               generic_container = generic_context->container;
 
        if (!is_mvar) {
                g_assert (generic_container);
@@ -2826,13 +2832,13 @@ mono_metadata_generic_class_is_valuetype (MonoGenericClass *gclass)
 }
 
 static gboolean
-_mono_metadata_generic_class_equal (MonoGenericClass *g1, MonoGenericClass *g2, gboolean signature_only)
+_mono_metadata_generic_class_equal (const MonoGenericClass *g1, const MonoGenericClass *g2, gboolean signature_only)
 {
        int i;
 
-       if (g1->inst->type_argc != g2->inst->type_argc)
+       if ((g1->inst->type_argc != g2->inst->type_argc) || (g1->is_dynamic != g2->is_dynamic))
                return FALSE;
-       if (!do_mono_metadata_type_equal (&g1->container_class->byval_arg, &g2->container_class->byval_arg, signature_only))
+       if (!mono_metadata_class_equal (g1->container_class, g2->container_class, signature_only))
                return FALSE;
        for (i = 0; i < g1->inst->type_argc; ++i) {
                if (!do_mono_metadata_type_equal (g1->inst->type_argv [i], g2->inst->type_argv [i], signature_only))
@@ -3786,6 +3792,7 @@ mono_metadata_load_generic_params (MonoImage *image, guint32 token, MonoGenericC
        guint32 cols [MONO_GENERICPARAM_SIZE];
        guint32 i, owner = 0, last_num, n;
        MonoGenericContainer *container;
+       MonoGenericClass *gclass;
        MonoGenericParam *params;
 
        if (mono_metadata_token_table (token) == MONO_TABLE_TYPEDEF)