Merge pull request #2005 from BrzVlad/feature-concurrent-work
[mono.git] / mono / metadata / debug-helpers.c
index a20e8ae06e03a9ade8d5e64419f4d0a4b9122220..e8acbe99d1cfc46f07fdd46247b42c996ca15d57 100644 (file)
@@ -19,7 +19,7 @@
 #include "mono/metadata/appdomain.h"
 
 struct MonoMethodDesc {
-       char *namespace;
+       char *name_space;
        char *klass;
        char *name;
        char *args;
@@ -82,9 +82,11 @@ append_class_name (GString *res, MonoClass *class, gboolean include_namespace)
                append_class_name (res, class->nested_in, include_namespace);
                g_string_append_c (res, '/');
        }
-       if (include_namespace && *(class->name_space))
-               g_string_append_printf (res, "%s.", class->name_space);
-       g_string_append_printf (res, "%s", class->name);
+       if (include_namespace && *(class->name_space)) {
+               g_string_append (res, class->name_space);
+               g_string_append_c (res, '.');
+       }
+       g_string_append (res, class->name);
 }
 
 static MonoClass*
@@ -198,9 +200,9 @@ mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace)
        case MONO_TYPE_VAR:
        case MONO_TYPE_MVAR:
                if (type->data.generic_param) {
-                       MonoGenericParamInfo *info = mono_generic_param_info (type->data.generic_param);
-                       if (info)
-                               g_string_append (res, info->name);
+                       const char *name = mono_generic_param_name (type->data.generic_param);
+                       if (name)
+                               g_string_append (res, name);
                        else
                                g_string_append_printf (res, "%s%d", type->type == MONO_TYPE_VAR ? "!" : "!!", mono_generic_param_num (type->data.generic_param));
                } else {
@@ -342,7 +344,7 @@ mono_method_desc_new (const char *name, gboolean include_namespace)
        result->include_namespace = include_namespace;
        result->name = method_name;
        result->klass = class_name;
-       result->namespace = use_namespace? class_nspace: NULL;
+       result->name_space = use_namespace? class_nspace: NULL;
        result->args = use_args? use_args: NULL;
        if (strstr (result->name, "*"))
                result->name_glob = TRUE;
@@ -371,7 +373,7 @@ mono_method_desc_from_method (MonoMethod *method)
        result->include_namespace = TRUE;
        result->name = g_strdup (method->name);
        result->klass = g_strdup (method->klass->name);
-       result->namespace = g_strdup (method->klass->name_space);
+       result->name_space = g_strdup (method->klass->name_space);
 
        return result;
 }
@@ -385,8 +387,8 @@ mono_method_desc_from_method (MonoMethod *method)
 void
 mono_method_desc_free (MonoMethodDesc *desc)
 {
-       if (desc->namespace)
-               g_free (desc->namespace);
+       if (desc->name_space)
+               g_free (desc->name_space);
        else if (desc->klass)
                g_free (desc->klass);
        g_free (desc);
@@ -452,7 +454,7 @@ match_class (MonoMethodDesc *desc, int pos, MonoClass *klass)
        if (!p) {
                if (strncmp (desc->klass, klass->name, pos))
                        return FALSE;
-               if (desc->namespace && strcmp (desc->namespace, klass->name_space))
+               if (desc->name_space && strcmp (desc->name_space, klass->name_space))
                        return FALSE;
                return TRUE;
        }
@@ -492,26 +494,26 @@ MonoMethod*
 mono_method_desc_search_in_image (MonoMethodDesc *desc, MonoImage *image)
 {
        MonoClass *klass;
-       const MonoTableInfo *tdef;
        const MonoTableInfo *methods;
        MonoMethod *method;
        int i;
 
        /* Handle short names for system classes */
-       if (!desc->namespace && image == mono_defaults.corlib) {
+       if (!desc->name_space && image == mono_defaults.corlib) {
                klass = find_system_class (desc->klass);
                if (klass)
                        return mono_method_desc_search_in_class (desc, klass);
        }
 
-       if (desc->namespace && desc->klass) {
-               klass = mono_class_from_name (image, desc->namespace, desc->klass);
+       if (desc->name_space && desc->klass) {
+               klass = mono_class_from_name (image, desc->name_space, desc->klass);
                if (!klass)
                        return NULL;
                return mono_method_desc_search_in_class (desc, klass);
        }
 
-       tdef = mono_image_get_table_info (image, MONO_TABLE_TYPEDEF);
+       /* FIXME: Is this call necessary?  We don't use its result. */
+       mono_image_get_table_info (image, MONO_TABLE_TYPEDEF);
        methods = mono_image_get_table_info (image, MONO_TABLE_METHOD);
        for (i = 0; i < mono_table_info_get_rows (methods); ++i) {
                guint32 token = mono_metadata_decode_row_col (methods, i, MONO_METHOD_NAME);
@@ -575,7 +577,7 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
                size_t len2;
                char *blob2 = NULL;
 
-               if (!method->klass->image->dynamic) {
+               if (!image_is_dynamic (method->klass->image) && !method_is_dynamic (method)) {
                        token = read32 (ip);
                        blob = mono_metadata_user_string (method->klass->image, mono_metadata_token_index (token));
 
@@ -748,18 +750,29 @@ mono_field_full_name (MonoClassField *field)
 }
 
 char *
-mono_method_full_name (MonoMethod *method, gboolean signature)
+mono_method_get_name_full (MonoMethod *method, gboolean signature, MonoTypeNameFormat format)
 {
        char *res;
        char wrapper [64];
-       char *klass_desc = mono_type_full_name (&method->klass->byval_arg);
+       char *klass_desc;
        char *inst_desc = NULL;
 
+       if (format == MONO_TYPE_NAME_FORMAT_IL)
+               klass_desc = mono_type_full_name (&method->klass->byval_arg);
+       else
+               klass_desc = mono_type_get_name_full (&method->klass->byval_arg, format);
+
        if (method->is_inflated && ((MonoMethodInflated*)method)->context.method_inst) {
                GString *str = g_string_new ("");
-               g_string_append (str, "<");
+               if (format == MONO_TYPE_NAME_FORMAT_IL)
+                       g_string_append (str, "<");
+               else
+                       g_string_append (str, "[");
                ginst_get_desc (str, ((MonoMethodInflated*)method)->context.method_inst);
-               g_string_append (str, ">");
+               if (format == MONO_TYPE_NAME_FORMAT_IL)
+                       g_string_append_c (str, '>');
+               else
+                       g_string_append_c (str, ']');
 
                inst_desc = str->str;
                g_string_free (str, FALSE);
@@ -767,9 +780,15 @@ mono_method_full_name (MonoMethod *method, gboolean signature)
                MonoGenericContainer *container = mono_method_get_generic_container (method);
 
                GString *str = g_string_new ("");
-               g_string_append (str, "<");
+               if (format == MONO_TYPE_NAME_FORMAT_IL)
+                       g_string_append (str, "<");
+               else
+                       g_string_append (str, "[");
                ginst_get_desc (str, container->context.method_inst);
-               g_string_append (str, ">");
+               if (format == MONO_TYPE_NAME_FORMAT_IL)
+                       g_string_append_c (str, '>');
+               else
+                       g_string_append_c (str, ']');
 
                inst_desc = str->str;
                g_string_free (str, FALSE);
@@ -801,6 +820,12 @@ mono_method_full_name (MonoMethod *method, gboolean signature)
        return res;
 }
 
+char *
+mono_method_full_name (MonoMethod *method, gboolean signature)
+{
+       return mono_method_get_name_full (method, signature, MONO_TYPE_NAME_FORMAT_IL);
+}
+
 static const char*
 print_name_space (MonoClass *klass)
 {
@@ -1022,3 +1047,25 @@ mono_class_describe_statics (MonoClass* klass)
                }
        }
 }
+
+/**
+ * mono_print_method_code
+ * @MonoMethod: a pointer to the method
+ *
+ * This method is used from a debugger to print the code of the method.
+ *
+ * This prints the IL code of the method in the standard output.
+ */
+void
+mono_method_print_code (MonoMethod *method)
+{
+       char *code;
+       MonoMethodHeader *header = mono_method_get_header (method);
+       if (!header) {
+               printf ("METHOD HEADER NOT FOUND\n");
+               return;
+       }
+       code = mono_disasm_code (0, method, header->code, header->code + header->code_size);
+       printf ("CODE FOR %s:\n%s\n", mono_method_full_name (method, TRUE), code);
+       g_free (code);
+}