+2007-01-05 Raja R Harinath <rharinath@novell.com>
+
+ Ongoing work to avoid redundant data and simplify invariants.
+ * class-internals.h (_MonoGenericMethod.class_inst): Rename from
+ 'generic_class', and change type to a GenericInst.
+ (_MonoGenericContext.class_inst): Likewise, rename from 'gclass'.
+ * class.c, loader.c, metadata.c, reflection.c: Update to changes.
+
2007-01-05 Atsushi Enomoto <atsushi@ximian.com>
* class.c : skip io-layer under PLATFORM_WIN32.
*/
struct _MonoGenericMethod {
MonoGenericInst *inst; /* the instantiation */
- MonoGenericClass *generic_class; /* if we're in a generic type */
+ MonoGenericInst *class_inst; /* if we're in a generic type, the instantiation of that type */
MonoGenericContainer *container; /* type parameters */
gpointer reflection_info;
};
* The generic context: an instantiation of a set of class and method generic parameters.
*/
struct _MonoGenericContext {
- /* The current generic class */
- MonoGenericClass *gclass;
+ /* The instantiation corresponding to the class generic parameters */
+ MonoGenericInst *class_inst;
/* The current generic method */
MonoGenericMethod *gmethod;
};
}
case MONO_TYPE_VAR: {
int num = type->data.generic_param->num;
- MonoGenericInst *inst = context->gclass ? context->gclass->inst : NULL;
+ MonoGenericInst *inst = context->class_inst;
if (!inst)
return NULL;
if (num >= inst->type_argc)
if (!klass->generic_container)
return NULL;
- gclass = inflate_generic_class (klass->generic_container->context.gclass, context);
- if (gclass == klass->generic_container->context.gclass)
+ gclass = inflate_generic_class (mono_get_shared_generic_class (klass->generic_container, klass->image->dynamic), context);
+ if (gclass->inst == klass->generic_container->context.class_inst)
return NULL;
nt = dup_type (type, type);
nt->type = MONO_TYPE_GENERICINST;
{
MonoGenericContext *context = gclass->cached_context;
if (context) {
- g_assert (context->gclass == gclass);
+ g_assert (context->class_inst == gclass->inst);
g_assert (!context->gmethod);
return context;
}
context = g_new0 (MonoGenericContext, 1);
- context->gclass = gclass;
+ context->class_inst = gclass->inst;
if (InterlockedCompareExchangePointer ((gpointer *)&gclass->cached_context, context, NULL))
g_free (context);
static MonoGenericContext *
inflate_generic_context (MonoGenericContext *context, MonoGenericContext *inflate_with)
{
- MonoGenericClass *gclass = NULL;
+ MonoGenericInst *class_inst = NULL;
MonoGenericMethod *gmethod = NULL;
MonoGenericContext *res;
- if (context->gclass)
- gclass = inflate_generic_class (context->gclass, inflate_with);
+ if (context->class_inst)
+ class_inst = mono_metadata_inflate_generic_inst (context->class_inst, inflate_with);
if (context->gmethod) {
MonoGenericInst *ninst = mono_metadata_inflate_generic_inst (context->gmethod->inst, inflate_with);
- if (gclass == context->gclass && ninst == context->gmethod->inst) {
+ if (class_inst == context->class_inst && ninst == context->gmethod->inst) {
gmethod = context->gmethod;
} else {
gmethod = g_new0 (MonoGenericMethod, 1);
- gmethod->generic_class = gclass;
+ gmethod->class_inst = class_inst;
gmethod->container = context->gmethod->container;
gmethod->inst = ninst;
}
}
- if (gclass == context->gclass && gmethod == context->gmethod)
+ if (class_inst == context->class_inst && gmethod == context->gmethod)
return context;
- if (!gmethod)
- return mono_generic_class_get_context (gclass);
-
res = g_new0 (MonoGenericContext, 1);
- res->gclass = gclass;
+ res->class_inst = class_inst;
res->gmethod = gmethod;
return res;
if (!klass_hint || !klass_hint->generic_class ||
klass_hint->generic_class->container_class != method->klass ||
- klass_hint->generic_class->inst != context->gclass->inst)
+ klass_hint->generic_class->inst != context->class_inst)
klass_hint = NULL;
if (method->klass->generic_container)
if (method->generic_container && !context->gmethod) {
MonoGenericMethod *gmethod = g_memdup (method->generic_container->context.gmethod, sizeof (*gmethod));
- gmethod->generic_class = result->klass->generic_class;
+ if (result->klass->generic_class)
+ gmethod->class_inst = result->klass->generic_class->inst;
context = g_new0 (MonoGenericContext, 1);
- context->gclass = result->klass->generic_class;
context->gmethod = gmethod;
-
+ context->class_inst = gmethod->class_inst;
iresult->context = context;
}
context = g_new0 (MonoGenericContext, 1);
context->gmethod = g_new0 (MonoGenericMethod, 1);
- context->gmethod->generic_class = iface->generic_class;
context->gmethod->inst = iface->generic_class->inst;
for (i = 0; i < class->parent->method.count; i++) {
class->generic_container->klass = class;
context = &class->generic_container->context;
- context->gclass = mono_get_shared_generic_class (class->generic_container, FALSE);
+ context->class_inst = mono_get_shared_generic_inst (class->generic_container);
}
if (cols [MONO_TYPEDEF_EXTENDS]) {
MonoType *t = mono_type_create_from_typespec (image, type_spec);
if (!t)
return NULL;
- if (context && (context->gclass || context->gmethod)) {
+ if (context && (context->class_inst || context->gmethod)) {
MonoType *inflated = inflate_generic_type (t, context);
if (inflated)
t = inflated;
g_assert (container);
gmethod = g_new0 (MonoGenericMethod, 1);
- gmethod->generic_class = method->klass->generic_class;
+ if (method->klass->generic_class)
+ gmethod->class_inst = method->klass->generic_class->inst;
gmethod->container = container;
new_context = g_new0 (MonoGenericContext, 1);
new_context->gmethod = gmethod;
+ /* FIXME: Is this correct? */
if (container->parent)
- new_context->gclass = container->parent->context.gclass;
+ new_context->class_inst = container->parent->context.class_inst;
/*
* When parsing the methodspec signature, we're in the old context again:
{
MonoGenericMethod *gmethod = g_new0 (MonoGenericMethod, 1);
gmethod->container = container;
- gmethod->generic_class = container->context.gclass;
+ gmethod->class_inst = container->context.class_inst;
gmethod->inst = mono_get_shared_generic_inst (container);
return gmethod;
if (generic_container) {
MonoGenericContext *context = &generic_container->context;
if (container)
- context->gclass = container->context.gclass;
+ 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);
gboolean
mono_metadata_generic_method_equal (MonoGenericMethod *g1, MonoGenericMethod *g2)
{
- return (g1->container == g2->container) && (g1->generic_class == g2->generic_class) &&
+ return (g1->container == g2->container) && (g1->class_inst == g2->class_inst) &&
(g1->inst == g2->inst);
}
MonoGenericContext *context = &container->context;
/* FIXME: !container->klass => this is probably monodis */
- g_assert (!container->klass || context->gclass || context->gmethod);
+ g_assert (!container->klass || context->class_inst || context->gmethod);
*constraints = NULL;
found = 0;
g_assert (klass->generic_container->type_params [i].owner);
}
- klass->generic_container->context.gclass = mono_get_shared_generic_class (klass->generic_container, TRUE);
+ klass->generic_container->context.class_inst = mono_get_shared_generic_inst (klass->generic_container);
}
/*
if (rmb->generic_params) {
int count = mono_array_length (rmb->generic_params);
MonoGenericContainer *container;
- MonoGenericContext *context;
m->generic_container = container = rmb->generic_container;
container->type_argc = count;
container->type_params [i].method = m;
}
- context = &container->context;
if (klass->generic_container) {
container->parent = klass->generic_container;
- context->gclass = klass->generic_container->context.gclass;
+ container->context.class_inst = klass->generic_container->context.class_inst;
}
- context->gmethod = mono_get_shared_generic_method (container);
+ container->context.gmethod = mono_get_shared_generic_method (container);
}
if (rmb->refs) {
ginst = mono_metadata_lookup_generic_inst (ginst);
gmethod = g_new0 (MonoGenericMethod, 1);
- gmethod->generic_class = method->klass->generic_class;
+ if (method->klass->generic_class)
+ gmethod->class_inst = method->klass->generic_class->inst;
gmethod->container = container;
gmethod->inst = ginst;
gmethod->reflection_info = rmethod;
context = g_new0 (MonoGenericContext, 1);
- context->gclass = method->klass->generic_class;
+ context->class_inst = gmethod->class_inst;
context->gmethod = gmethod;
if (method->is_inflated)
context = mono_generic_class_get_context ((MonoGenericClass *) gclass);
if (n) {
gmethod = g_new0 (MonoGenericMethod, 1);
- gmethod->generic_class = &gclass->generic_class;
+ gmethod->class_inst = gclass->generic_class.inst;
gmethod->container = method->generic_container;
MOVING_GC_REGISTER (&gmethod->reflection_info);
gmethod->reflection_info = obj;
g_assert (gmethod->container->parent == ((MonoGenericClass *)gclass)->container_class->generic_container);
context = g_new0 (MonoGenericContext, 1);
- context->gclass = &gclass->generic_class;
+ context->class_inst = gclass->generic_class.inst;
context->gmethod = gmethod;
}