diff options
author | Vladimir Prus <vladimir@codesourcery.com> | 2007-01-16 02:12:49 +0000 |
---|---|---|
committer | Vladimir Prus <vladimir@codesourcery.com> | 2007-01-16 02:12:49 +0000 |
commit | b20d8971adc2a4b07c6d777716948da8e902c379 (patch) | |
tree | 10d0a139c3091e625eafd7806502ab564bbdfab9 /gdb | |
parent | 562cca1e7b86cb3a74d34ba2aa7af11a1f7c627a (diff) | |
download | gdb-b20d8971adc2a4b07c6d777716948da8e902c379.zip gdb-b20d8971adc2a4b07c6d777716948da8e902c379.tar.gz gdb-b20d8971adc2a4b07c6d777716948da8e902c379.tar.bz2 |
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 15 | ||||
-rw-r--r-- | gdb/varobj.c | 36 |
2 files changed, 27 insertions, 24 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e63821b..73e1547 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/varobj.c b/gdb/varobj.c index 27c2761..dc1c356 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -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; } |