* valops.c (value_of_this): Use lookup_language_this.
authorTom Tromey <tromey@redhat.com>
Fri, 17 Jun 2011 20:46:47 +0000 (20:46 +0000)
committerTom Tromey <tromey@redhat.com>
Fri, 17 Jun 2011 20:46:47 +0000 (20:46 +0000)
* 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.

gdb/ChangeLog
gdb/ax-gdb.c
gdb/symtab.c
gdb/symtab.h
gdb/valops.c

index 4c8c658..70ae976 100644 (file)
@@ -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
index 19c00ad..5258167 100644 (file)
@@ -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);
 
index ba86dec..d627636 100644 (file)
@@ -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;
index c4319a7..2716f34 100644 (file)
@@ -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,
index 9b3b90a..f5458ef 100644 (file)
@@ -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;
 }