Always report varobj as changed when in_scope attribute changes.
authorVladimir Prus <vladimir@codesourcery.com>
Sun, 17 May 2009 07:13:19 +0000 (07:13 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Sun, 17 May 2009 07:13:19 +0000 (07:13 +0000)
* varobj.c (install_new_value): If non-NULL-ness of value
changed, return 1.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-var-cmd.exp
gdb/varobj.c

index 14b12deec2f263dc88db305ad364fe92c4a313cb..b676f116a1f7cf20f511f307bdc3d205058887d1 100644 (file)
@@ -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.
index a9d5de7c1b334937f87b63ae5823e1a3e8bbfccf..54d1de64ea977fdfb22322dfc37bc3503e6ed386 100644 (file)
@@ -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.
index ffe0b799cafd1a6bda16af4bda198cc6656a633c..78b30bd920565930239d481b28d8677b809d4fdd 100644 (file)
@@ -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
index 8ec67b77cf17fa31286873cb9cebafadcb455038..d36e46d8ceea252cc064f7ed0d495f27e33a299c 100644 (file)
@@ -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);