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
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);
g_string_append (res, "<unknown>");
}
break;
+ case MONO_TYPE_TYPEDBYREF:
+ g_string_append (res, "typedbyref");
+ break;
default:
break;
}
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*
{
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)
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:
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;
const char *blob;
char *s;
size_t len2;
+ char *blob2 = NULL;
if (!method->klass->image->dynamic) {
token = read32 (ip);
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;
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, ')');
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:
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) {