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