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>
|
2003-06-02 Andrew Cagney <cagney@redhat.com>
|
||||||
|
|
||||||
* alpha-tdep.c (alpha_gdbarch_init): Set convert_register_p,
|
* 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 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 *,
|
static void build_canonical_line_spec (struct symtab_and_line *,
|
||||||
char *, char ***);
|
char *, char ***);
|
||||||
|
|
||||||
|
@ -210,7 +216,6 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
|
||||||
method_counter >= 0;
|
method_counter >= 0;
|
||||||
--method_counter)
|
--method_counter)
|
||||||
{
|
{
|
||||||
int field_counter;
|
|
||||||
char *method_name = TYPE_FN_FIELDLIST_NAME (t, method_counter);
|
char *method_name = TYPE_FN_FIELDLIST_NAME (t, method_counter);
|
||||||
char dem_opname[64];
|
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)
|
if (strcmp_iw (name, method_name) == 0)
|
||||||
/* Find all the overloaded methods with that name. */
|
/* Find all the overloaded methods with that name. */
|
||||||
for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
|
i1 += add_matching_methods (method_counter, t,
|
||||||
field_counter >= 0;
|
sym_arr + i1);
|
||||||
--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);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strncmp (class_name, name, name_len) == 0
|
else if (strncmp (class_name, name, name_len) == 0
|
||||||
&& (class_name[name_len] == '\0'
|
&& (class_name[name_len] == '\0'
|
||||||
|| class_name[name_len] == '<'))
|
|| class_name[name_len] == '<'))
|
||||||
{
|
i1 += add_constructors (method_counter, t,
|
||||||
/* For GCC 3.x and stabs, constructors and destructors
|
sym_arr + i1);
|
||||||
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++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,6 +259,113 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
|
||||||
return i1;
|
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.
|
/* Helper function for decode_line_1.
|
||||||
Build a canonical line spec in CANONICAL if it is non-NULL and if
|
Build a canonical line spec in CANONICAL if it is non-NULL and if
|
||||||
the SAL has a symtab.
|
the SAL has a symtab.
|
||||||
|
|
Loading…
Reference in a new issue