From b597d5b4381bb2828b00bfa00c5b11015b8719be Mon Sep 17 00:00:00 2001 From: gonzalo Date: Thu, 11 Dec 2008 21:06:47 +0000 Subject: [PATCH] 2008-12-11 Gonzalo Paniagua Javier * icall.c: make Assembly.GetExecutingAssembly work properly when reflection is used to invoke the method. Bug #321781 fixed. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mono@121352 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- mono/metadata/ChangeLog | 6 ++++++ mono/metadata/icall.c | 30 ++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index d30836a88..4ac3d3799 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,9 @@ +2008-12-11 Gonzalo Paniagua Javier + + * icall.c: make Assembly.GetExecutingAssembly work properly when + reflection is used to invoke the method. + Bug #321781 fixed. + 2008-12-11 Mark Probst * metadata/generic-sharing.c: Look for constraints in all type diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 558aa197c..f5c7c597e 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -1168,6 +1168,24 @@ get_caller (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer dat return FALSE; } +static gboolean +get_executing (MonoMethod *m, gint32 no, gint32 ilo, gboolean managed, gpointer data) +{ + MonoMethod **dest = data; + + /* skip unmanaged frames */ + if (!managed) + return FALSE; + + if (!(*dest)) { + if (!strcmp (m->klass->name_space, "System.Reflection")) + return FALSE; + *dest = m; + return TRUE; + } + return FALSE; +} + static MonoReflectionType * type_from_name (const char *str, MonoBoolean ignoreCase) { @@ -4922,11 +4940,12 @@ ves_icall_System_Reflection_MethodBase_GetMethodBodyInternal (MonoMethod *method static MonoReflectionAssembly* ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void) { - MonoMethod *m = mono_method_get_last_managed (); + MonoMethod *dest = NULL; MONO_ARCH_SAVE_REGS; - return mono_assembly_get_object (mono_domain_get (), m->klass->image->assembly); + mono_stack_walk_no_il (get_executing, &dest); + return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly); } @@ -4946,11 +4965,14 @@ ves_icall_System_Reflection_Assembly_GetEntryAssembly (void) static MonoReflectionAssembly* ves_icall_System_Reflection_Assembly_GetCallingAssembly (void) { - MonoMethod *m = mono_method_get_last_managed (); - MonoMethod *dest = m; + MonoMethod *m; + MonoMethod *dest; MONO_ARCH_SAVE_REGS; + dest = NULL; + mono_stack_walk_no_il (get_executing, &dest); + m = dest; mono_stack_walk_no_il (get_caller, &dest); if (!dest) dest = m; -- 2.11.4.GIT