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:
David Carlton 2003-02-28 17:21:16 +00:00
parent ccdc5d7f94
commit 4224873a5a
2 changed files with 94 additions and 71 deletions

View File

@ -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.

View File

@ -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