2003-02-28 David Carlton <carlton@math.stanford.edu>
* linespec.c (decode_compound): Extract code into find_method. (find_method): New.
This commit is contained in:
parent
ccdc5d7f94
commit
4224873a5a
2 changed files with 94 additions and 71 deletions
|
@ -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>
|
2003-02-28 J. Brobecker <brobecker@gnat.com>
|
||||||
|
|
||||||
* Makefile.in: Add rules to build and link in observer.o.
|
* Makefile.in: Add rules to build and link in observer.o.
|
||||||
|
|
160
gdb/linespec.c
160
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 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,
|
static NORETURN void cplusplus_error (const char *name,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
ATTR_NORETURN ATTR_FORMAT (printf, 2, 3);
|
ATTR_NORETURN ATTR_FORMAT (printf, 2, 3);
|
||||||
|
@ -945,7 +952,6 @@ decode_compound (char **argptr, int funfirstline, char ***canonical,
|
||||||
struct symtab *sym_symtab;
|
struct symtab *sym_symtab;
|
||||||
char *copy;
|
char *copy;
|
||||||
struct symbol *sym_class;
|
struct symbol *sym_class;
|
||||||
int i1;
|
|
||||||
struct symbol **sym_arr;
|
struct symbol **sym_arr;
|
||||||
struct type *t;
|
struct type *t;
|
||||||
|
|
||||||
|
@ -1037,76 +1043,8 @@ decode_compound (char **argptr, int funfirstline, char ***canonical,
|
||||||
p++;
|
p++;
|
||||||
*argptr = p;
|
*argptr = p;
|
||||||
|
|
||||||
sym = 0;
|
return find_method (funfirstline, canonical, saved_arg,
|
||||||
i1 = 0; /* Counter for the symbol array. */
|
copy, t, sym_class);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move pointer up to next possible class/namespace token. */
|
/* Move pointer up to next possible class/namespace token. */
|
||||||
|
@ -1188,6 +1126,86 @@ lookup_prefix_sym (char **argptr, char *p)
|
||||||
(struct symtab **) NULL);
|
(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
|
/* Return the symtab associated to the filename given by the substring
|
||||||
|
|
Loading…
Reference in a new issue