2005-07-05 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / metadata / debug-helpers.c
index 1d2268239eae87a8fdb78c7f272355b54a2518a3..010c49b72e7d650ca6ab1851005e20d0457035a2 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"
 
@@ -24,9 +25,19 @@ static const char *wrapper_type_names [] = {
        "managed-to-native",
        "remoting-invoke",
        "remoting-invoke-with-check",
+       "xdomain-invoke",
+       "xdomain-dispatch",
        "ldfld",
        "stfld",
+       "ldfld-remote",
+       "stfld-remote",
        "synchronized",
+       "dynamic-method",
+       "isinst",
+       "cancast",
+       "proxy_isinst",
+       "stelemref",
+       "unbox",
        "unknown"
 };
 
@@ -101,6 +112,9 @@ 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;
        default:
                break;
        }
@@ -108,6 +122,20 @@ mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace) {
                g_string_append_c (res, '&');
 }
 
+char*
+mono_type_full_name (MonoType *type)
+{
+       GString *str;
+       char *res;
+
+       str = g_string_new ("");
+       mono_type_get_desc (str, type, TRUE);
+
+       res = g_strdup (str->str);
+       g_string_free (str, TRUE);
+       return res;
+}
+
 char*
 mono_signature_get_desc (MonoMethodSignature *sig, gboolean include_namespace)
 {
@@ -125,10 +153,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)
@@ -199,6 +236,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)
 {
@@ -220,9 +263,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;
@@ -244,13 +287,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;
 }
 
@@ -258,8 +300,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;
 
@@ -270,9 +312,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);
 
@@ -286,9 +328,9 @@ 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;
        gint32 sval;
@@ -303,10 +345,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:
@@ -425,7 +467,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;
        
@@ -443,7 +486,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;
@@ -464,24 +507,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
-                       sprintf (wrapper, "");
-               res = g_strdup_printf ("%s%s.%s:%s (%s)", wrapper, method->klass->name_space, 
-                                      method->klass->name, method->name, tmpsig);
+                       strcpy (wrapper, "");
+               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;
 }
-
-