[runtime] Format MethodAccessException method names to use the same formating as...
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 17 Aug 2017 22:47:27 +0000 (15:47 -0700)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 17 Aug 2017 22:47:27 +0000 (15:47 -0700)
Add mono_method_get_reflection_name that returns the string managed is expecting.

mono/metadata/debug-helpers.c
mono/metadata/debug-helpers.h
mono/mini/jit-icalls.c

index df6a4fed185b5e3bcf438a30654406119eb2f417..5fe0b9a77b528c38b85da04777331fb1bd842261 100644 (file)
@@ -838,6 +838,13 @@ mono_method_get_name_full (MonoMethod *method, gboolean signature, gboolean ret,
        char *inst_desc = NULL;
        MonoError error;
 
+       const char *class_method_separator = ":";
+       const char *method_sig_space = " ";
+       if (format == MONO_TYPE_NAME_FORMAT_REFLECTION) {
+               class_method_separator = ".";
+               method_sig_space = "";
+       }
+
        if (format == MONO_TYPE_NAME_FORMAT_IL)
                klass_desc = mono_type_full_name (&method->klass->byval_arg);
        else
@@ -897,16 +904,19 @@ mono_method_get_name_full (MonoMethod *method, gboolean signature, gboolean ret,
                        strcpy (wrapper, "");
                if (ret && sig) {
                        char *ret_str = mono_type_full_name (sig->ret);
-                       res = g_strdup_printf ("%s%s %s:%s%s (%s)", wrapper, ret_str, klass_desc,
-                                                                  method->name, inst_desc ? inst_desc : "", tmpsig);
+                       res = g_strdup_printf ("%s%s %s%s%s%s%s(%s)", wrapper, ret_str, klass_desc,
+                                                                  class_method_separator,
+                                                                  method->name, inst_desc ? inst_desc : "", method_sig_space, tmpsig);
                        g_free (ret_str);
                } else {
-                       res = g_strdup_printf ("%s%s:%s%s (%s)", wrapper, klass_desc,
-                                                                  method->name, inst_desc ? inst_desc : "", tmpsig);
+                       res = g_strdup_printf ("%s%s%s%s%s%s(%s)", wrapper, klass_desc,
+                                                                  class_method_separator,
+                                                                  method->name, inst_desc ? inst_desc : "", method_sig_space, tmpsig);
                }
                g_free (tmpsig);
        } else {
-               res = g_strdup_printf ("%s%s:%s%s", wrapper, klass_desc,
+               res = g_strdup_printf ("%s%s%s%s%s", wrapper, klass_desc,
+                                                          class_method_separator,
                                                           method->name, inst_desc ? inst_desc : "");
        }
 
@@ -931,6 +941,17 @@ mono_method_get_full_name (MonoMethod *method)
        return mono_method_get_name_full (method, TRUE, TRUE, MONO_TYPE_NAME_FORMAT_IL);
 }
 
+/**
+ * mono_method_get_reflection_name:
+ *
+ * Returns the name of the method, including signature, using the same formating as reflection.
+ */
+char *
+mono_method_get_reflection_name (MonoMethod *method)
+{
+       return mono_method_get_name_full (method, TRUE, FALSE, MONO_TYPE_NAME_FORMAT_REFLECTION);
+}
+
 static const char*
 print_name_space (MonoClass *klass)
 {
index fa4aa39706002ea1ee7c635ed1aeac7202fba581..a67de5523f0b9813c88ad45e867f9e16d6bbc9ab 100644 (file)
@@ -43,6 +43,7 @@ MONO_API MonoMethod*     mono_method_desc_search_in_class (MonoMethodDesc *desc,
 MONO_API MonoMethod*     mono_method_desc_search_in_image (MonoMethodDesc *desc, MonoImage *image);
 
 MONO_API char*           mono_method_full_name (MonoMethod *method, mono_bool signature);
+MONO_API char*           mono_method_get_reflection_name (MonoMethod *method);
 
 MONO_API char*           mono_field_full_name (MonoClassField *field);
 
index 2b66be22f182a3b0b0289899dd46a4e02fe054bb..255ab56533a5fed56be61fd7ae1476aad2d3726c 100644 (file)
@@ -1911,8 +1911,8 @@ mono_interruption_checkpoint_from_trampoline (void)
 void
 mono_throw_method_access (MonoMethod *caller, MonoMethod *callee)
 {
-       char *caller_name = mono_method_full_name (caller, 1);
-       char *callee_name = mono_method_full_name (callee, 1);
+       char *caller_name = mono_method_get_reflection_name (caller);
+       char *callee_name = mono_method_get_reflection_name (callee);
        MonoError error;
 
        error_init (&error);