Ongoing work to avoid redundant data and simplify invariants.
authorRaja R Harinath <harinath@hurrynot.org>
Fri, 5 Jan 2007 11:32:42 +0000 (11:32 -0000)
committerRaja R Harinath <harinath@hurrynot.org>
Fri, 5 Jan 2007 11:32:42 +0000 (11:32 -0000)
* 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.

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

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

index aaf7c091f84b3f852376582472600c1acdc7d3a4..bdc6c184bd960bb00bd0d850f5558649749fa0ce 100644 (file)
@@ -1,3 +1,11 @@
+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.
index 126ba0441a2b8a3d181ebf66a2d6ad76582ed384..f6a6af60deaec00f7da7863cdfdba0645749bf41 100644 (file)
@@ -433,7 +433,7 @@ struct _MonoDynamicGenericClass {
  */
 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;
 };
@@ -442,8 +442,8 @@ struct _MonoGenericMethod {
  * 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;
 };
index 3bece5ac1c3e00336eec94a0221ca39920c5c02f..3daa482ea0ac24a5a96d5b492e5b56de4313927a 100644 (file)
@@ -506,7 +506,7 @@ inflate_generic_type (MonoType *type, MonoGenericContext *context)
        }
        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)
@@ -552,8 +552,8 @@ inflate_generic_type (MonoType *type, MonoGenericContext *context)
 
                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;
@@ -571,13 +571,13 @@ mono_generic_class_get_context (MonoGenericClass *gclass)
 {
        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);
@@ -623,33 +623,30 @@ mono_class_inflate_generic_type (MonoType *type, MonoGenericContext *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;
@@ -715,7 +712,7 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin
 
        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)
@@ -728,12 +725,12 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin
 
        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;
        }
 
@@ -2306,7 +2303,6 @@ setup_generic_array_ifaces (MonoClass *class, MonoClass *iface, int pos)
 
        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++) {
@@ -2976,7 +2972,7 @@ mono_class_create_from_typedef (MonoImage *image, guint32 type_token)
                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]) {
@@ -3415,7 +3411,7 @@ mono_class_create_from_typespec (MonoImage *image, guint32 type_spec, MonoGeneri
        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;
index 4256cdfbb2ed7e6b525e6253ab017ff3c39369ac..f77757ee25bd421321149c87bc724a94f21d695e 100644 (file)
@@ -869,13 +869,15 @@ method_from_methodspec (MonoImage *image, MonoGenericContext *context, guint32 i
        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:
@@ -1279,7 +1281,7 @@ mono_get_shared_generic_method (MonoGenericContainer *container)
 {
        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;
@@ -1341,7 +1343,7 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass,
        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);
 
index 6d64a722ba7255ed85d8e3f331cdf34b4c0182e6..c2a2563790e8a72f9d5a1ed910b2acb97b502aeb 100644 (file)
@@ -3411,7 +3411,7 @@ mono_metadata_generic_method_hash (MonoGenericMethod *gmethod)
 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);
 }
 
@@ -4457,7 +4457,7 @@ get_constraints (MonoImage *image, int owner, MonoClass ***constraints, MonoGene
        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;
index 08f99cc35964c061a82e3238cfedb203d2d4935e..9ba2030959393beb4a8efb0a6fd3852b0f7f3e85 100644 (file)
@@ -8221,7 +8221,7 @@ mono_reflection_create_generic_class (MonoReflectionTypeBuilder *tb)
                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);
 }
 
 /*
@@ -8487,7 +8487,6 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass,
        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;
@@ -8501,12 +8500,11 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass,
                        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) {
@@ -8939,7 +8937,8 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
        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;
 
@@ -8954,7 +8953,7 @@ mono_reflection_bind_generic_method_parameters (MonoReflectionMethod *rmethod, M
        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)
@@ -8982,7 +8981,7 @@ inflate_mono_method (MonoReflectionGenericClass *type, MonoMethod *method, MonoO
        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;
@@ -9000,7 +8999,7 @@ inflate_mono_method (MonoReflectionGenericClass *type, MonoMethod *method, MonoO
                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;
        }