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.
2015-01-30 Simon Marchi <simon.marchi@ericsson.com>
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.
* mi-cmd-var.c (print_varobj): Free varobj_get_expression
result.
(mi_cmd_var_info_expression): Same.
static char *
c_path_expr_of_child (struct varobj *child)
{
static char *
c_path_expr_of_child (struct varobj *child)
{
c_describe_child (child->parent, child->index, NULL, NULL, NULL,
c_describe_child (child->parent, child->index, NULL, NULL, NULL,
- &child->path_expr);
- return child->path_expr;
+ &path_expr);
+ return path_expr;
static char *
cplus_path_expr_of_child (struct varobj *child)
{
static char *
cplus_path_expr_of_child (struct varobj *child)
{
cplus_describe_child (child->parent, child->index, NULL, NULL, NULL,
cplus_describe_child (child->parent, child->index, NULL, NULL, NULL,
- &child->path_expr);
- return child->path_expr;
+ &path_expr);
+ return path_expr;
char *
varobj_get_path_expr (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));
{
/* 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 *
}
const struct language_defn *