2003-10-16 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Thu, 16 Oct 2003 18:51:26 +0000 (18:51 -0000)
committerMartin Baulig <martin@novell.com>
Thu, 16 Oct 2003 18:51:26 +0000 (18:51 -0000)
* metadata.h (MonoMethodSignature): Moved `MonoGenericParam
*gen_params' here from MonoMethodHeader.

* metadata.c (mono_metadata_parse_method_signature): If we have
generic parameters, initialize `method->gen_params' and then set
the correct `type->data.generic_param' in all the parameters.

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

mono/metadata/ChangeLog
mono/metadata/class.c
mono/metadata/icall.c
mono/metadata/loader.c
mono/metadata/metadata.c
mono/metadata/metadata.h

index 12d5b3e1e8577168475755bb81cd969448c22ed9..16e67bf8aa7752402f977d2919180e663cf32daf 100644 (file)
@@ -1,3 +1,12 @@
+2003-10-16  Martin Baulig  <martin@ximian.com>
+
+       * metadata.h (MonoMethodSignature): Moved `MonoGenericParam
+       *gen_params' here from MonoMethodHeader.
+
+       * metadata.c (mono_metadata_parse_method_signature): If we have
+       generic parameters, initialize `method->gen_params' and then set
+       the correct `type->data.generic_param' in all the parameters.
+
 2003-10-16  Zoltan Varga  <vargaz@freemail.hu>
 
        * threads.c (mono_threads_get_default_stacksize): New function to 
@@ -12,8 +21,8 @@
 
 2003-10-16  Martin Baulig  <martin@ximian.com>
 
-       * class.c (inflate_generic_signature): Copy `generic_param_count'.
-       (inflate_generic_header): Copy `gen_params'.
+       * class.c (inflate_generic_signature): Copy `generic_param_count'
+       and `gen_params'.
 
        * icall.c (ves_icall_MethodInfo_get_IsGenericMethodDefinition):
        New interncall.
index 50baeeeba02baba9e79f7e260280c218259ad60b..541f3af836eebc9a9deeb0b2b2e0b78438553c3d 100644 (file)
@@ -226,6 +226,7 @@ inflate_generic_signature (MonoImage *image, MonoMethodSignature *sig, MonoGener
        res->explicit_this = sig->explicit_this;
        res->call_convention = sig->call_convention;
        res->generic_param_count = sig->generic_param_count;
+       res->gen_params = sig->gen_params;
        return res;
 }
 
@@ -242,7 +243,6 @@ inflate_generic_header (MonoMethodHeader *header, MonoGenericInst *tgen, MonoGen
        res->init_locals = header->init_locals;
        res->num_locals = header->num_locals;
        res->clauses = header->clauses;
-       res->gen_params = header->gen_params;
        for (i = 0; i < header->num_locals; ++i) {
                res->locals [i] = inflate_generic_type (header->locals [i], tgen, mgen);
        }
index 0cbd61dff9f82ab18d0324cff7f3617201956fe7..02d53e7021c6b429257ce30cc70c7facd6691b5b 100644 (file)
@@ -1584,16 +1584,13 @@ ves_icall_MonoType_get_DeclaringMethod (MonoReflectionType *type)
 static gboolean
 ves_icall_MethodInfo_get_IsGenericMethodDefinition (MonoReflectionMethod *method)
 {
-       MonoMethodNormal *mn;
-
        MONO_ARCH_SAVE_REGS;
 
        if ((method->method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
            (method->method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL))
                return FALSE;
 
-       mn = (MonoMethodNormal *) method->method;
-       return mn->header->gen_params != NULL;
+       return method->method->signature->gen_params != NULL;
 }
 
 static MonoObject *
index dd3ebde4d5578d65ba12bb5dcfe7638a9ea378fe..00ddf55e4f7b0b74d05e18e6030214f1f1c1c692 100644 (file)
@@ -716,8 +716,6 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass)
 
                        g_assert (loc);
                        mn->header = mono_metadata_parse_mh (image, loc);
-                       if (result->signature->generic_param_count)
-                               mn->header->gen_params = mono_metadata_load_generic_params (image, token, NULL, result);
                }
        }
 
index 628fa4d7a98d718e86a07b6f74c6b851c1f197e4..447794d75466d550ff79c3d9e511e39833ec1ba6 100644 (file)
@@ -1386,6 +1386,27 @@ mono_metadata_parse_method_signature (MonoImage *m, int def, const char *ptr, co
        }
        g_free (pattrs);
 
+       if (method->generic_param_count) {
+               guint32 token;
+
+               g_assert (def);
+               token = mono_metadata_make_token (MONO_TABLE_METHOD, def);
+               method->gen_params = mono_metadata_load_generic_params (m, token, NULL, method);
+
+               for (i = 0; i < method->param_count; i++) {
+                       MonoGenericParam *param;
+                       guint32 index;
+
+                       if (method->params [i]->type != MONO_TYPE_MVAR)
+                               continue;
+
+                       index = method->params [i]->data.generic_param->num;
+                       method->params [i]->data.generic_param = param = &method->gen_params [index];
+
+                       mono_class_from_generic_parameter (param, m, TRUE);
+               }
+       }
+
        if (rptr)
                *rptr = ptr;
        /*
index 5d55aaf1af7d87d76c13a38d49918dd2ae5b28aa..3316f0de1c00c9f2e768591e6fdf142879e4299a 100644 (file)
@@ -310,6 +310,7 @@ struct _MonoMethodSignature {
        guint16       param_count;
        guint16       sentinelpos;
        guint16       generic_param_count;
+       MonoGenericParam *gen_params;
        MonoType     *ret;
        MonoType     *params [MONO_ZERO_LEN_ARRAY];
 };
@@ -323,7 +324,6 @@ typedef struct {
        unsigned int init_locals : 1;
        guint16      num_locals;
        MonoExceptionClause *clauses;
-       MonoGenericParam *gen_params;
        MonoType    *locals [MONO_ZERO_LEN_ARRAY];
 } MonoMethodHeader;