Author: zoltan
Date: 2005-04-25 16:54:27 -0400 (Mon, 25 Apr 2005)
New Revision: 43564

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/class.c
   trunk/mono/mono/metadata/object-internals.h
   trunk/mono/mono/metadata/reflection.c
Log:
2005-04-25  Zoltan Varga  <[EMAIL PROTECTED]>

        * class.c (mono_class_is_assignable_from): Call is_assignable_to for
        dynamic types to prevent infinite loops. Fixes #74727.

        * reflection.c (mono_reflection_call_is_assignable_from): Rename to
        ..._is_assignable_to.


Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2005-04-25 20:43:08 UTC (rev 43563)
+++ trunk/mono/mono/metadata/ChangeLog  2005-04-25 20:54:27 UTC (rev 43564)
@@ -1,3 +1,11 @@
+2005-04-25  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * class.c (mono_class_is_assignable_from): Call is_assignable_to for
+       dynamic types to prevent infinite loops. Fixes #74727.
+
+       * reflection.c (mono_reflection_call_is_assignable_from): Rename to
+       ..._is_assignable_to.
+
 2005-04-25  Sebastien Pouliot  <[EMAIL PROTECTED]>
 
        * security.c: Fixed #74698 where sysconf returned -1 on FreeBSD.

Modified: trunk/mono/mono/metadata/class.c
===================================================================
--- trunk/mono/mono/metadata/class.c    2005-04-25 20:43:08 UTC (rev 43563)
+++ trunk/mono/mono/metadata/class.c    2005-04-25 20:54:27 UTC (rev 43564)
@@ -3317,7 +3317,7 @@
                         * oklass might be a generic type parameter but they 
have 
                         * interface_offsets set.
                         */
-                       return mono_reflection_call_is_assignable_from (klass, 
oklass);
+                       return mono_reflection_call_is_assignable_to (oklass, 
klass);
 
                if ((klass->interface_id <= oklass->max_interface_id) &&
                    (oklass->interface_offsets [klass->interface_id] != -1))

Modified: trunk/mono/mono/metadata/object-internals.h
===================================================================
--- trunk/mono/mono/metadata/object-internals.h 2005-04-25 20:43:08 UTC (rev 
43563)
+++ trunk/mono/mono/metadata/object-internals.h 2005-04-25 20:54:27 UTC (rev 
43564)
@@ -1030,7 +1030,7 @@
 mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, 
MonoClass **handle_class);
 
 gboolean
-mono_reflection_call_is_assignable_from (MonoClass *klass, MonoClass *oklass);
+mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass);
 
 void
 mono_image_build_metadata (MonoReflectionModuleBuilder *module);

Modified: trunk/mono/mono/metadata/reflection.c
===================================================================
--- trunk/mono/mono/metadata/reflection.c       2005-04-25 20:43:08 UTC (rev 
43563)
+++ trunk/mono/mono/metadata/reflection.c       2005-04-25 20:54:27 UTC (rev 
43564)
@@ -9473,20 +9473,32 @@
 }
 
 gboolean
-mono_reflection_call_is_assignable_from (MonoClass *klass, MonoClass *oklass)
+mono_reflection_call_is_assignable_to (MonoClass *klass, MonoClass *oklass)
 {
        MonoObject *res, *exc;
        void *params [1];
+       static MonoClass *System_Reflection_Emit_TypeBuilder = NULL;
        static MonoMethod *method = NULL;
 
+       if (!System_Reflection_Emit_TypeBuilder) {
+               System_Reflection_Emit_TypeBuilder = mono_class_from_name 
(mono_defaults.corlib, "System.Reflection.Emit", "TypeBuilder");
+               g_assert (System_Reflection_Emit_TypeBuilder);
+       }
        if (method == NULL) {
-               method = mono_class_get_method_from_name 
(mono_defaults.monotype_class->parent, "IsAssignableFrom", 1);
+               method = mono_class_get_method_from_name 
(System_Reflection_Emit_TypeBuilder, "IsAssignableTo", 1);
                g_assert (method);
        }
 
+       /* 
+        * The result of mono_type_get_object () might be a System.MonoType but 
we
+        * need a TypeBuilder so use klass->reflection_info.
+        */
+       g_assert (klass->reflection_info);
+       g_assert (!strcmp 
(((MonoObject*)(klass->reflection_info))->vtable->klass->name, "TypeBuilder"));
+
        params [0] = mono_type_get_object (mono_domain_get (), 
&oklass->byval_arg);
 
-       res = mono_runtime_invoke (method, mono_type_get_object 
(mono_domain_get (), &klass->byval_arg), params, &exc);
+       res = mono_runtime_invoke (method, 
(MonoObject*)(klass->reflection_info), params, &exc);
        if (exc)
                return FALSE;
        else

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to