From: Tom Tromey Date: Fri, 17 Jun 2011 20:46:47 +0000 (+0000) Subject: * valops.c (value_of_this): Use lookup_language_this. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=66a17cb6292ee31b9f46520761098d56550a341b;p=binutils-gdb.git * 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) : Use lookup_language_this. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4c8c65837e9..70ae97614d3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2011-06-17 Tom Tromey + + * 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) : Use lookup_language_this. + 2011-06-17 Tom Tromey * value.h (value_of_this): Update. 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; }