diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/linespec.c | 197 |
2 files changed, 124 insertions, 80 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 439520b902b..cb5ab22f022 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2003-06-02 David Carlton <carlton@bactrian.org> + + * linespec.c (find_methods): Break out code into + add_matching_methods and add_constructors. + (add_matching_methods): New. + (add_constructors): Ditto. + 2003-06-02 Andrew Cagney <cagney@redhat.com> * alpha-tdep.c (alpha_gdbarch_init): Set convert_register_p, diff --git a/gdb/linespec.c b/gdb/linespec.c index bda41c78940..682018f1fd0 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -82,6 +82,12 @@ static int total_number_of_methods (struct type *type); static int find_methods (struct type *, char *, struct symbol **); +static int add_matching_methods (int method_counter, struct type *t, + struct symbol **sym_arr); + +static int add_constructors (int method_counter, struct type *t, + struct symbol **sym_arr); + static void build_canonical_line_spec (struct symtab_and_line *, char *, char ***); @@ -210,7 +216,6 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr) method_counter >= 0; --method_counter) { - int field_counter; char *method_name = TYPE_FN_FIELDLIST_NAME (t, method_counter); char dem_opname[64]; @@ -226,88 +231,13 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr) if (strcmp_iw (name, method_name) == 0) /* Find all the overloaded methods with that name. */ - for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1; - field_counter >= 0; - --field_counter) - { - struct fn_field *f; - char *phys_name; - - f = TYPE_FN_FIELDLIST1 (t, method_counter); - - if (TYPE_FN_FIELD_STUB (f, field_counter)) - { - char *tmp_name; - - tmp_name = gdb_mangle_name (t, - method_counter, - field_counter); - phys_name = alloca (strlen (tmp_name) + 1); - strcpy (phys_name, tmp_name); - xfree (tmp_name); - } - else - phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter); - - /* Destructor is handled by caller, don't add it to - the list. */ - if (is_destructor_name (phys_name) != 0) - continue; - - sym_arr[i1] = lookup_symbol (phys_name, - NULL, VAR_DOMAIN, - (int *) NULL, - (struct symtab **) NULL); - if (sym_arr[i1]) - i1++; - else - { - /* This error message gets printed, but the method - still seems to be found - fputs_filtered("(Cannot find method ", gdb_stdout); - fprintf_symbol_filtered (gdb_stdout, phys_name, - language_cplus, - DMGL_PARAMS | DMGL_ANSI); - fputs_filtered(" - possibly inlined.)\n", gdb_stdout); - */ - } - } + i1 += add_matching_methods (method_counter, t, + sym_arr + i1); else if (strncmp (class_name, name, name_len) == 0 && (class_name[name_len] == '\0' || class_name[name_len] == '<')) - { - /* For GCC 3.x and stabs, constructors and destructors - have names like __base_ctor and __complete_dtor. - Check the physname for now if we're looking for a - constructor. */ - for (field_counter - = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1; - field_counter >= 0; - --field_counter) - { - struct fn_field *f; - char *phys_name; - - f = TYPE_FN_FIELDLIST1 (t, method_counter); - - /* GCC 3.x will never produce stabs stub methods, so - we don't need to handle this case. */ - if (TYPE_FN_FIELD_STUB (f, field_counter)) - continue; - phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter); - if (! is_constructor_name (phys_name)) - continue; - - /* If this method is actually defined, include it in the - list. */ - sym_arr[i1] = lookup_symbol (phys_name, - NULL, VAR_DOMAIN, - (int *) NULL, - (struct symtab **) NULL); - if (sym_arr[i1]) - i1++; - } - } + i1 += add_constructors (method_counter, t, + sym_arr + i1); } } @@ -329,6 +259,113 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr) return i1; } +/* Add the symbols associated to methods of the class whose type is T + and whose name matches the method indexed by METHOD_COUNTER in the + array SYM_ARR. Return the number of methods added. */ + +static int +add_matching_methods (int method_counter, struct type *t, + struct symbol **sym_arr) +{ + int field_counter; + int i1 = 0; + + for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1; + field_counter >= 0; + --field_counter) + { + struct fn_field *f; + char *phys_name; + + f = TYPE_FN_FIELDLIST1 (t, method_counter); + + if (TYPE_FN_FIELD_STUB (f, field_counter)) + { + char *tmp_name; + + tmp_name = gdb_mangle_name (t, + method_counter, + field_counter); + phys_name = alloca (strlen (tmp_name) + 1); + strcpy (phys_name, tmp_name); + xfree (tmp_name); + } + else + phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter); + + /* Destructor is handled by caller, don't add it to + the list. */ + if (is_destructor_name (phys_name) != 0) + continue; + + sym_arr[i1] = lookup_symbol (phys_name, + NULL, VAR_DOMAIN, + (int *) NULL, + (struct symtab **) NULL); + if (sym_arr[i1]) + i1++; + else + { + /* This error message gets printed, but the method + still seems to be found + fputs_filtered("(Cannot find method ", gdb_stdout); + fprintf_symbol_filtered (gdb_stdout, phys_name, + language_cplus, + DMGL_PARAMS | DMGL_ANSI); + fputs_filtered(" - possibly inlined.)\n", gdb_stdout); + */ + } + } + + return i1; +} + +/* Add the symbols associated to constructors of the class whose type + is CLASS_TYPE and which are indexed by by METHOD_COUNTER to the + array SYM_ARR. Return the number of methods added. */ + +static int +add_constructors (int method_counter, struct type *t, + struct symbol **sym_arr) +{ + int field_counter; + int i1 = 0; + + /* For GCC 3.x and stabs, constructors and destructors + have names like __base_ctor and __complete_dtor. + Check the physname for now if we're looking for a + constructor. */ + for (field_counter + = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1; + field_counter >= 0; + --field_counter) + { + struct fn_field *f; + char *phys_name; + + f = TYPE_FN_FIELDLIST1 (t, method_counter); + + /* GCC 3.x will never produce stabs stub methods, so + we don't need to handle this case. */ + if (TYPE_FN_FIELD_STUB (f, field_counter)) + continue; + phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter); + if (! is_constructor_name (phys_name)) + continue; + + /* If this method is actually defined, include it in the + list. */ + sym_arr[i1] = lookup_symbol (phys_name, + NULL, VAR_DOMAIN, + (int *) NULL, + (struct symtab **) NULL); + if (sym_arr[i1]) + i1++; + } + + return i1; +} + /* Helper function for decode_line_1. Build a canonical line spec in CANONICAL if it is non-NULL and if the SAL has a symtab. |