From dcca08e88ab24a53ffcb1dbc149059b02ce95d97 Mon Sep 17 00:00:00 2001 From: kumpera Date: Thu, 7 Jan 2010 21:58:11 +0000 Subject: [PATCH] 2010-01-07 Rodrigo Kumpera * 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. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mono@149194 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- mono/metadata/ChangeLog | 10 ++++++++++ mono/metadata/class.c | 1 + mono/metadata/icall.c | 1 + mono/metadata/object.c | 8 +++++++- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 5669850a5..e2b43a780 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,5 +1,15 @@ 2010-01-07 Rodrigo Kumpera + * 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 + * class.c (mono_class_is_assignable_from): Rework the generics variance code to be easier to read and fix bugs in the case a non generic type implements a variant interface. diff --git a/mono/metadata/class.c b/mono/metadata/class.c index 6d902c14e..b13ee35d9 100644 --- a/mono/metadata/class.c +++ b/mono/metadata/class.c @@ -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) diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 41f65463c..ea1307427 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -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; diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 3f75cdd7c..e08b59613 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -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)) -- 2.11.4.GIT