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:
Vladimir Prus
2008-04-06 08:56:37 +00:00
parent 2344873715
commit 2b2d9e11a0
17 changed files with 133 additions and 73 deletions

View File

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