Fix reading of cattr arguments of type Type[]. Fixes #670331.
authorZoltan Varga <vargaz@gmail.com>
Sun, 13 Feb 2011 03:23:20 +0000 (04:23 +0100)
committerZoltan Varga <vargaz@gmail.com>
Sun, 13 Feb 2011 03:23:49 +0000 (04:23 +0100)
mono/metadata/reflection.c
mono/tests/cattr-object.cs

index 5bcc7405920bf54a1322c080470c10dc9fcc96a4..ef7e2fb71b11fa3264a7df64dab32df10dfbd93a 100644 (file)
@@ -7864,12 +7864,16 @@ handle_type:
                        int etype = *p;
                        p ++;
 
-                       if (etype == 0x51)
-                               /* See Partition II, Appendix B3 */
-                               etype = MONO_TYPE_OBJECT;
                        type = MONO_TYPE_SZARRAY;
-                       simple_type.type = etype;
-                       tklass = mono_class_from_mono_type (&simple_type);
+                       if (etype == 0x50) {
+                               tklass = mono_defaults.systemtype_class;
+                       } else {
+                               if (etype == 0x51)
+                                       /* See Partition II, Appendix B3 */
+                                       etype = MONO_TYPE_OBJECT;
+                               simple_type.type = etype;
+                               tklass = mono_class_from_mono_type (&simple_type);
+                       }
                        goto handle_enum;
                } else if (subt == 0x55) {
                        char *n;
index 51db9c5ae58a1c7bc78ba174ac949a83eb27f18c..4738a637475e514cfb55822174f0f1a9cc34f0f1 100644 (file)
@@ -1,24 +1,32 @@
 using System;
+using System.Collections.Generic;
 
 [My((long)1)]
 [My(TypeCode.Empty)]
 [My(typeof(System.Enum))]
+[My(new Type[] { typeof(IEnumerable<string>), typeof(IList<string>) })]
 class T {
        static int Main() {
                object[] a = Attribute.GetCustomAttributes (typeof (T), false);
-               if (a.Length != 3)
+               if (a.Length != 4)
                        return 1;
                foreach (object o in a) {
                        My attr = (My)o;
                        if (attr.obj.GetType () == typeof(long)) {
                                long val = (long)attr.obj;
-                               Console.WriteLine ("got value: {0}", val);
                                if (val != 1)
                                        return 2;
                        } else if (attr.obj.GetType () == typeof(TypeCode)) {
                                int val = (int)attr.obj;
                                if (val != (int)TypeCode.Empty)
                                        return 3;
+                       } else if (attr.obj.GetType () == typeof(Type[])) {
+                               Type[] arr = (Type[])attr.obj;
+
+                               if (arr [0] != typeof (IEnumerable<string>))
+                                       return 6;
+                               if (arr [1] != typeof (IList<string>))
+                                       return 7;
                        } else {
                                Type t = attr.obj as Type;
                                if (t == null)