2010-01-18 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / metadata / debug-helpers.c
index 5f6d509290fabdaf29c4ad1ee0bd64bef282fe3d..87f336b9194e5c7a483bd0deaa2104d4574efcd7 100644 (file)
@@ -82,8 +82,8 @@ append_class_name (GString *res, MonoClass *class, gboolean include_namespace)
                g_string_append_c (res, '/');
        }
        if (include_namespace && *(class->name_space))
-               g_string_sprintfa (res, "%s.", class->name_space);
-       g_string_sprintfa (res, "%s", class->name);
+               g_string_append_printf (res, "%s.", class->name_space);
+       g_string_append_printf (res, "%s", class->name);
 }
 
 void
@@ -134,7 +134,7 @@ mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace)
                break;
        case MONO_TYPE_ARRAY:
                mono_type_get_desc (res, &type->data.array->eklass->byval_arg, include_namespace);
-               g_string_sprintfa (res, "[%d]", type->data.array->rank);
+               g_string_append_printf (res, "[%d]", type->data.array->rank);
                break;
        case MONO_TYPE_SZARRAY:
                mono_type_get_desc (res, &type->data.klass->byval_arg, include_namespace);
@@ -181,6 +181,9 @@ mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace)
                        g_string_append (res, "<unknown>");
                }
                break;
+       case MONO_TYPE_TYPEDBYREF:
+               g_string_append (res, "typedbyref");
+               break;
        default:
                break;
        }
@@ -192,14 +195,10 @@ 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;
+       return g_string_free (str, FALSE);
 }
 
 char*
@@ -207,7 +206,12 @@ mono_signature_get_desc (MonoMethodSignature *sig, gboolean include_namespace)
 {
        int i;
        char *result;
-       GString *res = g_string_new ("");
+       GString *res;
+
+       if (!sig)
+               return g_strdup ("<invalid signature>");
+
+       res = g_string_new ("");
 
        for (i = 0; i < sig->param_count; ++i) {
                if (i > 0)
@@ -502,12 +506,12 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
                g_free (tmp);
        }
        if (dh->label_format)
-               g_string_sprintfa (str, dh->label_format, label);
+               g_string_append_printf (str, dh->label_format, label);
        
        i = mono_opcode_value (&ip, end);
        ip++;
        opcode = &mono_opcodes [i];
-       g_string_sprintfa (str, "%-10s", mono_opcode_name (i));
+       g_string_append_printf (str, "%-10s", mono_opcode_name (i));
 
        switch (opcode->argument) {
        case MonoInlineNone:
@@ -523,7 +527,7 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
                        g_string_append (str, tmp);
                        g_free (tmp);
                } else {
-                       g_string_sprintfa (str, "0x%08x", token);
+                       g_string_append_printf (str, "0x%08x", token);
                }
                ip += 4;
                break;
@@ -531,6 +535,7 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
                const char *blob;
                char *s;
                size_t len2;
+               char *blob2 = NULL;
 
                if (!method->klass->image->dynamic) {
                        token = read32 (ip);
@@ -539,49 +544,59 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
                        len2 = mono_metadata_decode_blob_size (blob, &blob);
                        len2 >>= 1;
 
+#ifdef NO_UNALIGNED_ACCESS
+                       /* The blob might not be 2 byte aligned */
+                       blob2 = g_malloc ((len2 * 2) + 1);
+                       memcpy (blob2, blob, len2 * 2);
+#else
+                       blob2 = (char*)blob;
+#endif
+
 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
                        {
-                               guint16 *buf = g_new (guint16, len2);
+                               guint16 *buf = g_new (guint16, len2 + 1);
                                int i;
 
                                for (i = 0; i < len2; ++i)
-                                       buf [i] = GUINT16_FROM_LE (((guint16*)blob) [i]);
+                                       buf [i] = GUINT16_FROM_LE (((guint16*)blob2) [i]);
                                s = g_utf16_to_utf8 (buf, len2, NULL, NULL, NULL);
                                g_free (buf);
                        }
 #else
-                               s = g_utf16_to_utf8 ((gunichar2*)blob, len2, NULL, NULL, NULL);
+                               s = g_utf16_to_utf8 ((gunichar2*)blob2, len2, NULL, NULL, NULL);
 #endif
 
-                       g_string_sprintfa (str, "\"%s\"", s);
+                       g_string_append_printf (str, "\"%s\"", s);
                        g_free (s);
+                       if (blob != blob2)
+                               g_free (blob2);
                }
                ip += 4;
                break;
        }
        case MonoInlineVar:
-               g_string_sprintfa (str, "%d", read16 (ip));
+               g_string_append_printf (str, "%d", read16 (ip));
                ip += 2;
                break;
        case MonoShortInlineVar:
-               g_string_sprintfa (str, "%d", (*ip));
+               g_string_append_printf (str, "%d", (*ip));
                ip ++;
                break;
        case MonoInlineBrTarget:
                sval = read32 (ip);
                ip += 4;
                if (dh->label_target)
-                       g_string_sprintfa (str, dh->label_target, ip + sval - il_code);
+                       g_string_append_printf (str, dh->label_target, ip + sval - il_code);
                else
-                       g_string_sprintfa (str, "%d", sval);
+                       g_string_append_printf (str, "%d", sval);
                break;
        case MonoShortInlineBrTarget:
                sval = *(const signed char*)ip;
                ip ++;
                if (dh->label_target)
-                       g_string_sprintfa (str, dh->label_target, ip + sval - il_code);
+                       g_string_append_printf (str, dh->label_target, ip + sval - il_code);
                else
-                       g_string_sprintfa (str, "%d", sval);
+                       g_string_append_printf (str, "%d", sval);
                break;
        case MonoInlineSwitch: {
                const unsigned char *end;
@@ -594,9 +609,9 @@ 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 - il_code);
+                               g_string_append_printf (str, dh->label_target, end + label - il_code);
                        else
-                               g_string_sprintfa (str, "%d", label);
+                               g_string_append_printf (str, "%d", label);
                        ip += 4;
                }
                g_string_append_c (str, ')');
@@ -605,23 +620,23 @@ dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned cha
        case MonoInlineR: {
                double r;
                readr8 (ip, &r);
-               g_string_sprintfa (str, "%g", r);
+               g_string_append_printf (str, "%g", r);
                ip += 8;
                break;
        }
        case MonoShortInlineR: {
                float r;
                readr4 (ip, &r);
-               g_string_sprintfa (str, "%g", r);
+               g_string_append_printf (str, "%g", r);
                ip += 4;
                break;
        }
        case MonoInlineI:
-               g_string_sprintfa (str, "%d", (gint32)read32 (ip));
+               g_string_append_printf (str, "%d", (gint32)read32 (ip));
                ip += 4;
                break;
        case MonoShortInlineI:
-               g_string_sprintfa (str, "%d", *(const signed char*)ip);
+               g_string_append_printf (str, "%d", *(const signed char*)ip);
                ip ++;
                break;
        case MonoInlineI8:
@@ -752,11 +767,11 @@ print_name_space (MonoClass *klass)
 {
        if (klass->nested_in) {
                print_name_space (klass->nested_in);
-               g_print (klass->nested_in->name);
+               g_print ("%s", klass->nested_in->name);
                return "/";
        }
        if (klass->name_space [0]) {
-               g_print (klass->name_space);
+               g_print ("%s", klass->name_space);
                return ".";
        }
        return "";
@@ -946,8 +961,12 @@ mono_class_describe_statics (MonoClass* klass)
        MonoClassField *field;
        MonoClass *p;
        const char *field_ptr;
-       const char *addr = mono_class_vtable (mono_domain_get (), klass)->data;
-       if (!addr)
+       MonoVTable *vtable = mono_class_vtable_full (mono_domain_get (), klass, FALSE);
+       const char *addr;
+
+       if (!vtable)
+               return;
+       if (!(addr = vtable->data))
                return;
 
        for (p = klass; p != NULL; p = p->parent) {