gboolean include_namespace;
};
+static const char *wrapper_type_names [] = {
+ "none",
+ "delegate-invoke",
+ "delegate-begin-invoke",
+ "delegate-end-invoke",
+ "runtime-invoke",
+ "native-to-managed",
+ "managed-to-native",
+ "remoting-invoke",
+ "remoting-invoke-with-check",
+ "ldfld",
+ "stfld",
+ "synchronized",
+ "dynamic-method",
+ "unknown"
+};
+
+static void
+append_class_name (GString *res, MonoClass *class, gboolean include_namespace)
+{
+ if (!class) {
+ g_string_append (res, "Unknown");
+ return;
+ }
+ if (class->nested_in) {
+ append_class_name (res, class->nested_in, 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);
+}
+
void
mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace) {
switch (type->type) {
g_string_append_c (res, '*');
break;
case MONO_TYPE_ARRAY:
- mono_type_get_desc (res, type->data.array->type, include_namespace);
+ append_class_name (res, type->data.array->eklass, include_namespace);
g_string_sprintfa (res, "[%d]", type->data.array->rank);
break;
case MONO_TYPE_SZARRAY:
- mono_type_get_desc (res, type->data.type, include_namespace);
+ mono_type_get_desc (res, &type->data.klass->byval_arg, include_namespace);
g_string_append (res, "[]");
break;
case MONO_TYPE_CLASS:
- case MONO_TYPE_VALUETYPE: {
- MonoClass *class = type->data.klass;
- if (!class) {
- g_string_append (res, "Unknown");
- break;
- }
- if (include_namespace && *(class->name_space))
- g_string_sprintfa (res, "%s.", class->name_space);
- g_string_sprintfa (res, "%s", class->name);
+ case MONO_TYPE_VALUETYPE:
+ append_class_name (res, type->data.klass, include_namespace);
break;
- }
default:
break;
}
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)
{
while (*end) {
if (*end == ',')
result->num_args++;
+ ++end;
}
}
return result;
}
+static const char*
+wrapper_type_to_str (guint32 wrapper_type)
+{
+ g_assert (wrapper_type < sizeof (wrapper_type_names) / sizeof (char*));
+
+ return wrapper_type_names [wrapper_type];
+}
+
char *
mono_method_full_name (MonoMethod *method, gboolean signature)
{
char *res;
+ char wrapper [64];
+ char *nspace;
+
+ nspace = method->klass->name_space;
if (signature) {
char *tmpsig = mono_signature_get_desc (method->signature, TRUE);
- res = g_strdup_printf ("%02d %s.%s:%s (%s)", method->wrapper_type, method->klass->name_space,
- method->klass->name, method->name, tmpsig);
+ 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 (%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;