Index: cp-support.h =================================================================== RCS file: /cvs/src/src/gdb/cp-support.h,v retrieving revision 1.13 diff -u -p -r1.13 cp-support.h --- cp-support.h 2 Feb 2004 20:44:52 -0000 1.13 +++ cp-support.h 5 Jul 2004 20:19:25 -0000 @@ -52,7 +52,7 @@ struct using_direct /* Functions from cp-support.c. */ -extern char *class_name_from_physname (const char *physname); +extern char *cp_class_name_from_physname (const char *physname); extern char *method_name_from_physname (const char *physname); Index: language.h =================================================================== RCS file: /cvs/src/src/gdb/language.h,v retrieving revision 1.26 diff -u -p -r1.26 language.h --- language.h 10 Apr 2004 22:10:01 -0000 1.26 +++ language.h 5 Jul 2004 20:19:25 -0000 @@ -247,6 +247,9 @@ struct language_defn /* Return demangled language symbol, or NULL. */ char *(*la_demangle) (const char *mangled, int options); + /* Return class name of a mangled method name or NULL. */ + char *(*la_class_name_from_physname) (const char *physname); + /* Base 2 (binary) formats. */ struct language_format_info la_binary_format; @@ -516,6 +519,10 @@ extern CORE_ADDR skip_language_trampolin extern char *language_demangle (const struct language_defn *current_language, const char *mangled, int options); +/* Return class name from physname, or NULL. */ +extern char *language_class_name_from_physname (const struct language_defn *, + const char *physname); + /* Splitting strings into words. */ extern char *default_word_break_characters (void); Index: ada-lang.c =================================================================== RCS file: /cvs/src/src/gdb/ada-lang.c,v retrieving revision 1.46 diff -u -p -r1.46 ada-lang.c --- ada-lang.c 1 Jul 2004 10:30:57 -0000 1.46 +++ ada-lang.c 5 Jul 2004 20:19:25 -0000 @@ -10144,6 +10144,7 @@ const struct language_defn ada_language_ ada_lookup_symbol_nonlocal, /* Looking up non-local symbols. */ basic_lookup_transparent_type, /* lookup_transparent_type */ ada_la_decode, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ #if 0 {"8#%lo#", "8#", "o", "#"}, /* Octal format info */ Index: c-lang.c =================================================================== RCS file: /cvs/src/src/gdb/c-lang.c,v retrieving revision 1.27 diff -u -p -r1.27 c-lang.c --- c-lang.c 10 Apr 2004 22:10:00 -0000 1.27 +++ c-lang.c 5 Jul 2004 20:19:25 -0000 @@ -559,6 +559,7 @@ const struct language_defn c_language_de basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -618,6 +619,7 @@ const struct language_defn cplus_languag cp_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ cp_lookup_transparent_type, /* lookup_transparent_type */ cplus_demangle, /* Language specific symbol demangler */ + cp_class_name_from_physname, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -654,6 +656,7 @@ const struct language_defn asm_language_ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -695,6 +698,7 @@ const struct language_defn minimal_langu basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: cp-support.c =================================================================== RCS file: /cvs/src/src/gdb/cp-support.c,v retrieving revision 1.12 diff -u -p -r1.12 cp-support.c --- cp-support.c 2 Feb 2004 20:44:52 -0000 1.12 +++ cp-support.c 5 Jul 2004 20:19:25 -0000 @@ -148,7 +148,7 @@ find_last_component (const char *name) /* Return the name of the class containing method PHYSNAME. */ char * -class_name_from_physname (const char *physname) +cp_class_name_from_physname (const char *physname) { char *ret = NULL; const char *end; Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.155 diff -u -p -r1.155 dwarf2read.c --- dwarf2read.c 24 Jun 2004 20:42:42 -0000 1.155 +++ dwarf2read.c 5 Jul 2004 20:19:25 -0000 @@ -1840,7 +1840,8 @@ guess_structure_name (struct partial_die if (child_pdi->tag == DW_TAG_subprogram) { char *actual_class_name - = class_name_from_physname (child_pdi->name); + = language_class_name_from_physname (cu->language_defn, + child_pdi->name); if (actual_class_name != NULL) { struct_pdi->name @@ -3557,7 +3558,9 @@ determine_class_name (struct die_info *d { if (child->tag == DW_TAG_subprogram) { - new_prefix = class_name_from_physname (dwarf2_linkage_name + new_prefix + = language_class_name_from_physname (cu->language_defn, + dwarf2_linkage_name (child, cu)); if (new_prefix != NULL) Index: f-lang.c =================================================================== RCS file: /cvs/src/src/gdb/f-lang.c,v retrieving revision 1.23 diff -u -p -r1.23 f-lang.c --- f-lang.c 10 Apr 2004 22:10:00 -0000 1.23 +++ f-lang.c 5 Jul 2004 20:19:25 -0000 @@ -478,6 +478,7 @@ const struct language_defn f_language_de basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%o", "0", "o", ""}, /* Octal format info */ {"%d", "", "d", ""}, /* Decimal format info */ Index: jv-lang.c =================================================================== RCS file: /cvs/src/src/gdb/jv-lang.c,v retrieving revision 1.30 diff -u -p -r1.30 jv-lang.c --- jv-lang.c 10 Apr 2004 22:10:00 -0000 1.30 +++ jv-lang.c 5 Jul 2004 20:19:26 -0000 @@ -62,6 +62,8 @@ static struct value *java_value_string ( static void java_emit_char (int c, struct ui_file * stream, int quoter); +static char *java_class_name_from_physname (const char *physname); + /* This objfile contains symtabs that have been dynamically created to record dynamically loaded Java classes and dynamically compiled java methods. */ @@ -975,6 +977,73 @@ static char *java_demangle (const char * return cplus_demangle (mangled, options | DMGL_JAVA); } +/* Find the member function name of the demangled name NAME. NAME + must be a method name including arguments, in order to correctly + locate the last component. + + This function return a pointer to the first dot before the + member function name, or NULL if the name was not of the + expected form. */ + +static const char * +find_member_function_name (const char *name) +{ + const char *p; + int depth; + + /* Functions can have local classes, so we need to find the + beginning of the last argument list, not the end of the first + one. */ + p = name + strlen (name) - 1; + while (p > name && *p != ')') + p--; + + if (p == name) + return NULL; + + /* P now points at the `)' at the end of the argument list. Walk + back to the beginning. */ + p--; + depth = 1; + while (p > name && *p != '(') + p--; + + if (p == name) + return NULL; + + while (p > name && *p != '.') + p--; + + if (p == name) + return NULL; + + return p; +} + +/* Return the name of the class containing method PHYSNAME. */ + +static char * +java_class_name_from_physname (const char *physname) +{ + char *ret = NULL; + const char *end; + int depth = 0; + char *demangled_name = java_demangle (physname, DMGL_PARAMS | DMGL_ANSI); + + if (demangled_name == NULL) + return NULL; + + end = find_member_function_name (demangled_name); + if (end != NULL) + { + ret = xmalloc (end - demangled_name + 1); + memcpy (ret, demangled_name, end - demangled_name); + ret[end - demangled_name] = '\0'; + } + + xfree (demangled_name); + return ret; +} /* Table mapping opcodes into strings for printing operators and precedences of the operators. */ @@ -1049,6 +1118,7 @@ const struct language_defn java_language basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ java_demangle, /* Language specific symbol demangler */ + java_class_name_from_physname,/* Language specific class name */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: language.c =================================================================== RCS file: /cvs/src/src/gdb/language.c,v retrieving revision 1.44 diff -u -p -r1.44 language.c --- language.c 10 Apr 2004 22:10:00 -0000 1.44 +++ language.c 5 Jul 2004 20:19:26 -0000 @@ -1176,6 +1176,16 @@ language_demangle (const struct language return NULL; } +/* Return class name from physname or NULL. */ +char * +language_class_name_from_physname (const struct language_defn *current_language, + const char *physname) +{ + if (current_language != NULL && current_language->la_class_name_from_physname) + return current_language->la_class_name_from_physname (physname); + return NULL; +} + /* Return the default string containing the list of characters delimiting words. This is a reasonable default value that most languages should be able to use. */ @@ -1258,6 +1268,10 @@ static char *unk_lang_demangle (const ch return cplus_demangle (mangled, options); } +static char *unk_lang_class_name (const char *mangled) +{ + return NULL; +} static struct type **const (unknown_builtin_types[]) = { @@ -1292,6 +1306,7 @@ const struct language_defn unknown_langu basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ + unk_lang_class_name, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -1329,6 +1344,7 @@ const struct language_defn auto_language basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ + unk_lang_class_name, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -1365,6 +1381,7 @@ const struct language_defn local_languag basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ + unk_lang_class_name, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: m2-lang.c =================================================================== RCS file: /cvs/src/src/gdb/m2-lang.c,v retrieving revision 1.16 diff -u -p -r1.16 m2-lang.c --- m2-lang.c 10 Apr 2004 22:10:01 -0000 1.16 +++ m2-lang.c 5 Jul 2004 20:19:26 -0000 @@ -431,6 +431,7 @@ const struct language_defn m2_language_d basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"%loB", "", "o", "B"}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: objc-lang.c =================================================================== RCS file: /cvs/src/src/gdb/objc-lang.c,v retrieving revision 1.35 diff -u -p -r1.35 objc-lang.c --- objc-lang.c 10 Apr 2004 22:10:01 -0000 1.35 +++ objc-lang.c 5 Jul 2004 20:19:26 -0000 @@ -675,6 +675,7 @@ const struct language_defn objc_language basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ objc_demangle, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: p-lang.c =================================================================== RCS file: /cvs/src/src/gdb/p-lang.c,v retrieving revision 1.18 diff -u -p -r1.18 p-lang.c --- p-lang.c 10 Apr 2004 22:09:59 -0000 1.18 +++ p-lang.c 5 Jul 2004 20:19:26 -0000 @@ -467,6 +467,7 @@ const struct language_defn pascal_langua basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "%", "b", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ Index: scm-lang.c =================================================================== RCS file: /cvs/src/src/gdb/scm-lang.c,v retrieving revision 1.23 diff -u -p -r1.23 scm-lang.c --- scm-lang.c 10 Apr 2004 22:10:01 -0000 1.23 +++ scm-lang.c 5 Jul 2004 20:19:26 -0000 @@ -266,6 +266,7 @@ const struct language_defn scm_language_ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ NULL, /* Language specific symbol demangler */ + NULL, /* Language specific class_name_from_physname */ {"", "", "", ""}, /* Binary format info */ {"#o%lo", "#o", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */