This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Set varobj->path_expr in varobj_get_path_expr


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2568868e69f710e470c8698a34010daf36500a30

commit 2568868e69f710e470c8698a34010daf36500a30
Author: Simon Marchi <simon.marchi@ericsson.com>
Date:   Fri Jan 30 14:43:59 2015 -0500

    Set varobj->path_expr in varobj_get_path_expr
    
    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.

Diff:
---
 gdb/ChangeLog  |  7 +++++++
 gdb/c-varobj.c | 12 ++++++++----
 gdb/varobj.c   |  9 +++++----
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6738267..3385cfa 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
 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
 	result.
 	(mi_cmd_var_info_expression): Same.
diff --git a/gdb/c-varobj.c b/gdb/c-varobj.c
index 1db0957..bd0e5fb 100644
--- a/gdb/c-varobj.c
+++ b/gdb/c-varobj.c
@@ -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 *
diff --git a/gdb/varobj.c b/gdb/varobj.c
index 6c9257d..28d388e 100644
--- a/gdb/varobj.c
+++ b/gdb/varobj.c
@@ -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 *


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]