2007-04-11 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Wed, 11 Apr 2007 18:22:35 +0000 (18:22 -0000)
committerMartin Baulig <martin@novell.com>
Wed, 11 Apr 2007 18:22:35 +0000 (18:22 -0000)
* mini.c (can_access_member): Fix handling of generic classes;
fixes #81259.

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

mono/mini/ChangeLog
mono/mini/mini.c

index a976d9d906551e328739454855348f3ac142f482..682bd5bcea68e14bfb75634fbe67cf44a5afb96f 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-11  Martin Baulig  <martin@ximian.com>
+
+       * mini.c (can_access_member): Fix handling of generic classes;
+       fixes #81259.
+
 2007-04-10  Zoltan Varga  <vargaz@gmail.com>
 
        * aot-runtime.c (mono_aot_plt_resolve): Fix disabling of AOT. Fixes #81316.
index beff63a0ae7b63e4f142b2a2f96b73d6d3142de6..3db26016be6916051fc83df8484df66823b41208 100644 (file)
@@ -3760,6 +3760,13 @@ can_access_internals (MonoAssembly *accessing, MonoAssembly* accessed)
 static gboolean
 can_access_member (MonoClass *access_klass, MonoClass *member_klass, int access_level)
 {
+       if (access_klass->generic_class && member_klass->generic_class &&
+           access_klass->generic_class->container_class && member_klass->generic_class->container_class) {
+               if (can_access_member (access_klass->generic_class->container_class,
+                                      member_klass->generic_class->container_class, access_level))
+                       return TRUE;
+       }
+
        /* Partition I 8.5.3.2 */
        /* the access level values are the same for fields and methods */
        switch (access_level) {
@@ -3767,12 +3774,10 @@ can_access_member (MonoClass *access_klass, MonoClass *member_klass, int access_
                /* same compilation unit */
                return access_klass->image == member_klass->image;
        case FIELD_ATTRIBUTE_PRIVATE:
-               if (access_klass->generic_class && member_klass->generic_class && member_klass->generic_class->container_class)
-                       return member_klass->generic_class->container_class == access_klass->generic_class->container_class;
                return access_klass == member_klass;
        case FIELD_ATTRIBUTE_FAM_AND_ASSEM:
                if (mono_class_has_parent (access_klass, member_klass) &&
-                               can_access_internals (access_klass->image->assembly, member_klass->image->assembly))
+                   can_access_internals (access_klass->image->assembly, member_klass->image->assembly))
                        return TRUE;
                return FALSE;
        case FIELD_ATTRIBUTE_ASSEMBLY: