+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
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.
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;
}
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);
}
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 *
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);
}
}
}
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;
/*
guint16 param_count;
guint16 sentinelpos;
guint16 generic_param_count;
+ MonoGenericParam *gen_params;
MonoType *ret;
MonoType *params [MONO_ZERO_LEN_ARRAY];
};
unsigned int init_locals : 1;
guint16 num_locals;
MonoExceptionClause *clauses;
- MonoGenericParam *gen_params;
MonoType *locals [MONO_ZERO_LEN_ARRAY];
} MonoMethodHeader;