From 0f66558cdabd8c95c3e33329a3372f997e5960bc Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Tue, 2 Jan 2007 02:02:29 +0000 Subject: [PATCH] 2007-01-01 Miguel de Icaza * icall.c (ves_icall_System_Reflection_Assembly_InternalGetType): Clear the error before returning to unmanaged code to prevent the runtime from being confused later on (fixes 80420). (ves_icall_type_from_name): Always call mono_loader_clear_error after parsing a type that could have failed. (ves_icall_System_Reflection_Assembly_GetTypes): ditto. * loader.c (mono_loader_clear_error): Fix indentation. svn path=/trunk/mono/; revision=70330 --- mono/metadata/ChangeLog | 11 +++++++++++ mono/metadata/icall.c | 21 ++++++++++++++++++--- mono/metadata/loader.c | 4 ++-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 49d221aad5e..454f8b27e8b 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,14 @@ +2007-01-01 Miguel de Icaza + + * icall.c (ves_icall_System_Reflection_Assembly_InternalGetType): + Clear the error before returning to unmanaged code to prevent the + runtime from being confused later on (fixes 80420). + (ves_icall_type_from_name): Always call mono_loader_clear_error + after parsing a type that could have failed. + (ves_icall_System_Reflection_Assembly_GetTypes): ditto. + + * loader.c (mono_loader_clear_error): Fix indentation. + 2006-12-28 Martin Baulig * mono-debug.h (MONO_DEBUGGER_VERSION): Bump to 58. diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 8bab10d40ef..dcc65c0bcbe 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -1080,8 +1080,14 @@ ves_icall_type_from_name (MonoString *name, type = type_from_name (str, ignoreCase); g_free (str); if (type == NULL){ + MonoException *e = NULL; + if (throwOnError) - mono_raise_exception (mono_get_exception_type_load (name, NULL)); + e = mono_get_exception_type_load (name, NULL); + + mono_loader_clear_error (); + if (e != NULL) + mono_raise_exception (e); } return type; @@ -3792,9 +3798,16 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as g_list_free (info.modifiers); g_list_free (info.nested); if (!type) { + MonoException *e = NULL; + if (throwOnError) - mono_raise_exception (mono_get_exception_type_load (name, NULL)); - /* g_print ("failed find\n"); */ + e = mono_get_exception_type_load (name, NULL); + + mono_loader_clear_error (); + + if (e != NULL) + mono_raise_exception (e); + return NULL; } @@ -3804,6 +3817,7 @@ ves_icall_System_Reflection_Assembly_InternalGetType (MonoReflectionAssembly *as if (throwOnError && klass->exception_type) { /* report SecurityException (or others) that occured when loading the assembly */ MonoException *exc = mono_class_get_exception_for_failure (klass); + mono_loader_clear_error (); mono_raise_exception (exc); } else if (klass->exception_type == MONO_EXCEPTION_SECURITY_INHERITANCEDEMAND) { return NULL; @@ -4736,6 +4750,7 @@ ves_icall_System_Reflection_Assembly_GetTypes (MonoReflectionAssembly *assembly, list = NULL; exc = mono_get_exception_reflection_type_load (res, exl); + mono_loader_clear_error (); mono_raise_exception (exc); } diff --git a/mono/metadata/loader.c b/mono/metadata/loader.c index 7975e8d376e..7d99197df8a 100644 --- a/mono/metadata/loader.c +++ b/mono/metadata/loader.c @@ -214,8 +214,8 @@ mono_loader_clear_error (void) MonoLoaderError *ex = (MonoLoaderError*)TlsGetValue (loader_error_thread_id); if (ex) { - g_free (ex->class_name); - g_free (ex->assembly_name); + g_free (ex->class_name); + g_free (ex->assembly_name); g_free (ex); TlsSetValue (loader_error_thread_id, NULL); -- 2.11.4.GIT