* class-internals.h (_MonoGenericParam.method): Move ...
authorRaja R Harinath <harinath@hurrynot.org>
Fri, 12 Jan 2007 13:11:28 +0000 (13:11 -0000)
committerRaja R Harinath <harinath@hurrynot.org>
Fri, 12 Jan 2007 13:11:28 +0000 (13:11 -0000)
(_MonoGenericContainer): ... here.  Add into union with klass field.
* class.c, icall.c, loader.c, metadata.c, reflection.c: Update to changes.

svn path=/trunk/mono/; revision=70918

mono/metadata/ChangeLog
mono/metadata/class-internals.h
mono/metadata/class.c
mono/metadata/icall.c
mono/metadata/loader.c
mono/metadata/metadata.c
mono/metadata/reflection.c

index 5391bb8e8cc568fe52669b0395a2752f9fe0ab23..510ed269a4547e3764775550fbf40e04bf82c70f 100644 (file)
@@ -1,3 +1,9 @@
+2007-01-12  Raja R Harinath  <rharinath@novell.com>
+
+       * class-internals.h (_MonoGenericParam.method): Move ...
+       (_MonoGenericContainer): ... here.  Add into union with klass field.
+       * class.c, icall.c, loader.c, metadata.c, reflection.c:
+       Update to changes.
 
 Fri Jan 12 11:58:52 CET 2007 Paolo Molaro <lupus@ximian.com>
 
index 84ee96b1a20a1e1e29cc162cd2e4af03b730f6f5..49b932e0bbd3f9662733c6ecf15df0700c0074d8 100644 (file)
@@ -422,8 +422,11 @@ struct _MonoGenericContainer {
        MonoGenericContainer *parent;
        /* If we're a generic method definition, caches all their instantiations. */
        GHashTable *method_hash;
-       /* If we're a generic type definition, its `MonoClass'. */
-       MonoClass *klass;
+       /* the generic type definition or the generic method definition corresponding to this container */
+       union {
+               MonoClass *klass;
+               MonoMethod *method;
+       } owner;
        int type_argc    : 6;
        /* If true, we're a generic method, otherwise a generic type definition. */
        /* Invariant: parent != NULL => is_method */
@@ -438,7 +441,6 @@ struct _MonoGenericContainer {
 struct _MonoGenericParam {
        MonoGenericContainer *owner;    /* Type or method this parameter was defined in. */
        MonoClass *pklass;              /* The corresponding `MonoClass'. */
-       MonoMethod *method;             /* If we're a method type parameter, the method. */
        const char *name;
        guint16 flags;
        guint16 num;
index 5af91ae73f815272150485bfd94acc8852d506f4..c1940884df9588ab6ea88a5b995fafd8c57a9a54 100644 (file)
@@ -2865,6 +2865,8 @@ mono_get_shared_generic_class (MonoGenericContainer *container, gboolean is_dyna
 {
        MonoGenericClass *gclass;
 
+       g_assert (!container->is_method);
+
        if (is_dynamic) {
                MonoDynamicGenericClass *dgclass = g_new0 (MonoDynamicGenericClass, 1);
                gclass = &dgclass->generic_class;
@@ -2874,7 +2876,7 @@ mono_get_shared_generic_class (MonoGenericContainer *container, gboolean is_dyna
        }
 
        gclass->cached_context = &container->context;
-       gclass->container_class = container->klass;
+       gclass->container_class = container->owner.klass;
        gclass->inst = mono_get_shared_generic_inst (container);
 
        if (!is_dynamic) {
@@ -2886,7 +2888,7 @@ mono_get_shared_generic_class (MonoGenericContainer *container, gboolean is_dyna
                }
        }
 
-       gclass->cached_class = container->klass;
+       gclass->cached_class = container->owner.klass;
 
        return gclass;
 }
@@ -2944,7 +2946,7 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token)
         */
        class->generic_container = mono_metadata_load_generic_params (image, class->type_token, NULL);
        if (class->generic_container) {
-               class->generic_container->klass = class;
+               class->generic_container->owner.klass = class;
                context = &class->generic_container->context;
 
                context->class_inst = mono_get_shared_generic_inst (class->generic_container);
@@ -3189,14 +3191,20 @@ mono_class_from_generic_parameter (MonoGenericParam *param, MonoImage *image, gb
 
        klass->name_space = "";
 
-       if (image)
-               klass->image = image;
-       else if (is_mvar && param->method && param->method->klass)
-               klass->image = param->method->klass->image;
-       else if (param->owner && param->owner->klass)
-               klass->image = param->owner->klass->image;
-       else
-               klass->image = mono_defaults.corlib;
+       if (!image && param->owner) {
+               if (is_mvar) {
+                       MonoMethod *method = param->owner->owner.method;
+                       image = method->klass ? method->klass->image : NULL;
+               } else {
+                       MonoClass *klass = param->owner->owner.klass;
+                       image = klass->image;
+               }
+       }
+
+       if (!image)
+               image = mono_defaults.corlib;
+
+       klass->image = image;
 
        klass->inited = TRUE;
        klass->cast_class = klass->element_class = klass;
index ba751ebe2e48260fabec7d50ecc038e02e98a918..fe5e5a769434b00bc5bd55b1fd14672f97b70909 100644 (file)
@@ -1867,9 +1867,9 @@ ves_icall_MonoType_get_DeclaringType (MonoReflectionType *type)
        if (type->type->byref)
                return NULL;
        if (type->type->type == MONO_TYPE_VAR)
-               class = type->type->data.generic_param->owner->klass;
+               class = type->type->data.generic_param->owner->owner.klass;
        else if (type->type->type == MONO_TYPE_MVAR)
-               class = type->type->data.generic_param->method->klass;
+               class = type->type->data.generic_param->owner->owner.method->klass;
        else
                class = mono_class_from_mono_type (type->type)->nested_in;
 
@@ -2488,7 +2488,7 @@ ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
        if (type->type->byref || type->type->type != MONO_TYPE_MVAR)
                return NULL;
 
-       method = type->type->data.generic_param->method;
+       method = type->type->data.generic_param->owner->owner.method;
        g_assert (method);
        klass = mono_class_from_mono_type (type->type);
        return mono_method_get_object (mono_object_domain (type), method, klass);
index f77757ee25bd421321149c87bc724a94f21d695e..3932f24e73fadb4e0fab294cf7a90257df36c3ef 100644 (file)
@@ -1341,18 +1341,18 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass,
        container = klass->generic_container;
        generic_container = mono_metadata_load_generic_params (image, token, container);
        if (generic_container) {
-               MonoGenericContext *context = &generic_container->context;
+               MonoGenericContext *context;
+
+               generic_container->owner.method = result;
+               context = &generic_container->context;
                if (container)
                        context->class_inst = container->context.class_inst;
                context->gmethod = mono_get_shared_generic_method (generic_container);
-               mono_metadata_load_generic_param_constraints (image, token, generic_container);
 
-               for (i = 0; i < generic_container->type_argc; i++) {
-                       generic_container->type_params [i].method = result;
+               mono_metadata_load_generic_param_constraints (image, token, generic_container);
 
-                       mono_class_from_generic_parameter (
-                               &generic_container->type_params [i], image, TRUE);
-               }
+               for (i = 0; i < generic_container->type_argc; i++)
+                       mono_class_from_generic_parameter (&generic_container->type_params [i], image, TRUE);
 
                container = generic_container;
        }
index 17b6ab266872b017c45ef097ab25b88235a7844b..669a4147b62f603bb5ae0bcb60ec7ebcf766966c 100644 (file)
@@ -4442,9 +4442,6 @@ get_constraints (MonoImage *image, int owner, MonoClass ***constraints, MonoGene
        GList *cons = NULL, *tmp;
        MonoGenericContext *context = &container->context;
 
-       /* FIXME: !container->klass => this is probably monodis */
-       g_assert (!container->klass || context->class_inst || context->gmethod);
-
        *constraints = NULL;
        found = 0;
        for (i = 0; i < tdef->rows; ++i) {
@@ -4571,7 +4568,6 @@ mono_metadata_load_generic_params (MonoImage *image, guint32 token, MonoGenericC
                params = g_realloc (params, sizeof (MonoGenericParam) * n);
                params [n - 1].owner = container;
                params [n - 1].pklass = NULL;
-               params [n - 1].method = NULL;
                params [n - 1].flags = cols [MONO_GENERICPARAM_FLAGS];
                params [n - 1].num = cols [MONO_GENERICPARAM_NUMBER];
                params [n - 1].name = mono_metadata_string_heap (image, cols [MONO_GENERICPARAM_NAME]);
@@ -4588,6 +4584,8 @@ mono_metadata_load_generic_params (MonoImage *image, guint32 token, MonoGenericC
        if (mono_metadata_token_table (token) == MONO_TABLE_METHOD)
                container->is_method = 1;
 
+       g_assert (container->parent == NULL || container->is_method);
+
        return container;
 }
 
index 2e21b7362b62da6716df630b1f164f719ede445c..d1fd60feeb6a16ba101e33b4c05598af62e951db 100644 (file)
@@ -8182,7 +8182,7 @@ mono_reflection_setup_generic_class (MonoReflectionTypeBuilder *tb)
                return;
 
        tb->generic_container = g_new0 (MonoGenericContainer, 1);
-       tb->generic_container->klass = klass;
+       tb->generic_container->owner.klass = klass;
 }
 
 /*
@@ -8206,7 +8206,7 @@ mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
        if (klass->generic_container || (count == 0))
                return;
 
-       g_assert (tb->generic_container && (tb->generic_container->klass == klass));
+       g_assert (tb->generic_container && (tb->generic_container->owner.klass == klass));
 
        klass->generic_container = tb->generic_container;
 
@@ -8489,13 +8489,13 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass,
                m->generic_container = container = rmb->generic_container;
                container->type_argc = count;
                container->type_params = g_new0 (MonoGenericParam, count);
+               container->owner.method = m;
 
                for (i = 0; i < count; i++) {
                        MonoReflectionGenericParam *gp =
                                mono_array_get (rmb->generic_params, MonoReflectionGenericParam*, i);
 
                        container->type_params [i] = *gp->type.type->data.generic_param;
-                       container->type_params [i].method = m;
                }
 
                if (klass->generic_container) {
@@ -9489,7 +9489,6 @@ mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam
                param->owner = gparam->tbuilder->generic_container;
        }
 
-       param->method = NULL;
        param->name = mono_string_to_utf8 (gparam->name);
        param->num = gparam->index;