diff options
author | Vladimir Prus <vladimir@codesourcery.com> | 2008-04-06 08:56:37 +0000 |
---|---|---|
committer | Vladimir Prus <vladimir@codesourcery.com> | 2008-04-06 08:56:37 +0000 |
commit | 2b2d9e11a0bd5355936c876a8d14a06d78d4b39e (patch) | |
tree | 96d07737397754779f0b1b68d79a1f6efc8fc08a /gdb/symtab.c | |
parent | 2344873715652bf0296adce9f7f686e914fdd36e (diff) | |
download | gdb-2b2d9e11a0bd5355936c876a8d14a06d78d4b39e.zip gdb-2b2d9e11a0bd5355936c876a8d14a06d78d4b39e.tar.gz gdb-2b2d9e11a0bd5355936c876a8d14a06d78d4b39e.tar.bz2 |
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.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r-- | gdb/symtab.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c index aa401ad..6422db4 100644 --- a/gdb/symtab.c +++ b/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); - - if (v && check_field (v, name)) + 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 (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; + } } } |