Set varobj->path_expr in varobj_get_path_expr
authorSimon Marchi <simon.marchi@ericsson.com>
Fri, 30 Jan 2015 19:43:59 +0000 (14:43 -0500)
committerSimon Marchi <simon.marchi@ericsson.com>
Fri, 30 Jan 2015 19:43:59 +0000 (14:43 -0500)
It seems like different languages are doing this differently (e.g.
C and Ada). For C, var->path_expr is set inside c_path_expr_of_child.
The next time the value is requested, is it therefore not recomputed.
Ada does not set this field, but just returns the value. Since the field
is never set, the value is recomputed every time it is requested.

This patch makes it so that path_expr_of_child's only job is to compute
the path expression, not save/cache the value. The field is set by the
varobj common code.

gdb/ChangeLog:

* varobj.c (varobj_get_path_expr): Set var->path_expr.
* c-varobj.c (c_path_expr_of_child): Set local var instead of
child->path_expr.
(cplus_path_expr_of_child): Same.

gdb/ChangeLog
gdb/c-varobj.c
gdb/varobj.c

index 6738267ec6f96852b85d6b88bd83728e41848db9..3385cfac28d50bb1cd9ce270c1096885c3d40ebf 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-30  Simon Marchi  <simon.marchi@ericsson.com>
+
+       * varobj.c (varobj_get_path_expr): Set var->path_expr.
+       * c-varobj.c (c_path_expr_of_child): Set local var instead of
+       child->path_expr.
+       (cplus_path_expr_of_child): Same.
+
 2015-01-30  Simon Marchi  <simon.marchi@ericsson.com>
 
        * mi-cmd-var.c (print_varobj): Free varobj_get_expression
index 1db0957f38c0e15149c8e610c51194ed08629841..bd0e5fb9d3b4079305c8f4be1780e7c5c9cf6c34 100644 (file)
@@ -433,9 +433,11 @@ c_name_of_child (struct varobj *parent, int index)
 static char *
 c_path_expr_of_child (struct varobj *child)
 {
+  char *path_expr;
+
   c_describe_child (child->parent, child->index, NULL, NULL, NULL, 
-                   &child->path_expr);
-  return child->path_expr;
+                   &path_expr);
+  return path_expr;
 }
 
 static struct value *
@@ -906,9 +908,11 @@ cplus_name_of_child (struct varobj *parent, int index)
 static char *
 cplus_path_expr_of_child (struct varobj *child)
 {
+  char *path_expr;
+
   cplus_describe_child (child->parent, child->index, NULL, NULL, NULL, 
-                       &child->path_expr);
-  return child->path_expr;
+                       &path_expr);
+  return path_expr;
 }
 
 static struct value *
index 6c9257ddeba356348cc2ea453c5fe94b5d807894..28d388e735503167ce850e6300aac6768c2c9f91 100644 (file)
@@ -1034,16 +1034,17 @@ varobj_get_path_expr_parent (struct varobj *var)
 char *
 varobj_get_path_expr (struct varobj *var)
 {
-  if (var->path_expr != NULL)
-    return var->path_expr;
-  else 
+  if (var->path_expr == NULL)
     {
       /* For root varobjs, we initialize path_expr
         when creating varobj, so here it should be
         child varobj.  */
       gdb_assert (!is_root_p (var));
-      return (*var->root->lang_ops->path_expr_of_child) (var);
+
+      var->path_expr = (*var->root->lang_ops->path_expr_of_child) (var);
     }
+
+  return var->path_expr;
 }
 
 const struct language_defn *