From ee342b2344e091d2d8a5bfea83b19f651ea58dff Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Sun, 17 May 2009 07:13:19 +0000 Subject: [PATCH] Always report varobj as changed when in_scope attribute changes. * varobj.c (install_new_value): If non-NULL-ness of value changed, return 1. --- gdb/ChangeLog | 7 +++++++ gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.mi/mi-var-cmd.exp | 27 +++++++++++++++++++++++++++ gdb/varobj.c | 18 +++++++++++++++--- 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 14b12deec2f..b676f116a1f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2009-05-17 Vladimir Prus + + 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 * NEWS: Mention set/show libthread-db-search-path. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a9d5de7c1b3..54d1de64ea9 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-05-17 Vladimir Prus + + * 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 * gdb.mi/nsintrall.c (main): Fix off-by-one error. diff --git a/gdb/testsuite/gdb.mi/mi-var-cmd.exp b/gdb/testsuite/gdb.mi/mi-var-cmd.exp index ffe0b799caf..78b30bd9205 100644 --- a/gdb/testsuite/gdb.mi/mi-var-cmd.exp +++ b/gdb/testsuite/gdb.mi/mi-var-cmd.exp @@ -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 diff --git a/gdb/varobj.c b/gdb/varobj.c index 8ec67b77cf1..d36e46d8cee 100644 --- a/gdb/varobj.c +++ b/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); -- 2.30.2