aboutsummaryrefslogtreecommitdiff
path: root/gdb/symtab.c
diff options
context:
space:
mode:
authorVladimir Prus <vladimir@codesourcery.com>2008-04-06 08:56:37 +0000
committerVladimir Prus <vladimir@codesourcery.com>2008-04-06 08:56:37 +0000
commit2b2d9e11a0bd5355936c876a8d14a06d78d4b39e (patch)
tree96d07737397754779f0b1b68d79a1f6efc8fc08a /gdb/symtab.c
parent2344873715652bf0296adce9f7f686e914fdd36e (diff)
downloadgdb-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.c42
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;
+ }
}
}