#endif
+ [Test]
+ public void JaggedArrayCtor ()
+ {
+ var type = Type.GetType ("System.Object[][]");
+
+ ConstructorInfo ctor = null;
+ foreach (var c in type.GetConstructors ()) {
+ if (c.GetParameters ().Length == 2)
+ ctor = c;
+ }
+ Assert.IsNotNull (ctor);
+ var arr = (object[])ctor.Invoke (new object [] { 4, 10 });
+ for (int i = 0; i < 4; ++i) {
+ Assert.IsNotNull (arr [i]);
+ Assert.AreEqual (10, ((object[])arr [i]).Length);
+ }
+ }
}
}
MonoMethodSignature *sig;
int count_generic = 0, first_generic = 0;
int method_num = 0;
+ gboolean jagged_ctor = FALSE;
count = 3 + (class->rank > 1? 2: 1);
mono_class_setup_interfaces (class, &error);
g_assert (mono_error_ok (&error)); /*FIXME can this fail for array types?*/
+ if (class->rank == 1 && class->element_class->rank) {
+ jagged_ctor = TRUE;
+ class->method.count ++;
+ }
+
if (class->interface_count) {
count_generic = generic_array_methods (class);
first_generic = count;
amethod = create_array_method (class, ".ctor", sig);
methods [method_num++] = amethod;
}
+
+ if (jagged_ctor) {
+ /* Jagged arrays have an extra ctor in .net which creates an array of arrays */
+ 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 + 1; ++i)
+ sig->params [i] = &mono_defaults.int32_class->byval_arg;
+ amethod = create_array_method (class, ".ctor", sig);
+ methods [method_num++] = amethod;
+ }
+
/* element Get (idx11, [idx2, ...]) */
sig = mono_metadata_signature_alloc (class->image, class->rank);
sig->ret = &class->element_class->byval_arg;
for (i = 0; i < pcount; ++i)
lengths [i] = *(int32_t*) ((char*)mono_array_get (params, gpointer, i) + sizeof (MonoObject));
+ if (m->klass->rank == 1 && sig->param_count == 2 && m->klass->element_class->rank) {
+ /* This is a ctor for jagged arrays. MS creates an array of arrays. */
+ MonoArray *arr = mono_array_new_full (mono_object_domain (params), m->klass, lengths, NULL);
+
+ for (i = 0; i < mono_array_length (arr); ++i) {
+ MonoArray *subarray = mono_array_new_full (mono_object_domain (params), m->klass->element_class, &lengths [1], NULL);
+
+ mono_array_setref_fast (arr, i, subarray);
+ }
+ return (MonoObject*)arr;
+ }
+
if (m->klass->rank == pcount) {
/* Only lengths provided. */
lower_bounds = NULL;