2010-04-07 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Wed, 7 Apr 2010 22:55:26 +0000 (22:55 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Wed, 7 Apr 2010 22:55:26 +0000 (22:55 -0000)
class.c (mono_bounded_array_class_get): Properly init
cast_class to take the fact that uint[] and int[] can be
casted between each other.

Fixes #555950.

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

mono/metadata/ChangeLog
mono/metadata/class.c

index 710088468b6ade59da30b5e9d844f181c1571d1b..47f1957c004fdb9e35f3d5457e6eb32780f7f8a5 100644 (file)
@@ -1,3 +1,11 @@
+2010-04-07 Rodrigo Kumpera  <rkumpera@novell.com>
+
+       class.c (mono_bounded_array_class_get): Properly init
+       cast_class to take the fact that uint[] and int[] can be
+       casted between each other.
+
+       Fixes #555950.
+
 2010-04-08  Zoltan Varga  <vargaz@gmail.com>
 
        * icall.c (ves_icall_System_Enum_ToObject): Avoid a crash for unfinished type
index 48ac745b8e74565a884dccdcddc84656088300eb..f3be6e02594bcf39026a9b1a955c4c8851f5e5ba 100644 (file)
@@ -5779,6 +5779,29 @@ mono_bounded_array_class_get (MonoClass *eclass, guint32 rank, gboolean bounded)
        else
                class->cast_class = eclass;
 
+       switch (class->cast_class->byval_arg.type) {
+       case MONO_TYPE_I1:
+               class->cast_class = mono_defaults.byte_class;
+               break;
+       case MONO_TYPE_U2:
+               class->cast_class = mono_defaults.int16_class;
+               break;
+       case MONO_TYPE_U4:
+#if SIZEOF_VOID_P == 4
+       case MONO_TYPE_I:
+       case MONO_TYPE_U:
+#endif
+               class->cast_class = mono_defaults.int32_class;
+               break;
+       case MONO_TYPE_U8:
+#if SIZEOF_VOID_P == 8
+       case MONO_TYPE_I:
+       case MONO_TYPE_U:
+#endif
+               class->cast_class = mono_defaults.int64_class;
+               break;
+       }
+
        class->element_class = eclass;
 
        if ((rank > 1) || bounded) {