Author: lupus
Date: 2007-01-25 10:28:48 -0500 (Thu, 25 Jan 2007)
New Revision: 71670

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/class.c
   trunk/mono/mono/metadata/loader.c
Log:


Thu Jan 25 16:22:36 CET 2007 Paolo Molaro <[EMAIL PROTECTED]>

        * class.c, loader.c: create the needed Set/Get/Address array methods
        as well as the .ctors in mono_class_init (), fixes bug #80567.



Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-01-25 15:17:55 UTC (rev 71669)
+++ trunk/mono/mono/metadata/ChangeLog  2007-01-25 15:28:48 UTC (rev 71670)
@@ -1,3 +1,9 @@
+
+Thu Jan 25 16:22:36 CET 2007 Paolo Molaro <[EMAIL PROTECTED]>
+
+       * class.c, loader.c: create the needed Set/Get/Address array methods
+       as well as the .ctors in mono_class_init (), fixes bug #80567.
+
 2007-01-24  Zoltan Varga  <[EMAIL PROTECTED]>
 
        * class.c (mono_class_layout_fields): When force-aligning a field, make 
sure

Modified: trunk/mono/mono/metadata/class.c
===================================================================
--- trunk/mono/mono/metadata/class.c    2007-01-25 15:17:55 UTC (rev 71669)
+++ trunk/mono/mono/metadata/class.c    2007-01-25 15:28:48 UTC (rev 71670)
@@ -2323,6 +2323,27 @@
        }
 }
 
+static MonoMethod*
+create_array_method (MonoClass *class, const char *name, MonoMethodSignature 
*sig)
+{
+       MonoMethod *method;
+
+       method = (MonoMethod *) mono_mempool_alloc0 (class->image->mempool, 
sizeof (MonoMethodPInvoke));
+       method->klass = class;
+       method->flags = METHOD_ATTRIBUTE_PUBLIC;
+       method->iflags = METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL;
+       method->signature = sig;
+       method->name = name;
+       method->slot = -1;
+       /* .ctor */
+       if (name [0] == '.') {
+               method->flags |= METHOD_ATTRIBUTE_RT_SPECIAL_NAME | 
METHOD_ATTRIBUTE_SPECIAL_NAME;
+       } else {
+               method->iflags |= METHOD_IMPL_ATTRIBUTE_RUNTIME;
+       }
+       return method;
+}
+
 /**
  * mono_class_init:
  * @class: the class to initialize
@@ -2466,11 +2487,12 @@
 
        /* initialize method pointers */
        if (class->rank) {
-               MonoMethod *ctor;
+               MonoMethod *amethod;
                MonoMethodSignature *sig;
                int count_generic = 0, first_generic = 0;
+               int method_num = 0;
 
-               class->method.count = (class->rank > 1? 2: 1);
+               class->method.count = 3 + (class->rank > 1? 2: 1);
 
                if (class->interface_count) {
                        for (i = 0; i < class->parent->method.count; i++) {
@@ -2485,34 +2507,52 @@
                sig = mono_metadata_signature_alloc (class->image, class->rank);
                sig->ret = &mono_defaults.void_class->byval_arg;
                sig->pinvoke = TRUE;
+               sig->hasthis = TRUE;
                for (i = 0; i < class->rank; ++i)
                        sig->params [i] = &mono_defaults.int32_class->byval_arg;
 
-               ctor = (MonoMethod *) mono_mempool_alloc0 
(class->image->mempool, sizeof (MonoMethodPInvoke));
-               ctor->klass = class;
-               ctor->flags = METHOD_ATTRIBUTE_PUBLIC | 
METHOD_ATTRIBUTE_RT_SPECIAL_NAME | METHOD_ATTRIBUTE_SPECIAL_NAME;
-               ctor->iflags = METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL;
-               ctor->signature = sig;
-               ctor->name = ".ctor";
-               ctor->slot = -1;
+               amethod = create_array_method (class, ".ctor", sig);
                class->methods = mono_mempool_alloc0 (class->image->mempool, 
sizeof (MonoMethod*) * class->method.count);
-               class->methods [0] = ctor;
+               class->methods [method_num++] = amethod;
                if (class->rank > 1) {
                        sig = mono_metadata_signature_alloc (class->image, 
class->rank * 2);
                        sig->ret = &mono_defaults.void_class->byval_arg;
                        sig->pinvoke = TRUE;
+                       sig->hasthis = TRUE;
                        for (i = 0; i < class->rank * 2; ++i)
                                sig->params [i] = 
&mono_defaults.int32_class->byval_arg;
 
-                       ctor = (MonoMethod *) mono_mempool_alloc0 
(class->image->mempool, sizeof (MonoMethodPInvoke));
-                       ctor->klass = class;
-                       ctor->flags = METHOD_ATTRIBUTE_PUBLIC | 
METHOD_ATTRIBUTE_RT_SPECIAL_NAME | METHOD_ATTRIBUTE_SPECIAL_NAME;
-                       ctor->iflags = METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL;
-                       ctor->signature = sig;
-                       ctor->name = ".ctor";
-                       ctor->slot = -1;
-                       class->methods [1] = ctor;
+                       amethod = create_array_method (class, ".ctor", sig);
+                       class->methods [method_num++] = amethod;
                }
+               /* element Get (idx11, [idx2, ...]) */
+               sig = mono_metadata_signature_alloc (class->image, class->rank);
+               sig->ret = &class->element_class->byval_arg;
+               sig->pinvoke = TRUE;
+               sig->hasthis = TRUE;
+               for (i = 0; i < class->rank; ++i)
+                       sig->params [i] = &mono_defaults.int32_class->byval_arg;
+               amethod = create_array_method (class, "Get", sig);
+               class->methods [method_num++] = amethod;
+               /* element& Address (idx11, [idx2, ...]) */
+               sig = mono_metadata_signature_alloc (class->image, class->rank);
+               sig->ret = &class->element_class->this_arg;
+               sig->pinvoke = TRUE;
+               sig->hasthis = TRUE;
+               for (i = 0; i < class->rank; ++i)
+                       sig->params [i] = &mono_defaults.int32_class->byval_arg;
+               amethod = create_array_method (class, "Address", sig);
+               class->methods [method_num++] = amethod;
+               /* void Set (idx11, [idx2, ...], element) */
+               sig = mono_metadata_signature_alloc (class->image, class->rank 
+ 1);
+               sig->ret = &mono_defaults.void_class->byval_arg;
+               sig->pinvoke = TRUE;
+               sig->hasthis = TRUE;
+               for (i = 0; i < class->rank; ++i)
+                       sig->params [i] = &mono_defaults.int32_class->byval_arg;
+               sig->params [i] = &class->element_class->byval_arg;
+               amethod = create_array_method (class, "Set", sig);
+               class->methods [method_num++] = amethod;
 
                for (i = 0; i < class->interface_count; i++)
                        setup_generic_array_ifaces (class, class->interfaces 
[i], first_generic + i * count_generic);

Modified: trunk/mono/mono/metadata/loader.c
===================================================================
--- trunk/mono/mono/metadata/loader.c   2007-01-25 15:17:55 UTC (rev 71669)
+++ trunk/mono/mono/metadata/loader.c   2007-01-25 15:28:48 UTC (rev 71670)
@@ -652,6 +652,19 @@
        return mono_method_get_signature_full (method, image, token, NULL);
 }
 
+/* this is only for the typespec array methods */
+static MonoMethod*
+search_in_array_class (MonoClass *klass, const char *name, MonoMethodSignature 
*sig)
+{
+       int i;
+       for (i = 0; i < klass->method.count; ++i) {
+               MonoMethod *method = klass->methods [i];
+               if (strcmp (method->name, name) == 0 && sig->param_count == 
method->signature->param_count)
+                       return method;
+       }
+       return NULL;
+}
+
 static MonoMethod *
 method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext 
*typespec_context)
 {
@@ -746,39 +759,11 @@
                        break;
                }
 
-               result = (MonoMethod *)g_new0 (MonoMethodPInvoke, 1);
-               result->klass = klass;
-               result->iflags = METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL;
-               result->flags = METHOD_ATTRIBUTE_PUBLIC;
-               result->signature = sig;
-               result->name = mname;
-
-               if (!strcmp (mname, ".ctor")) {
-                       /* we special-case this in the runtime. */
+               /* we're an array and we created these methods already in klass 
in mono_class_init () */
+               result = search_in_array_class (klass, mname, sig);
+               if (result)
                        return result;
-               }
 
-               if (!strcmp (mname, "Set")) {
-                       g_assert (sig->hasthis);
-                       g_assert (type->data.array->rank + 1 == 
sig->param_count);
-                       result->iflags |= METHOD_IMPL_ATTRIBUTE_RUNTIME;
-                       return result;
-               }
-
-               if (!strcmp (mname, "Get")) {
-                       g_assert (sig->hasthis);
-                       g_assert (type->data.array->rank == sig->param_count);
-                       result->iflags |= METHOD_IMPL_ATTRIBUTE_RUNTIME;
-                       return result;
-               }
-
-               if (!strcmp (mname, "Address")) {
-                       g_assert (sig->hasthis);
-                       g_assert (type->data.array->rank == sig->param_count);
-                       result->iflags |= METHOD_IMPL_ATTRIBUTE_RUNTIME;
-                       return result;
-               }
-
                g_assert_not_reached ();
                break;
        }

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

Reply via email to