aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/linespec.c57
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