summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2011-06-17 20:46:46 +0000
committerTom Tromey <tromey@redhat.com>2011-06-17 20:46:46 +0000
commit73020efaf1860119c3775d1efd3e896ef0da2753 (patch)
tree468dd1be4661391b5ab2ba1f3407467b507e1103 /gdb
parenta03c034dadca211c0c179497907a776a84b024f7 (diff)
downloadgdb-73020efaf1860119c3775d1efd3e896ef0da2753.tar.gz
* valops.c (value_of_this): Use lookup_language_this.
* symtab.h (lookup_language_this): Declare. * symtab.c (lookup_language_this): New function. (lookup_symbol_aux): Use lookup_language_this. * ax-gdb.c (gen_expr) <OP_THIS>: Use lookup_language_this.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/ax-gdb.c15
-rw-r--r--gdb/symtab.c37
-rw-r--r--gdb/symtab.h4
-rw-r--r--gdb/valops.c31
5 files changed, 50 insertions, 45 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4c8c65837e9..70ae97614d3 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2011-06-17 Tom Tromey <tromey@redhat.com>
+ * valops.c (value_of_this): Use lookup_language_this.
+ * symtab.h (lookup_language_this): Declare.
+ * symtab.c (lookup_language_this): New function.
+ (lookup_symbol_aux): Use lookup_language_this.
+ * ax-gdb.c (gen_expr) <OP_THIS>: Use lookup_language_this.
+
+2011-06-17 Tom Tromey <tromey@redhat.com>
+
* value.h (value_of_this): Update.
(value_of_local): Remove.
* valops.c (value_of_this): Rename from value_of_local. Change
diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
index 19c00ade5a3..5258167df38 100644
--- a/gdb/ax-gdb.c
+++ b/gdb/ax-gdb.c
@@ -2138,18 +2138,17 @@ gen_expr (struct expression *exp, union exp_element **pc,
case OP_THIS:
{
char *this_name;
- struct symbol *func, *sym;
+ struct symbol *sym, *func;
struct block *b;
+ const struct language_defn *lang;
- func = block_linkage_function (block_for_pc (ax->scope));
- this_name = language_def (SYMBOL_LANGUAGE (func))->la_name_of_this;
- b = SYMBOL_BLOCK_VALUE (func);
+ b = block_for_pc (ax->scope);
+ func = block_linkage_function (b);
+ lang = language_def (SYMBOL_LANGUAGE (func));
- /* Calling lookup_block_symbol is necessary to get the LOC_REGISTER
- symbol instead of the LOC_ARG one (if both exist). */
- sym = lookup_block_symbol (b, this_name, VAR_DOMAIN);
+ sym = lookup_language_this (lang, b);
if (!sym)
- error (_("no `%s' found"), this_name);
+ error (_("no `%s' found"), lang->la_name_of_this);
gen_var_ref (exp->gdbarch, ax, value, sym);
diff --git a/gdb/symtab.c b/gdb/symtab.c
index ba86dec5a95..d627636ae1a 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -1090,6 +1090,29 @@ lookup_symbol (const char *name, const struct block *block,
is_a_field_of_this);
}
+/* Look up the `this' symbol for LANG in BLOCK. Return the symbol if
+ found, or NULL if not found. */
+
+struct symbol *
+lookup_language_this (const struct language_defn *lang,
+ const struct block *block)
+{
+ if (lang->la_name_of_this == NULL || block == NULL)
+ return NULL;
+
+ while (1)
+ {
+ struct symbol *sym;
+
+ sym = lookup_block_symbol (block, lang->la_name_of_this, VAR_DOMAIN);
+ if (sym != NULL)
+ return sym;
+ if (BLOCK_FUNCTION (block))
+ return NULL;
+ block = BLOCK_SUPERBLOCK (block);
+ }
+}
+
/* Behave like lookup_symbol except that NAME is the natural name
of the symbol that we're looking for and, if LINKAGE_NAME is
non-NULL, ensure that the symbol's linkage name matches as
@@ -1123,20 +1146,10 @@ lookup_symbol_aux (const char *name, const struct block *block,
langdef = language_def (language);
- if (langdef->la_name_of_this != NULL && is_a_field_of_this != NULL
- && block != NULL)
+ if (is_a_field_of_this != NULL)
{
- struct symbol *sym = NULL;
- const struct block *function_block = block;
-
- /* 'this' is only defined in the function's block, so find the
- enclosing function block. */
- for (; function_block && !BLOCK_FUNCTION (function_block);
- function_block = BLOCK_SUPERBLOCK (function_block));
+ struct symbol *sym = lookup_language_this (langdef, block);
- if (function_block && !dict_empty (BLOCK_DICT (function_block)))
- sym = lookup_block_symbol (function_block, langdef->la_name_of_this,
- VAR_DOMAIN);
if (sym)
{
struct type *t = sym->type;
diff --git a/gdb/symtab.h b/gdb/symtab.h
index c4319a731e2..2716f3479f3 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -33,6 +33,7 @@ struct blockvector;
struct axs_value;
struct agent_expr;
struct program_space;
+struct language_defn;
/* Some of the structures in this file are space critical.
The space-critical structures are:
@@ -917,6 +918,9 @@ extern struct symbol *lookup_symbol_aux_block (const char *name,
const struct block *block,
const domain_enum domain);
+extern struct symbol *lookup_language_this (const struct language_defn *lang,
+ const struct block *block);
+
/* Lookup a symbol only in the file static scope of all the objfiles. */
struct symbol *lookup_static_symbol_aux (const char *name,
diff --git a/gdb/valops.c b/gdb/valops.c
index 9b3b90a7506..f5458ef946d 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -3603,13 +3603,12 @@ value_full_object (struct value *argp,
struct value *
value_of_this (const struct language_defn *lang, int complain)
{
- struct symbol *func, *sym;
+ struct symbol *sym;
struct block *b;
struct value * ret;
struct frame_info *frame;
- const char *name = lang->la_name_of_this;
- if (!name)
+ if (!lang->la_name_of_this)
{
if (complain)
error (_("no `this' in current language"));
@@ -3625,39 +3624,21 @@ value_of_this (const struct language_defn *lang, int complain)
return 0;
}
- func = get_frame_function (frame);
- if (!func)
- {
- if (complain)
- error (_("no `%s' in nameless context"), name);
- else
- return 0;
- }
+ b = get_frame_block (frame, NULL);
- b = SYMBOL_BLOCK_VALUE (func);
- if (dict_empty (BLOCK_DICT (b)))
- {
- if (complain)
- error (_("no args, no `%s'"), name);
- else
- return 0;
- }
-
- /* Calling lookup_block_symbol is necessary to get the LOC_REGISTER
- symbol instead of the LOC_ARG one (if both exist). */
- sym = lookup_block_symbol (b, name, VAR_DOMAIN);
+ sym = lookup_language_this (lang, b);
if (sym == NULL)
{
if (complain)
error (_("current stack frame does not contain a variable named `%s'"),
- name);
+ lang->la_name_of_this);
else
return NULL;
}
ret = read_var_value (sym, frame);
if (ret == 0 && complain)
- error (_("`%s' argument unreadable"), name);
+ error (_("`%s' argument unreadable"), lang->la_name_of_this);
return ret;
}