Fix 'selected frame' varobjs.
authorVladimir Prus <vladimir@codesourcery.com>
Tue, 16 Jan 2007 02:12:49 +0000 (02:12 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Tue, 16 Jan 2007 02:12:49 +0000 (02:12 +0000)
        * 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.

gdb/ChangeLog
gdb/varobj.c

index e63821b0cceb65e8c6f1107af6a7b9e7c0beaaf1..73e1547514acc91c0e9e011bff303e0f346d800b 100644 (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
index 27c27610eb754b8fe114468db89e7be57ae12132..dc1c356a0b420a3460353e3358be0cc9ec74f9b5 100644 (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;
 }
 \f
@@ -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;
     }