2010-01-07 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 7 Jan 2010 21:58:11 +0000 (21:58 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 7 Jan 2010 21:58:11 +0000 (21:58 -0000)
* object.c:
* icall.c:
* class.c: Add some FIXME for due to variant generic arguments.

object.c (mono_object_isinst_mbyref): Interfaces with variant generic arguments
can't use the simple bitfield check, so call mono_class_is_assignable_from if
the bitfield check fails.

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

mono/metadata/ChangeLog
mono/metadata/class.c
mono/metadata/icall.c
mono/metadata/object.c

index 5669850a5a1fa07e0338be98d08c675a66417e00..e2b43a7801bad70ee9c20a98ab9584b5ee4a98b1 100644 (file)
@@ -1,3 +1,13 @@
+2010-01-07  Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * object.c:
+       * icall.c:
+       * class.c: Add some FIXME for due to variant generic arguments.
+
+       object.c (mono_object_isinst_mbyref): Interfaces with variant generic arguments
+       can't use the simple bitfield check, so call mono_class_is_assignable_from if
+       the bitfield check fails.
+
 2010-01-07  Rodrigo Kumpera  <rkumpera@novell.com>
 
        * class.c (mono_class_is_assignable_from): Rework the generics variance code
index 6d902c14eb14b75425d22935dcd6cbda912d8e2a..b13ee35d9d4462757f1f492c5d550c15d3b0dfc8 100644 (file)
@@ -6480,6 +6480,7 @@ mono_class_from_name (MonoImage *image, const char* name_space, const char *name
        return class;
 }
 
+/*FIXME test for interfaces with variant generic arguments*/
 gboolean
 mono_class_is_subclass_of (MonoClass *klass, MonoClass *klassc, 
                           gboolean check_interfaces)
index 41f65463c1c76035cc0d2e43cf5699196d16d0af..ea1307427a7acc8b3d30cba989372e1b38592e81 100644 (file)
@@ -2135,6 +2135,7 @@ ves_icall_Type_GetInterfaceMapData (MonoReflectionType *type, MonoReflectionType
        mono_class_setup_vtable (class);
 
        /* type doesn't implement iface: the exception is thrown in managed code */
+       /*FIXME test for interfaces with variant generic arguments*/
        if (! MONO_CLASS_IMPLEMENTS_INTERFACE (class, iclass->interface_id))
                        return;
 
index 3f75cdd7c5dc681c3d3ac6093f449b18a14015cf..e08b59613c62142efab56292fed38a5d9930e979 100644 (file)
@@ -2048,6 +2048,7 @@ mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, Mono
                GPtrArray *ifaces;
                int method_count;
 
+               /*FIXME test for interfaces with variant generic arguments*/
                if (MONO_CLASS_IMPLEMENTS_INTERFACE (class, iclass->interface_id))
                        continue;       /* interface implemented by the class */
                if (g_slist_find (extra_interfaces, iclass))
@@ -2061,6 +2062,7 @@ mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, Mono
                if (ifaces) {
                        for (i = 0; i < ifaces->len; ++i) {
                                MonoClass *ic = g_ptr_array_index (ifaces, i);
+                               /*FIXME test for interfaces with variant generic arguments*/
                                if (MONO_CLASS_IMPLEMENTS_INTERFACE (class, ic->interface_id))
                                        continue;       /* interface implemented by the class */
                                if (g_slist_find (extra_interfaces, ic))
@@ -4858,7 +4860,7 @@ mono_object_isinst (MonoObject *obj, MonoClass *klass)
        if (!klass->inited)
                mono_class_init (klass);
 
-       if (klass->marshalbyref || klass->flags & TYPE_ATTRIBUTE_INTERFACE) 
+       if (klass->marshalbyref || (klass->flags & TYPE_ATTRIBUTE_INTERFACE))
                return mono_object_isinst_mbyref (obj, klass);
 
        if (!obj)
@@ -4881,6 +4883,10 @@ mono_object_isinst_mbyref (MonoObject *obj, MonoClass *klass)
                if (MONO_VTABLE_IMPLEMENTS_INTERFACE (vt, klass->interface_id)) {
                        return obj;
                }
+
+               /*If the above check fails we are in the slow path of possibly raising an exception. So it's ok to it this way.*/
+               if (mono_class_has_variant_generic_params (klass) && mono_class_is_assignable_from (klass, obj->vtable->klass))
+                       return obj;
        } else {
                MonoClass *oklass = vt->klass;
                if ((oklass == mono_defaults.transparent_proxy_class))