#include "mono/metadata/appdomain.h"
struct MonoMethodDesc {
- char *namespace;
+ char *name_space;
char *klass;
char *name;
char *args;
append_class_name (res, class->nested_in, include_namespace);
g_string_append_c (res, '/');
}
- if (include_namespace && *(class->name_space))
- g_string_append_printf (res, "%s.", class->name_space);
- g_string_append_printf (res, "%s", class->name);
+ if (include_namespace && *(class->name_space)) {
+ g_string_append (res, class->name_space);
+ g_string_append_c (res, '.');
+ }
+ g_string_append (res, class->name);
}
static MonoClass*
case MONO_TYPE_VAR:
case MONO_TYPE_MVAR:
if (type->data.generic_param) {
- MonoGenericParamInfo *info = mono_generic_param_info (type->data.generic_param);
- if (info)
- g_string_append (res, info->name);
+ const char *name = mono_generic_param_name (type->data.generic_param);
+ if (name)
+ g_string_append (res, name);
else
g_string_append_printf (res, "%s%d", type->type == MONO_TYPE_VAR ? "!" : "!!", mono_generic_param_num (type->data.generic_param));
} else {
result->include_namespace = include_namespace;
result->name = method_name;
result->klass = class_name;
- result->namespace = use_namespace? class_nspace: NULL;
+ result->name_space = use_namespace? class_nspace: NULL;
result->args = use_args? use_args: NULL;
if (strstr (result->name, "*"))
result->name_glob = TRUE;
result->include_namespace = TRUE;
result->name = g_strdup (method->name);
result->klass = g_strdup (method->klass->name);
- result->namespace = g_strdup (method->klass->name_space);
+ result->name_space = g_strdup (method->klass->name_space);
return result;
}
void
mono_method_desc_free (MonoMethodDesc *desc)
{
- if (desc->namespace)
- g_free (desc->namespace);
+ if (desc->name_space)
+ g_free (desc->name_space);
else if (desc->klass)
g_free (desc->klass);
g_free (desc);
if (!p) {
if (strncmp (desc->klass, klass->name, pos))
return FALSE;
- if (desc->namespace && strcmp (desc->namespace, klass->name_space))
+ if (desc->name_space && strcmp (desc->name_space, klass->name_space))
return FALSE;
return TRUE;
}
gboolean
mono_method_desc_full_match (MonoMethodDesc *desc, MonoMethod *method)
{
+ if (!desc->klass)
+ return FALSE;
if (!match_class (desc, strlen (desc->klass), method->klass))
return FALSE;
mono_method_desc_search_in_image (MonoMethodDesc *desc, MonoImage *image)
{
MonoClass *klass;
- const MonoTableInfo *tdef;
const MonoTableInfo *methods;
MonoMethod *method;
int i;
/* Handle short names for system classes */
- if (!desc->namespace && image == mono_defaults.corlib) {
+ if (!desc->name_space && image == mono_defaults.corlib) {
klass = find_system_class (desc->klass);
if (klass)
return mono_method_desc_search_in_class (desc, klass);
}
- if (desc->namespace && desc->klass) {
- klass = mono_class_from_name (image, desc->namespace, desc->klass);
+ if (desc->name_space && desc->klass) {
+ klass = mono_class_from_name (image, desc->name_space, desc->klass);
if (!klass)
return NULL;
return mono_method_desc_search_in_class (desc, klass);
}
- tdef = mono_image_get_table_info (image, MONO_TABLE_TYPEDEF);
+ /* FIXME: Is this call necessary? We don't use its result. */
+ 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);
size_t len2;
char *blob2 = NULL;
- if (!method->klass->image->dynamic) {
+ if (!image_is_dynamic (method->klass->image) && !method_is_dynamic (method)) {
token = read32 (ip);
blob = mono_metadata_user_string (method->klass->image, mono_metadata_token_index (token));
}
char *
-mono_method_full_name (MonoMethod *method, gboolean signature)
+mono_method_get_name_full (MonoMethod *method, gboolean signature, MonoTypeNameFormat format)
{
char *res;
char wrapper [64];
- char *klass_desc = mono_type_full_name (&method->klass->byval_arg);
+ char *klass_desc;
char *inst_desc = NULL;
+ if (format == MONO_TYPE_NAME_FORMAT_IL)
+ klass_desc = mono_type_full_name (&method->klass->byval_arg);
+ else
+ klass_desc = mono_type_get_name_full (&method->klass->byval_arg, format);
+
if (method->is_inflated && ((MonoMethodInflated*)method)->context.method_inst) {
GString *str = g_string_new ("");
- g_string_append (str, "<");
+ if (format == MONO_TYPE_NAME_FORMAT_IL)
+ g_string_append (str, "<");
+ else
+ g_string_append (str, "[");
ginst_get_desc (str, ((MonoMethodInflated*)method)->context.method_inst);
- g_string_append (str, ">");
+ if (format == MONO_TYPE_NAME_FORMAT_IL)
+ g_string_append_c (str, '>');
+ else
+ g_string_append_c (str, ']');
inst_desc = str->str;
g_string_free (str, FALSE);
MonoGenericContainer *container = mono_method_get_generic_container (method);
GString *str = g_string_new ("");
- g_string_append (str, "<");
+ if (format == MONO_TYPE_NAME_FORMAT_IL)
+ g_string_append (str, "<");
+ else
+ g_string_append (str, "[");
ginst_get_desc (str, container->context.method_inst);
- g_string_append (str, ">");
+ if (format == MONO_TYPE_NAME_FORMAT_IL)
+ g_string_append_c (str, '>');
+ else
+ g_string_append_c (str, ']');
inst_desc = str->str;
g_string_free (str, FALSE);
return res;
}
+char *
+mono_method_full_name (MonoMethod *method, gboolean signature)
+{
+ return mono_method_get_name_full (method, signature, MONO_TYPE_NAME_FORMAT_IL);
+}
+
static const char*
print_name_space (MonoClass *klass)
{
}
}
}
+
+/**
+ * mono_print_method_code
+ * @MonoMethod: a pointer to the method
+ *
+ * This method is used from a debugger to print the code of the method.
+ *
+ * This prints the IL code of the method in the standard output.
+ */
+void
+mono_method_print_code (MonoMethod *method)
+{
+ char *code;
+ MonoMethodHeader *header = mono_method_get_header (method);
+ if (!header) {
+ printf ("METHOD HEADER NOT FOUND\n");
+ return;
+ }
+ code = mono_disasm_code (0, method, header->code, header->code + header->code_size);
+ printf ("CODE FOR %s:\n%s\n", mono_method_full_name (method, TRUE), code);
+ g_free (code);
+}