2003-06-02 David Carlton <carlton@bactrian.org>
* linespec.c (find_methods): Break out code into add_matching_methods and add_constructors. (add_matching_methods): New. (add_constructors): Ditto.
This commit is contained in:
parent
bf7488d21d
commit
aee8d8ba8a
2 changed files with 124 additions and 80 deletions
|
@ -1,3 +1,10 @@
|
|||
2003-06-02 David Carlton <carlton@bactrian.org>
|
||||
|
||||
* linespec.c (find_methods): Break out code into
|
||||
add_matching_methods and add_constructors.
|
||||
(add_matching_methods): New.
|
||||
(add_constructors): Ditto.
|
||||
|
||||
2003-06-02 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* alpha-tdep.c (alpha_gdbarch_init): Set convert_register_p,
|
||||
|
|
197
gdb/linespec.c
197
gdb/linespec.c
|
@ -82,6 +82,12 @@ static int total_number_of_methods (struct type *type);
|
|||
|
||||
static int find_methods (struct type *, char *, struct symbol **);
|
||||
|
||||
static int add_matching_methods (int method_counter, struct type *t,
|
||||
struct symbol **sym_arr);
|
||||
|
||||
static int add_constructors (int method_counter, struct type *t,
|
||||
struct symbol **sym_arr);
|
||||
|
||||
static void build_canonical_line_spec (struct symtab_and_line *,
|
||||
char *, char ***);
|
||||
|
||||
|
@ -210,7 +216,6 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
|
|||
method_counter >= 0;
|
||||
--method_counter)
|
||||
{
|
||||
int field_counter;
|
||||
char *method_name = TYPE_FN_FIELDLIST_NAME (t, method_counter);
|
||||
char dem_opname[64];
|
||||
|
||||
|
@ -226,88 +231,13 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
|
|||
|
||||
if (strcmp_iw (name, method_name) == 0)
|
||||
/* Find all the overloaded methods with that name. */
|
||||
for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
|
||||
field_counter >= 0;
|
||||
--field_counter)
|
||||
{
|
||||
struct fn_field *f;
|
||||
char *phys_name;
|
||||
|
||||
f = TYPE_FN_FIELDLIST1 (t, method_counter);
|
||||
|
||||
if (TYPE_FN_FIELD_STUB (f, field_counter))
|
||||
{
|
||||
char *tmp_name;
|
||||
|
||||
tmp_name = gdb_mangle_name (t,
|
||||
method_counter,
|
||||
field_counter);
|
||||
phys_name = alloca (strlen (tmp_name) + 1);
|
||||
strcpy (phys_name, tmp_name);
|
||||
xfree (tmp_name);
|
||||
}
|
||||
else
|
||||
phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
|
||||
|
||||
/* Destructor is handled by caller, don't add it to
|
||||
the list. */
|
||||
if (is_destructor_name (phys_name) != 0)
|
||||
continue;
|
||||
|
||||
sym_arr[i1] = lookup_symbol (phys_name,
|
||||
NULL, VAR_DOMAIN,
|
||||
(int *) NULL,
|
||||
(struct symtab **) NULL);
|
||||
if (sym_arr[i1])
|
||||
i1++;
|
||||
else
|
||||
{
|
||||
/* This error message gets printed, but the method
|
||||
still seems to be found
|
||||
fputs_filtered("(Cannot find method ", gdb_stdout);
|
||||
fprintf_symbol_filtered (gdb_stdout, phys_name,
|
||||
language_cplus,
|
||||
DMGL_PARAMS | DMGL_ANSI);
|
||||
fputs_filtered(" - possibly inlined.)\n", gdb_stdout);
|
||||
*/
|
||||
}
|
||||
}
|
||||
i1 += add_matching_methods (method_counter, t,
|
||||
sym_arr + i1);
|
||||
else if (strncmp (class_name, name, name_len) == 0
|
||||
&& (class_name[name_len] == '\0'
|
||||
|| class_name[name_len] == '<'))
|
||||
{
|
||||
/* For GCC 3.x and stabs, constructors and destructors
|
||||
have names like __base_ctor and __complete_dtor.
|
||||
Check the physname for now if we're looking for a
|
||||
constructor. */
|
||||
for (field_counter
|
||||
= TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
|
||||
field_counter >= 0;
|
||||
--field_counter)
|
||||
{
|
||||
struct fn_field *f;
|
||||
char *phys_name;
|
||||
|
||||
f = TYPE_FN_FIELDLIST1 (t, method_counter);
|
||||
|
||||
/* GCC 3.x will never produce stabs stub methods, so
|
||||
we don't need to handle this case. */
|
||||
if (TYPE_FN_FIELD_STUB (f, field_counter))
|
||||
continue;
|
||||
phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
|
||||
if (! is_constructor_name (phys_name))
|
||||
continue;
|
||||
|
||||
/* If this method is actually defined, include it in the
|
||||
list. */
|
||||
sym_arr[i1] = lookup_symbol (phys_name,
|
||||
NULL, VAR_DOMAIN,
|
||||
(int *) NULL,
|
||||
(struct symtab **) NULL);
|
||||
if (sym_arr[i1])
|
||||
i1++;
|
||||
}
|
||||
}
|
||||
i1 += add_constructors (method_counter, t,
|
||||
sym_arr + i1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -329,6 +259,113 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
|
|||
return i1;
|
||||
}
|
||||
|
||||
/* Add the symbols associated to methods of the class whose type is T
|
||||
and whose name matches the method indexed by METHOD_COUNTER in the
|
||||
array SYM_ARR. Return the number of methods added. */
|
||||
|
||||
static int
|
||||
add_matching_methods (int method_counter, struct type *t,
|
||||
struct symbol **sym_arr)
|
||||
{
|
||||
int field_counter;
|
||||
int i1 = 0;
|
||||
|
||||
for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
|
||||
field_counter >= 0;
|
||||
--field_counter)
|
||||
{
|
||||
struct fn_field *f;
|
||||
char *phys_name;
|
||||
|
||||
f = TYPE_FN_FIELDLIST1 (t, method_counter);
|
||||
|
||||
if (TYPE_FN_FIELD_STUB (f, field_counter))
|
||||
{
|
||||
char *tmp_name;
|
||||
|
||||
tmp_name = gdb_mangle_name (t,
|
||||
method_counter,
|
||||
field_counter);
|
||||
phys_name = alloca (strlen (tmp_name) + 1);
|
||||
strcpy (phys_name, tmp_name);
|
||||
xfree (tmp_name);
|
||||
}
|
||||
else
|
||||
phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
|
||||
|
||||
/* Destructor is handled by caller, don't add it to
|
||||
the list. */
|
||||
if (is_destructor_name (phys_name) != 0)
|
||||
continue;
|
||||
|
||||
sym_arr[i1] = lookup_symbol (phys_name,
|
||||
NULL, VAR_DOMAIN,
|
||||
(int *) NULL,
|
||||
(struct symtab **) NULL);
|
||||
if (sym_arr[i1])
|
||||
i1++;
|
||||
else
|
||||
{
|
||||
/* This error message gets printed, but the method
|
||||
still seems to be found
|
||||
fputs_filtered("(Cannot find method ", gdb_stdout);
|
||||
fprintf_symbol_filtered (gdb_stdout, phys_name,
|
||||
language_cplus,
|
||||
DMGL_PARAMS | DMGL_ANSI);
|
||||
fputs_filtered(" - possibly inlined.)\n", gdb_stdout);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
return i1;
|
||||
}
|
||||
|
||||
/* Add the symbols associated to constructors of the class whose type
|
||||
is CLASS_TYPE and which are indexed by by METHOD_COUNTER to the
|
||||
array SYM_ARR. Return the number of methods added. */
|
||||
|
||||
static int
|
||||
add_constructors (int method_counter, struct type *t,
|
||||
struct symbol **sym_arr)
|
||||
{
|
||||
int field_counter;
|
||||
int i1 = 0;
|
||||
|
||||
/* For GCC 3.x and stabs, constructors and destructors
|
||||
have names like __base_ctor and __complete_dtor.
|
||||
Check the physname for now if we're looking for a
|
||||
constructor. */
|
||||
for (field_counter
|
||||
= TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
|
||||
field_counter >= 0;
|
||||
--field_counter)
|
||||
{
|
||||
struct fn_field *f;
|
||||
char *phys_name;
|
||||
|
||||
f = TYPE_FN_FIELDLIST1 (t, method_counter);
|
||||
|
||||
/* GCC 3.x will never produce stabs stub methods, so
|
||||
we don't need to handle this case. */
|
||||
if (TYPE_FN_FIELD_STUB (f, field_counter))
|
||||
continue;
|
||||
phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
|
||||
if (! is_constructor_name (phys_name))
|
||||
continue;
|
||||
|
||||
/* If this method is actually defined, include it in the
|
||||
list. */
|
||||
sym_arr[i1] = lookup_symbol (phys_name,
|
||||
NULL, VAR_DOMAIN,
|
||||
(int *) NULL,
|
||||
(struct symtab **) NULL);
|
||||
if (sym_arr[i1])
|
||||
i1++;
|
||||
}
|
||||
|
||||
return i1;
|
||||
}
|
||||
|
||||
/* Helper function for decode_line_1.
|
||||
Build a canonical line spec in CANONICAL if it is non-NULL and if
|
||||
the SAL has a symtab.
|
||||
|
|
Loading…
Reference in a new issue