diff options
author | David Carlton <carlton@bactrian.org> | 2003-02-28 17:21:16 +0000 |
---|---|---|
committer | David Carlton <carlton@bactrian.org> | 2003-02-28 17:21:16 +0000 |
commit | 3676d4a498d506aa9173e9da3755a44b92546e69 (patch) | |
tree | 90f2be24cb300e5bf3e92daa2b271c92b6040b36 | |
parent | fe4427f0f954af99f7f0237022ab7a9cb5b7b34d (diff) | |
download | gdb-3676d4a498d506aa9173e9da3755a44b92546e69.tar.gz |
2003-02-28 David Carlton <carlton@math.stanford.edu>
* linespec.c (decode_compound): Extract code into find_method.
(find_method): New.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/linespec.c | 160 |
2 files changed, 94 insertions, 71 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5940c391bc8..3efe5444050 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2003-02-28 David Carlton <carlton@math.stanford.edu> + + * linespec.c (decode_compound): Extract code into find_method. + (find_method): New. + 2003-02-28 J. Brobecker <brobecker@gnat.com> * Makefile.in: Add rules to build and link in observer.o. diff --git a/gdb/linespec.c b/gdb/linespec.c index 9efe1355f25..088c2e63d81 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -57,6 +57,13 @@ static struct symtabs_and_lines decode_compound (char **argptr, static struct symbol *lookup_prefix_sym (char **argptr, char *p); +static struct symtabs_and_lines find_method (int funfirstline, + char ***canonical, + char *saved_arg, + char *copy, + struct type *t, + struct symbol *sym_class); + static NORETURN void cplusplus_error (const char *name, const char *fmt, ...) ATTR_NORETURN ATTR_FORMAT (printf, 2, 3); @@ -945,7 +952,6 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, struct symtab *sym_symtab; char *copy; struct symbol *sym_class; - int i1; struct symbol **sym_arr; struct type *t; @@ -1037,76 +1043,8 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, p++; *argptr = p; - sym = 0; - i1 = 0; /* Counter for the symbol array. */ - sym_arr = (struct symbol **) 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; - - 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); - if (i1 == 1) - { - /* There is exactly one field with that name. */ - sym = sym_arr[0]; - - if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) - { - values.sals = (struct symtab_and_line *) - xmalloc (sizeof (struct symtab_and_line)); - values.nelts = 1; - values.sals[0] = find_function_start_sal (sym, - funfirstline); - } - else - { - values.nelts = 0; - } - return values; - } - if (i1 > 0) - { - /* There is more than one field with that name - (overloaded). Ask the user which one to use. */ - return decode_line_2 (sym_arr, i1, funfirstline, canonical); - } - else - { - char *tmp; - - if (is_operator_name (copy)) - { - tmp = (char *) alloca (strlen (copy + 3) + 9); - strcpy (tmp, "operator "); - strcat (tmp, copy + 3); - } - else - tmp = copy; - if (tmp[0] == '~') - cplusplus_error (saved_arg, - "the class `%s' does not have destructor defined\n", - SYMBOL_PRINT_NAME (sym_class)); - else - cplusplus_error (saved_arg, - "the class %s does not have any method named %s\n", - SYMBOL_PRINT_NAME (sym_class), tmp); - } + return find_method (funfirstline, canonical, saved_arg, + copy, t, sym_class); } /* Move pointer up to next possible class/namespace token. */ @@ -1188,6 +1126,86 @@ lookup_prefix_sym (char **argptr, char *p) (struct symtab **) NULL); } +/* This finds the method COPY in the class whose type is T and whose + symbol is SYM_CLASS. */ + +static struct symtabs_and_lines +find_method (int funfirstline, char ***canonical, char *saved_arg, + char *copy, struct type *t, struct symbol *sym_class) +{ + struct symtabs_and_lines values; + struct symbol *sym = 0; + int i1 = 0; /* 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; + + 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); + if (i1 == 1) + { + /* There is exactly one field with that name. */ + sym = sym_arr[0]; + + if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) + { + values.sals = (struct symtab_and_line *) + xmalloc (sizeof (struct symtab_and_line)); + values.nelts = 1; + values.sals[0] = find_function_start_sal (sym, + funfirstline); + } + else + { + values.nelts = 0; + } + return values; + } + if (i1 > 0) + { + /* There is more than one field with that name + (overloaded). Ask the user which one to use. */ + return decode_line_2 (sym_arr, i1, funfirstline, canonical); + } + else + { + char *tmp; + + if (is_operator_name (copy)) + { + tmp = (char *) alloca (strlen (copy + 3) + 9); + strcpy (tmp, "operator "); + strcat (tmp, copy + 3); + } + else + tmp = copy; + if (tmp[0] == '~') + cplusplus_error (saved_arg, + "the class `%s' does not have destructor defined\n", + SYMBOL_PRINT_NAME (sym_class)); + else + cplusplus_error (saved_arg, + "the class %s does not have any method named %s\n", + SYMBOL_PRINT_NAME (sym_class), tmp); + } +} + /* Return the symtab associated to the filename given by the substring |