Fix 'selected frame' varobjs.

* varobj.c (struct varobj): Remove the error field.
        (varobj_set_value): Don't check var->error.
        (install_new_value): Don't set var->error.
        (varobj_update): Always pass the new value
        of the root via install_new_value.
        (create_child): Don't set error field.
        (new_variable): Likewise.
        (c_value_of_root): Always reevaluate the value
        of selected frame varobjs in the selected frame.
        Don't call reinit_frame_cache.
This commit is contained in:
Vladimir Prus 2007-01-16 02:12:49 +00:00
parent 562cca1e7b
commit b20d8971ad
2 changed files with 27 additions and 24 deletions

View file

@ -1,3 +1,18 @@
2007-01-16 Daniel Jacobowitz <dan@codesourcery.com>
Vladimir Prus <vladimir@codesourcery.com>
Fix 'selected frame' varobjs.
* varobj.c (struct varobj): Remove the error field.
(varobj_set_value): Don't check var->error.
(install_new_value): Don't set var->error.
(varobj_update): Always pass the new value
of the root via install_new_value.
(create_child): Don't set error field.
(new_variable): Likewise.
(c_value_of_root): Always reevaluate the value
of selected frame varobjs in the selected frame.
Don't call reinit_frame_cache.
2007-01-15 Joel Brobecker <brobecker@adacore.com>
* source.c (_initialize_source): Improve the help text of

View file

@ -107,14 +107,12 @@ struct varobj
/* The type of this variable. This may NEVER be NULL. */
struct type *type;
/* The value of this expression or subexpression. This may be NULL.
/* The value of this expression or subexpression. A NULL value
indicates there was an error getting this value.
Invariant: if varobj_value_is_changeable_p (this) is non-zero,
the value is either NULL, or not lazy. */
struct value *value;
/* Did an error occur evaluating the expression or getting its value? */
int error;
/* The number of (immediate) children this variable has */
int num_children;
@ -811,7 +809,7 @@ varobj_set_value (struct varobj *var, char *expression)
struct value *value;
int saved_input_radix = input_radix;
if (var->value != NULL && variable_editable (var) && !var->error)
if (var->value != NULL && variable_editable (var))
{
char *s = expression;
int i;
@ -909,7 +907,6 @@ install_new_value (struct varobj *var, struct value *value, int initial)
int need_to_fetch;
int changed = 0;
var->error = 0;
/* We need to know the varobj's type to decide if the value should
be fetched or not. C++ fake children (public/protected/private) don't have
a type. */
@ -946,14 +943,11 @@ install_new_value (struct varobj *var, struct value *value, int initial)
{
if (!gdb_value_fetch_lazy (value))
{
var->error = 1;
/* Set the value to NULL, so that for the next -var-update,
we don't try to compare the new value with this value,
that we couldn't even read. */
value = NULL;
}
else
var->error = 0;
}
/* If the type is changeable, compare the old and the new values.
@ -1078,12 +1072,6 @@ varobj_update (struct varobj **varp, struct varobj ***changelist)
if (fi)
select_frame (fi);
if (new == NULL)
{
(*varp)->error = 1;
return -1;
}
/* If this is a "use_selected_frame" varobj, and its type has changed,
them note that it's changed. */
if (type_changed)
@ -1097,6 +1085,14 @@ varobj_update (struct varobj **varp, struct varobj ***changelist)
VEC_safe_push (varobj_p, result, *varp);
}
if (new == NULL)
{
/* This means the varobj itself is out of scope.
Report it. */
VEC_free (varobj_p, result);
return -1;
}
VEC_safe_push (varobj_p, stack, *varp);
/* Walk through the children, reconstructing them all. */
@ -1370,9 +1366,6 @@ create_child (struct varobj *parent, int index, char *name)
child->index);
install_new_value (child, value, 1);
if ((!CPLUS_FAKE_CHILD (child) && child->value == NULL) || parent->error)
child->error = 1;
return child;
}
@ -1393,7 +1386,6 @@ new_variable (void)
var->index = -1;
var->type = NULL;
var->value = NULL;
var->error = 0;
var->num_children = -1;
var->parent = NULL;
var->children = NULL;
@ -1972,11 +1964,10 @@ c_value_of_root (struct varobj **var_handle)
/* Determine whether the variable is still around. */
if (var->root->valid_block == NULL)
if (var->root->valid_block == NULL || var->root->use_selected_frame)
within_scope = 1;
else
{
reinit_frame_cache ();
fi = frame_find_by_id (var->root->frame);
within_scope = fi != NULL;
/* FIXME: select_frame could fail */
@ -1998,11 +1989,8 @@ c_value_of_root (struct varobj **var_handle)
go on */
if (gdb_evaluate_expression (var->root->exp, &new_val))
{
var->error = 0;
release_value (new_val);
}
else
var->error = 1;
return new_val;
}