X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fdebug-helpers.c;h=baf79f6be9709502aa442df5fe76f9570e73719a;hb=ef0ddf45c3081e799edcb4e95770186514b80cf1;hp=d84e2e82a78d8adbc7156c4134a8e08e10b33bca;hpb=3c2f3d4ea99c758f9de2d3493d25849824678956;p=mono.git diff --git a/mono/metadata/debug-helpers.c b/mono/metadata/debug-helpers.c index d84e2e82a78..baf79f6be97 100644 --- a/mono/metadata/debug-helpers.c +++ b/mono/metadata/debug-helpers.c @@ -5,6 +5,7 @@ * Mono Project (http://www.mono-project.com) * * Copyright (C) 2005-2008 Novell, Inc. (http://www.novell.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include @@ -333,6 +334,7 @@ mono_method_desc_new (const char *name, gboolean include_namespace) MonoMethodDesc *result; char *class_name, *class_nspace, *method_name, *use_args, *end; int use_namespace; + int generic_delim_stack; class_nspace = g_strdup (name); use_args = strchr (class_nspace, '('); @@ -379,8 +381,14 @@ mono_method_desc_new (const char *name, gboolean include_namespace) end = use_args; if (*end) result->num_args = 1; + generic_delim_stack = 0; while (*end) { - if (*end == ',') + if (*end == '<') + generic_delim_stack++; + else if (*end == '>') + generic_delim_stack--; + + if (*end == ',' && generic_delim_stack == 0) result->num_args++; ++end; } @@ -568,13 +576,21 @@ 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, const unsigned char *end) { - MonoMethodHeader *header = mono_method_get_header (method); + MonoError error; + MonoMethodHeader *header = mono_method_get_header_checked (method, &error); const MonoOpcode *opcode; guint32 label, token; gint32 sval; int i; char *tmp; - const unsigned char* il_code = mono_method_header_get_code (header, NULL, NULL); + const unsigned char* il_code; + + if (!header) { + g_string_append_printf (str, "could not disassemble, bad header due to %s", mono_error_get_message (&error)); + mono_error_cleanup (&error); + return end; + } + il_code = mono_method_header_get_code (header, NULL, NULL); label = ip - il_code; if (dh->indenter) { @@ -1120,10 +1136,12 @@ mono_class_describe_statics (MonoClass* klass) void mono_method_print_code (MonoMethod *method) { + MonoError error; char *code; - MonoMethodHeader *header = mono_method_get_header (method); + MonoMethodHeader *header = mono_method_get_header_checked (method, &error); if (!header) { - printf ("METHOD HEADER NOT FOUND\n"); + printf ("METHOD HEADER NOT FOUND DUE TO: %s\n", mono_error_get_message (&error)); + mono_error_cleanup (&error); return; } code = mono_disasm_code (0, method, header->code, header->code + header->code_size);