Author: raja
Date: 2007-01-05 06:32:42 -0500 (Fri, 05 Jan 2007)
New Revision: 70527

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/class-internals.h
   trunk/mono/mono/metadata/class.c
   trunk/mono/mono/metadata/loader.c
   trunk/mono/mono/metadata/metadata.c
   trunk/mono/mono/metadata/reflection.c
Log:
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.


Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-01-05 08:22:27 UTC (rev 70526)
+++ trunk/mono/mono/metadata/ChangeLog  2007-01-05 11:32:42 UTC (rev 70527)
@@ -1,3 +1,11 @@
+2007-01-05  Raja R Harinath  <[EMAIL PROTECTED]>
+
+       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  <[EMAIL PROTECTED]>
 
        * class.c : skip io-layer under PLATFORM_WIN32.

Modified: trunk/mono/mono/metadata/class-internals.h
===================================================================
--- trunk/mono/mono/metadata/class-internals.h  2007-01-05 08:22:27 UTC (rev 
70526)
+++ trunk/mono/mono/metadata/class-internals.h  2007-01-05 11:32:42 UTC (rev 
70527)
@@ -433,7 +433,7 @@
  */
 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 @@
  * 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;
 };

Modified: trunk/mono/mono/metadata/class.c
===================================================================
--- trunk/mono/mono/metadata/class.c    2007-01-05 08:22:27 UTC (rev 70526)
+++ trunk/mono/mono/metadata/class.c    2007-01-05 11:32:42 UTC (rev 70527)
@@ -506,7 +506,7 @@
        }
        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 @@
 
                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 @@
 {
        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 @@
 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 @@
 
        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 @@
 
        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 @@
 
        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 @@
                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 @@
        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;

Modified: trunk/mono/mono/metadata/loader.c
===================================================================
--- trunk/mono/mono/metadata/loader.c   2007-01-05 08:22:27 UTC (rev 70526)
+++ trunk/mono/mono/metadata/loader.c   2007-01-05 11:32:42 UTC (rev 70527)
@@ -869,13 +869,15 @@
        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 @@
 {
        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 @@
        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);
 

Modified: trunk/mono/mono/metadata/metadata.c
===================================================================
--- trunk/mono/mono/metadata/metadata.c 2007-01-05 08:22:27 UTC (rev 70526)
+++ trunk/mono/mono/metadata/metadata.c 2007-01-05 11:32:42 UTC (rev 70527)
@@ -3411,7 +3411,7 @@
 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 @@
        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;

Modified: trunk/mono/mono/metadata/reflection.c
===================================================================
--- trunk/mono/mono/metadata/reflection.c       2007-01-05 08:22:27 UTC (rev 
70526)
+++ trunk/mono/mono/metadata/reflection.c       2007-01-05 11:32:42 UTC (rev 
70527)
@@ -8221,7 +8221,7 @@
                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 @@
        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 @@
                        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 @@
        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 @@
        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 @@
        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 @@
                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;
        }
 

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to