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