Always report varobj as changed when in_scope attribute changes.
* varobj.c (install_new_value): If non-NULL-ness of value changed, return 1.
This commit is contained in:
parent
177b81d66a
commit
ee342b2344
@ -1,3 +1,10 @@
|
||||
2009-05-17 Vladimir Prus <vladimir@codesourcery.com>
|
||||
|
||||
Always report varobj as changed when in_scope attribute changes.
|
||||
|
||||
* varobj.c (install_new_value): If non-NULL-ness of value
|
||||
changed, return 1.
|
||||
|
||||
2009-05-15 Paul Pluzhnikov <ppluzhnikov@google.com>
|
||||
|
||||
* NEWS: Mention set/show libthread-db-search-path.
|
||||
|
@ -1,3 +1,9 @@
|
||||
2009-05-17 Vladimir Prus <vladimir@codesourcery.com>
|
||||
|
||||
* gdb.mi/mi-cmd-var.exp: Check that when varobj
|
||||
of structure type enters or leaves the scope, it
|
||||
is reported by -var-update.
|
||||
|
||||
2009-05-11 Doug Evans <dje@sebabeach.org>
|
||||
|
||||
* gdb.mi/nsintrall.c (main): Fix off-by-one error.
|
||||
|
@ -631,5 +631,32 @@ mi_gdb_test "-var-delete endvar" \
|
||||
"\\^done,ndeleted=\"1\"" \
|
||||
"delete endvar"
|
||||
|
||||
mi_delete_breakpoints
|
||||
|
||||
mi_runto do_locals_tests
|
||||
|
||||
mi_create_varobj "L" "lsimple" "in-and-out-of-scope: create varobj"
|
||||
mi_check_varobj_value "L" "{...}" "in-and-out-of-scope: check initial value"
|
||||
|
||||
mi_runto main
|
||||
|
||||
mi_gdb_test "-var-update L" \
|
||||
{\^done,changelist=\[{name="L",in_scope="false",type_changed="false"}\]} \
|
||||
"in-and-out-of-scope: out of scope now"
|
||||
|
||||
mi_gdb_test "-var-update L" \
|
||||
{\^done,changelist=\[]} \
|
||||
"in-and-out-of-scope: out of scope now, not changed"
|
||||
|
||||
mi_continue_to do_locals_tests
|
||||
|
||||
mi_gdb_test "-var-update L" \
|
||||
{\^done,changelist=\[{name="L",in_scope="true",type_changed="false"}\]} \
|
||||
"in-and-out-of-scope: in scope now"
|
||||
|
||||
mi_gdb_test "-var-update L" \
|
||||
{\^done,changelist=\[\]} \
|
||||
"in-and-out-of-scope: in scope now, not changed"
|
||||
|
||||
mi_gdb_exit
|
||||
return 0
|
||||
|
18
gdb/varobj.c
18
gdb/varobj.c
@ -982,9 +982,12 @@ varobj_list (struct varobj ***varlist)
|
||||
this is the first assignement after the variable object was just
|
||||
created, or changed type. In that case, just assign the value
|
||||
and return 0.
|
||||
Otherwise, assign the value and if type_changeable returns non-zero,
|
||||
find if the new value is different from the current value.
|
||||
Return 1 if so, and 0 if the values are equal.
|
||||
Otherwise, assign the new value, and return 1 if the value is different
|
||||
from the current one, 0 otherwise. The comparison is done on textual
|
||||
representation of value. Therefore, some types need not be compared. E.g.
|
||||
for structures the reported value is always "{...}", so no comparison is
|
||||
necessary here. If the old value was NULL and new one is not, or vice versa,
|
||||
we always return 1.
|
||||
|
||||
The VALUE parameter should not be released -- the function will
|
||||
take care of releasing it when needed. */
|
||||
@ -1105,6 +1108,15 @@ install_new_value (struct varobj *var, struct value *value, int initial)
|
||||
}
|
||||
}
|
||||
|
||||
if (!initial && !changeable)
|
||||
{
|
||||
/* For values that are not changeable, we don't compare the values.
|
||||
However, we want to notice if a value was not NULL and now is NULL,
|
||||
or vise versa, so that we report when top-level varobjs come in scope
|
||||
and leave the scope. */
|
||||
changed = (var->value != NULL) != (value != NULL);
|
||||
}
|
||||
|
||||
/* We must always keep the new value, since children depend on it. */
|
||||
if (var->value != NULL && var->value != value)
|
||||
value_free (var->value);
|
||||
|
Loading…
x
Reference in New Issue
Block a user