+2007-01-04 Raja R Harinath <rharinath@novell.com>
+
+ * get.c (get_method_core): Pick generic container from the
+ declaring method.
+
2006-12-27 Raja R Harinath <rharinath@novell.com>
Avoid MonoGenericContext
if (mh) {
mh = mono_get_inflated_method (mh);
if (mono_method_signature (mh)->is_inflated)
- container = ((MonoMethodInflated *) mh)->context->container;
+ container = ((MonoMethodInflated *) mh)->declaring->generic_container;
esname = get_escaped_name (mh->name);
sig = dis_stringify_type (m, &mh->klass->byval_arg, TRUE);
if (show_tokens)
+2007-01-04 Raja R Harinath <rharinath@novell.com>
+
+ Remove redundant field
+ * class-internals.h (_MonoGenericContext.container): Remove field.
+ * loader.c (mono_method_get_signature_full): Don't parse a
+ "container" for a signature parse when the signature is inflated
+ immediately.
+ (method_from_methodspec): Likewise, for a generic_inst.
+ * class.c, metadata.c, reflection.c: Update to changes.
+
2006-01-04 Raja R Harinath <rharinath@novell.com>
* class-internals.h (_MonoGenericClass): Rename 'context' field to
};
/*
- * The generic context.
+ * The generic context: an instantiation of a set of class and method generic parameters.
*/
struct _MonoGenericContext {
- /*
- * The container which has been instantiated.
- *
- * If we're in a generic method, the generic method definition's container.
- * Otherwise the generic type's container.
- */
- MonoGenericContainer *container;
/* The current generic class */
MonoGenericClass *gclass;
/* The current generic method */
{
MonoGenericContext *context = gclass->cached_context;
if (context) {
- g_assert (context->container == gclass->container_class->generic_container);
g_assert (context->gclass == gclass);
g_assert (!context->gmethod);
return context;
}
context = g_new0 (MonoGenericContext, 1);
- context->container = gclass->container_class->generic_container;
context->gclass = gclass;
if (InterlockedCompareExchangePointer ((gpointer *)&gclass->cached_context, context, NULL))
} else {
gmethod = g_new0 (MonoGenericMethod, 1);
gmethod->generic_class = gclass;
- gmethod->container = context->container;
+ gmethod->container = context->gmethod->container;
gmethod->inst = ninst;
}
}
return mono_generic_class_get_context (gclass);
res = g_new0 (MonoGenericContext, 1);
- res->container = gmethod->container;
res->gclass = gclass;
res->gmethod = gmethod;
gmethod->generic_class = result->klass->generic_class;
context = g_new0 (MonoGenericContext, 1);
- context->container = method->generic_container;
context->gclass = result->klass->generic_class;
context->gmethod = gmethod;
int i;
context = g_new0 (MonoGenericContext, 1);
- context->container = iface->generic_class->container_class->generic_container;
context->gmethod = g_new0 (MonoGenericMethod, 1);
context->gmethod->generic_class = iface->generic_class;
context->gmethod->inst = iface->generic_class->inst;
class->generic_container->klass = class;
context = &class->generic_container->context;
- context->gclass = mono_get_shared_generic_class (context->container, FALSE);
+ context->gclass = mono_get_shared_generic_class (class->generic_container, FALSE);
}
if (cols [MONO_TYPEDEF_EXTENDS]) {
ptr = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]);
mono_metadata_decode_blob_size (ptr, &ptr);
- sig = mono_metadata_parse_method_signature_full (
- image, context ? context->container : NULL, 0, ptr, NULL);
+ sig = mono_metadata_parse_method_signature (image, 0, ptr, NULL);
mono_loader_lock ();
prev_sig = g_hash_table_lookup (image->memberref_signatures, GUINT_TO_POINTER (token));
gmethod->container = container;
new_context = g_new0 (MonoGenericContext, 1);
- new_context->container = container;
new_context->gmethod = gmethod;
if (container->parent)
new_context->gclass = container->parent->context.gclass;
* ie. instantiate the method as `Foo.Hello<float>.
*/
- gmethod->inst = mono_metadata_parse_generic_inst (image, context ? context->container : NULL, param_count, ptr, &ptr);
+ gmethod->inst = mono_metadata_parse_generic_inst (image, NULL, param_count, ptr, &ptr);
if (context && gmethod->inst->is_open)
gmethod->inst = mono_metadata_inflate_generic_inst (gmethod->inst, context);
if (mono_metadata_token_table (token) == MONO_TABLE_METHOD)
container->is_method = 1;
- container->context.container = container;
-
return container;
}
tb->generic_container = g_new0 (MonoGenericContainer, 1);
tb->generic_container->klass = klass;
-
- tb->generic_container->context.container = tb->generic_container;
}
/*
}
context = &container->context;
- context->container = container;
if (klass->generic_container) {
container->parent = klass->generic_container;
context->gclass = klass->generic_container->context.gclass;
gmethod->reflection_info = rmethod;
context = g_new0 (MonoGenericContext, 1);
- context->container = container;
context->gclass = method->klass->generic_class;
context->gmethod = gmethod;
n = mono_method_signature (method)->generic_param_count;
context = mono_generic_class_get_context ((MonoGenericClass *) gclass);
- g_assert (context && context->container);
if (n) {
gmethod = g_new0 (MonoGenericMethod, 1);
gmethod->generic_class = &gclass->generic_class;
gmethod->inst->type_argv [i] = &gparam->pklass->byval_arg;
}
- g_assert (gmethod->container->parent == context->container);
+ g_assert (gmethod->container->parent == ((MonoGenericClass *)gclass)->container_class->generic_container);
context = g_new0 (MonoGenericContext, 1);
- context->container = gmethod->container;
context->gclass = &gclass->generic_class;
context->gmethod = gmethod;
}