mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-31 18:20:12 +08:00
Fix breakpoint condition that use member variables.
* valops.c (check_field): Remove. (check_field_in): Rename to check_field. (value_of_this): Use la_name_of_this. * value.h (check_field): Adjust prototype. * language.h (la_value_of_this): Rename to la_name_of_this. * language.c (unknown_language_defn): Specify "this" for name_of_this. (auto_language_defn): Likewise. (local_language_defn): Likewise. * ada-lang.c (ada_language_defn): Adjust comment. * c-lang.c (c_language_defn): Adjust comment. (cplus_language_defn): Specify "this" for name_of_this. (asm_language_defn): Adjust comment. (minimal_language_defn): Adjust comment. * f-lang.c (f_language_defn): Specify NULL for name_of_this. * jv-lang.c (java_language_defn): Specify "this" for name_of_this. * m2-lang.c (m2_language_defn): Specify "this" for name_of_this. * objc-lang.c (objc_language_defn): Specify "self" for name_of_this. * p-lang.c (pascal_language_defn): Specify "this" for name_of_this. * scm-lang.c (scm_language_defn): Specify NULL for name_of_this. * symtab.c (lookup_symbol_aux): Lookup "this" in the proper scope, and check for field in type of "this", without trying to create a value.
This commit is contained in:
40
gdb/symtab.c
40
gdb/symtab.c
@ -1222,17 +1222,41 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
|
||||
|
||||
langdef = language_def (language);
|
||||
|
||||
if (langdef->la_value_of_this != NULL
|
||||
&& is_a_field_of_this != NULL)
|
||||
if (langdef->la_name_of_this != NULL && is_a_field_of_this != NULL
|
||||
&& block != NULL)
|
||||
{
|
||||
struct value *v = langdef->la_value_of_this (0);
|
||||
struct symbol *sym = NULL;
|
||||
/* 'this' is only defined in the function's block, so find the
|
||||
enclosing function block. */
|
||||
for (; block && !BLOCK_FUNCTION (block);
|
||||
block = BLOCK_SUPERBLOCK (block));
|
||||
|
||||
if (v && check_field (v, name))
|
||||
if (block && !dict_empty (BLOCK_DICT (block)))
|
||||
sym = lookup_block_symbol (block, langdef->la_name_of_this,
|
||||
NULL, VAR_DOMAIN);
|
||||
if (sym)
|
||||
{
|
||||
*is_a_field_of_this = 1;
|
||||
if (symtab != NULL)
|
||||
*symtab = NULL;
|
||||
return NULL;
|
||||
struct type *t = sym->type;
|
||||
|
||||
/* I'm not really sure that type of this can ever
|
||||
be typedefed; just be safe. */
|
||||
CHECK_TYPEDEF (t);
|
||||
if (TYPE_CODE (t) == TYPE_CODE_PTR
|
||||
|| TYPE_CODE (t) == TYPE_CODE_REF)
|
||||
t = TYPE_TARGET_TYPE (t);
|
||||
|
||||
if (TYPE_CODE (t) != TYPE_CODE_STRUCT
|
||||
&& TYPE_CODE (t) != TYPE_CODE_UNION)
|
||||
error (_("Internal error: `%s' is not an aggregate"),
|
||||
langdef->la_name_of_this);
|
||||
|
||||
if (check_field (t, name))
|
||||
{
|
||||
*is_a_field_of_this = 1;
|
||||
if (symtab != NULL)
|
||||
*symtab = NULL;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user