diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/linespec.c | 57 |
2 files changed, 44 insertions, 18 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d6de92e..41c4988 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2003-03-03 David Carlton <carlton@math.stanford.edu> + + * linespec.c (find_method): Extract code into collect_methods. + (collect_methods): New. + 2003-03-02 Mark Kettenis <kettenis@gnu.org> * i386bsd-tdep.c (i386bsd_sigcontext_addr): Use get_next_frame and diff --git a/gdb/linespec.c b/gdb/linespec.c index 088c2e6..2738b1e 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -64,6 +64,9 @@ static struct symtabs_and_lines find_method (int funfirstline, struct type *t, struct symbol *sym_class); +static int collect_methods (char *copy, struct type *t, + struct symbol **sym_arr); + static NORETURN void cplusplus_error (const char *name, const char *fmt, ...) ATTR_NORETURN ATTR_FORMAT (printf, 2, 3); @@ -1135,29 +1138,15 @@ find_method (int funfirstline, char ***canonical, char *saved_arg, { struct symtabs_and_lines values; struct symbol *sym = 0; - int i1 = 0; /* Counter for the symbol array. */ + int i1; /* Counter for the symbol array. */ struct symbol **sym_arr = alloca (total_number_of_methods (t) * sizeof (struct symbol *)); - if (destructor_name_p (copy, t)) - { - /* Destructors are a special case. */ - int m_index, f_index; + /* Find all methods with a matching name, and put them in + sym_arr. */ - if (get_destructor_fn_field (t, &m_index, &f_index)) - { - struct fn_field *f = TYPE_FN_FIELDLIST1 (t, m_index); + i1 = collect_methods (copy, t, sym_arr); - sym_arr[i1] = - lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, f_index), - NULL, VAR_NAMESPACE, (int *) NULL, - (struct symtab **) NULL); - if (sym_arr[i1]) - i1++; - } - } - else - i1 = find_methods (t, copy, sym_arr); if (i1 == 1) { /* There is exactly one field with that name. */ @@ -1206,6 +1195,38 @@ find_method (int funfirstline, char ***canonical, char *saved_arg, } } +/* Find all methods named COPY in the class whose type is T, and put + them in SYM_ARR. Return the number of methods found. */ + +static int +collect_methods (char *copy, struct type *t, + struct symbol **sym_arr) +{ + int i1 = 0; /* Counter for the symbol array. */ + + if (destructor_name_p (copy, t)) + { + /* Destructors are a special case. */ + int m_index, f_index; + + if (get_destructor_fn_field (t, &m_index, &f_index)) + { + struct fn_field *f = TYPE_FN_FIELDLIST1 (t, m_index); + + sym_arr[i1] = + lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, f_index), + NULL, VAR_NAMESPACE, (int *) NULL, + (struct symtab **) NULL); + if (sym_arr[i1]) + i1++; + } + } + else + i1 = find_methods (t, copy, sym_arr); + + return i1; +} + /* Return the symtab associated to the filename given by the substring |