* RegistryKeyTest.cs: Modified GetValueNamesTest and GetSubKeyNamesTest
[mono.git] / mono / metadata / debug-helpers.c
index f1ca3be7b14519f62487efaab7fa9b0809651d74..712b8023a039a25ff8f7d784e8525f7d0bdfc2a1 100644 (file)
@@ -2,6 +2,7 @@
 #include <string.h>
 #include "mono/metadata/tokentype.h"
 #include "mono/metadata/opcodes.h"
+#include "mono/metadata/class-internals.h"
 #include "mono/metadata/mono-endian.h"
 #include "mono/metadata/debug-helpers.h"
 
@@ -22,13 +23,27 @@ static const char *wrapper_type_names [] = {
        "runtime-invoke",
        "native-to-managed",
        "managed-to-native",
+       "managed-to-managed",
        "remoting-invoke",
        "remoting-invoke-with-check",
+       "xdomain-invoke",
+       "xdomain-dispatch",
        "ldfld",
        "stfld",
+       "ldfld-remote",
+       "stfld-remote",
        "synchronized",
        "dynamic-method",
-       "unknown"
+       "isinst",
+       "cancast",
+       "proxy_isinst",
+       "stelemref",
+       "unbox",
+       "ldflda",
+       "write-barrier",
+       "unknown",
+       "cominterop-invoke",
+       "cominterop"
 };
 
 static void
@@ -102,6 +117,13 @@ mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace) {
        case MONO_TYPE_VALUETYPE:
                append_class_name (res, type->data.klass, include_namespace);
                break;
+       case MONO_TYPE_GENERICINST:
+               mono_type_get_desc (res, &type->data.generic_class->container_class->byval_arg, include_namespace);
+               break;
+       case MONO_TYPE_VAR:
+       case MONO_TYPE_MVAR:
+               g_string_append (res, type->data.generic_param->name);
+               break;
        default:
                break;
        }
@@ -140,10 +162,19 @@ mono_signature_get_desc (MonoMethodSignature *sig, gboolean include_namespace)
        return result;
 }
 
-/*
- * The allowed format of a method description string is:
+/**
+ * mono_method_desc_new:
+ * @name: the method name.
+ * @include_namespace: whether the name includes a namespace or not.
+ *
+ * Creates a method description for @name, which conforms to the following
+ * specification:
+ *
  * [namespace.]classname:methodname[(args...)]
- * TODO: describe instance methods.
+ *
+ * in all the loaded assemblies.
+ *
+ * Returns: a parsed representation of the method description.
  */
 MonoMethodDesc*
 mono_method_desc_new (const char *name, gboolean include_namespace)
@@ -214,6 +245,12 @@ mono_method_desc_from_method (MonoMethod *method)
        return result;
 }
 
+/**
+ * mono_method_desc_free:
+ * @desc: method description to be released
+ *
+ * Releases the MonoMethodDesc object @desc.
+ */
 void
 mono_method_desc_free (MonoMethodDesc *desc)
 {
@@ -235,9 +272,9 @@ mono_method_desc_match (MonoMethodDesc *desc, MonoMethod *method)
                return FALSE;
        if (!desc->args)
                return TRUE;
-       if (desc->num_args != method->signature->param_count)
+       if (desc->num_args != mono_method_signature (method)->param_count)
                return FALSE;
-       sig = mono_signature_get_desc (method->signature, desc->include_namespace);
+       sig = mono_signature_get_desc (mono_method_signature (method), desc->include_namespace);
        if (strcmp (sig, desc->args)) {
                g_free (sig);
                return FALSE;
@@ -259,13 +296,12 @@ mono_method_desc_full_match (MonoMethodDesc *desc, MonoMethod *method)
 MonoMethod*
 mono_method_desc_search_in_class (MonoMethodDesc *desc, MonoClass *klass)
 {
-       int i;
-
-       mono_class_init (klass);
-       for (i = 0; i < klass->method.count; ++i) {
-               if (mono_method_desc_match (desc, klass->methods [i]))
-                       return klass->methods [i];
-       }
+       MonoMethod* m;
+       gpointer iter = NULL;
+       
+       while ((m = mono_class_get_methods (klass, &iter)))
+               if (mono_method_desc_match (desc, m))
+                       return m;
        return NULL;
 }
 
@@ -273,8 +309,8 @@ MonoMethod*
 mono_method_desc_search_in_image (MonoMethodDesc *desc, MonoImage *image)
 {
        MonoClass *klass;
-       MonoTableInfo *tdef;
-       MonoTableInfo *methods;
+       const MonoTableInfo *tdef;
+       const MonoTableInfo *methods;
        MonoMethod *method;
        int i;
 
@@ -285,9 +321,9 @@ mono_method_desc_search_in_image (MonoMethodDesc *desc, MonoImage *image)
                return mono_method_desc_search_in_class (desc, klass);
        }
 
-       tdef = &image->tables [MONO_TABLE_TYPEDEF];
-       methods = &image->tables [MONO_TABLE_METHOD];
-       for (i = 0; i < methods->rows; ++i) {
+       tdef = 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);
                const char *n = mono_metadata_string_heap (image, token);
 
@@ -301,15 +337,17 @@ mono_method_desc_search_in_image (MonoMethodDesc *desc, MonoImage *image)
 }
 
 static const unsigned char*
-dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned char *ip)
+dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned char *ip, const unsigned char *end)
 {
-       MonoMethodHeader *header = ((MonoMethodNormal*)method)->header;
+       MonoMethodHeader *header = mono_method_get_header (method);
        const MonoOpcode *opcode;
-       guint32 i, label, token;
+       guint32 label, token;
        gint32 sval;
+       int i;
        char *tmp;
+       const unsigned char* il_code = mono_method_header_get_code (header, NULL, NULL);
 
-       label = ip - header->code;
+       label = ip - il_code;
        if (dh->indenter) {
                tmp = dh->indenter (dh, method, label);
                g_string_append (str, tmp);
@@ -318,10 +356,10 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
        if (dh->label_format)
                g_string_sprintfa (str, dh->label_format, label);
        
-       i = mono_opcode_value (&ip);
+       i = mono_opcode_value (&ip, end);
        ip++;
        opcode = &mono_opcodes [i];
-       g_string_sprintfa (str, "%-10s", mono_opcode_names [i]);
+       g_string_sprintfa (str, "%-10s", mono_opcode_name (i));
 
        switch (opcode->argument) {
        case MonoInlineNone:
@@ -357,7 +395,7 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
                sval = read32 (ip);
                ip += 4;
                if (dh->label_target)
-                       g_string_sprintfa (str, dh->label_target, ip + sval - header->code);
+                       g_string_sprintfa (str, dh->label_target, ip + sval - il_code);
                else
                        g_string_sprintfa (str, "%d", sval);
                break;
@@ -365,7 +403,7 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
                sval = *(const signed char*)ip;
                ip ++;
                if (dh->label_target)
-                       g_string_sprintfa (str, dh->label_target, ip + sval - header->code);
+                       g_string_sprintfa (str, dh->label_target, ip + sval - il_code);
                else
                        g_string_sprintfa (str, "%d", sval);
                break;
@@ -380,7 +418,7 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
                                g_string_append (str, ", ");
                        label = read32 (ip);
                        if (dh->label_target)
-                               g_string_sprintfa (str, dh->label_target, end + label - header->code);
+                               g_string_sprintfa (str, dh->label_target, end + label - il_code);
                        else
                                g_string_sprintfa (str, "%d", label);
                        ip += 4;
@@ -440,7 +478,8 @@ mono_disasm_code_one (MonoDisHelper *dh, MonoMethod *method, const guchar *ip, c
 
        if (!dh)
                dh = &default_dh;
-       ip = dis_one (res, dh, method, ip);
+       /* set ip + 2 as the end: this is just a debugging method */
+       ip = dis_one (res, dh, method, ip, ip + 2);
        if (endp)
                *endp = ip;
        
@@ -458,7 +497,7 @@ mono_disasm_code (MonoDisHelper *dh, MonoMethod *method, const guchar *ip, const
        if (!dh)
                dh = &default_dh;
        while (ip < end) {
-               ip = dis_one (res, dh, method, ip);
+               ip = dis_one (res, dh, method, ip, end);
        }
        
        result = res->str;
@@ -479,24 +518,25 @@ mono_method_full_name (MonoMethod *method, gboolean signature)
 {
        char *res;
        char wrapper [64];
+       const char *nspace = method->klass->name_space;
 
        if (signature) {
-               char *tmpsig = mono_signature_get_desc (method->signature, TRUE);
+               char *tmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);
 
                if (method->wrapper_type != MONO_WRAPPER_NONE)
                        sprintf (wrapper, "(wrapper %s) ", wrapper_type_to_str (method->wrapper_type));
                else
                        strcpy (wrapper, "");
-               res = g_strdup_printf ("%s%s.%s:%s (%s)", wrapper, method->klass->name_space, 
-                                      method->klass->name, method->name, tmpsig);
+               res = g_strdup_printf ("%s%s%s%s:%s (%s)", wrapper, 
+                                                          nspace, *nspace ? "." : "",
+                                                          method->klass->name, method->name, tmpsig);
                g_free (tmpsig);
        } else {
 
-               res = g_strdup_printf ("%02d %s.%s:%s", method->wrapper_type, method->klass->name_space, 
-                                      method->klass->name, method->name);
+               res = g_strdup_printf ("%02d %s%s%s:%s", method->wrapper_type,
+                                                          nspace, *nspace ? "." : "",
+                                                          method->klass->name, method->name);
        }
 
        return res;
 }
-
-