Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* Fix 'selected frame' varobjs
@ 2006-12-31  0:02 Vladimir Prus
  2006-12-31 21:42 ` Daniel Jacobowitz
  0 siblings, 1 reply; 5+ messages in thread
From: Vladimir Prus @ 2006-12-31  0:02 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 765 bytes --]


At the moment, the 'selected frame' varobjs (created with -var-create NAME @) are
somewhat broken.

I've reported that in:

	http://article.gmane.org/gmane.comp.gdb.devel/16381

to which Dan posted a preliminary patch to which I replied with another bug:

	http://article.gmane.org/gmane.comp.gdb.devel/16398

and the story ended there. This patch fixed both problems and causes no
regressions. OK?

- Volodya

2006-12-31  Daniel Jacobowitz  <dan@codesourcery.com>
	    Vladimir Prus  <vladimir@codesourcery.com>

	Fix 'selected frame' varobjs.
	* varobj.c (varobj_update): If we get error getting new
	value of root, reset the value.
	(c_value_of_root): Always reevaluate the value
	of selected frame varobjs in the selected frame.
	Dont call reinit_frame_cache.

[-- Attachment #2: at_varobjs__gdb_mainline.diff --]
[-- Type: text/x-diff, Size: 936 bytes --]

--- gdb/varobj.c	(/mirrors/gdb_mainline)	(revision 3011)
+++ gdb/varobj.c	(/patches/gdb/at_varobjs/gdb_mainline)	(revision 3011)
@@ -1061,6 +1061,14 @@ varobj_update (struct varobj **varp, str
   if (new == NULL)
     {
       (*varp)->error = 1;
+      /* Also set the value to NULL, so that
+	 when the value becomes valid in future,
+	 -var-update notice the change.  */
+      if ((*varp)->value != NULL)
+	{
+	  value_free ((*varp)->value);
+	  (*varp)->value = NULL;
+	}
       return -1;
     }
 
@@ -1950,11 +1958,10 @@ c_value_of_root (struct varobj **var_han
 
 
   /* 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 */

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fix 'selected frame' varobjs
  2006-12-31  0:02 Fix 'selected frame' varobjs Vladimir Prus
@ 2006-12-31 21:42 ` Daniel Jacobowitz
  2007-01-09 21:22   ` Vladimir Prus
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2006-12-31 21:42 UTC (permalink / raw)
  To: Vladimir Prus; +Cc: gdb-patches

On Sun, Dec 31, 2006 at 03:01:42AM +0300, Vladimir Prus wrote:
> @@ -1061,6 +1061,14 @@ varobj_update (struct varobj **varp, str
>    if (new == NULL)
>      {
>        (*varp)->error = 1;
> +      /* Also set the value to NULL, so that
> +	 when the value becomes valid in future,
> +	 -var-update notice the change.  */
> +      if ((*varp)->value != NULL)
> +	{
> +	  value_free ((*varp)->value);
> +	  (*varp)->value = NULL;
> +	}
>        return -1;
>      }
>  

"in the future", "notices the change".  Should we be doing this
everywhere that we set var->error (probably add a new helper to do
that)?  There's about a half-dozen places.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fix 'selected frame' varobjs
  2006-12-31 21:42 ` Daniel Jacobowitz
@ 2007-01-09 21:22   ` Vladimir Prus
  2007-01-09 21:45     ` Daniel Jacobowitz
  0 siblings, 1 reply; 5+ messages in thread
From: Vladimir Prus @ 2007-01-09 21:22 UTC (permalink / raw)
  To: Daniel Jacobowitz, gdb-patches

[-- Attachment #1: Type: text/plain, Size: 1638 bytes --]

Daniel Jacobowitz wrote:

> On Sun, Dec 31, 2006 at 03:01:42AM +0300, Vladimir Prus wrote:
>> @@ -1061,6 +1061,14 @@ varobj_update (struct varobj **varp, str
>>    if (new == NULL)
>>      {
>>        (*varp)->error = 1;
>> +      /* Also set the value to NULL, so that
>> +     when the value becomes valid in future,
>> +     -var-update notice the change.  */
>> +      if ((*varp)->value != NULL)
>> +    {
>> +      value_free ((*varp)->value);
>> +      (*varp)->value = NULL;
>> +    }
>>        return -1;
>>      }
>>  
> 
> "in the future", "notices the change".  Should we be doing this
> everywhere that we set var->error (probably add a new helper to do
> that)?  There's about a half-dozen places.

I believe this was the only place where we don't set value to NULL on
errors. This reminded me that I wanted to remove var->error for quite some
time -- it's used in a single place, and using 'value == NULL' to indicate
error is quite as reasonable.

What about the attached?

- Volodya

2006-12-31  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.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: at_varobjs__gdb_mainline.diff --]
[-- Type: text/x-diff; name="at_varobjs__gdb_mainline.diff", Size: 4011 bytes --]

--- gdb/varobj.c	(/patches/gdb/varobj_update_memleak/gdb_mainline)	(revision 3137)
+++ gdb/varobj.c	(/patches/gdb/at_varobjs/gdb_mainline)	(revision 3137)
@@ -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, ch
   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, s
   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, s
     {
       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, str
   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, str
       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. */
@@ -1373,9 +1369,6 @@ create_child (struct varobj *parent, int
 						       child->index);
   install_new_value (child, value, 1);
 
-  if ((!CPLUS_FAKE_CHILD (child) && child->value == NULL) || parent->error)
-    child->error = 1;
-
   return child;
 }
 \f
@@ -1396,7 +1389,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;
@@ -1975,11 +1967,10 @@ c_value_of_root (struct varobj **var_han
 
 
   /* 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 */
@@ -2001,11 +1992,8 @@ c_value_of_root (struct varobj **var_han
          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;
     }

Property changes on: 
___________________________________________________________________
Name: csl:base
 +/all/patches/gdb/varobj_update_memleak/gdb_mainline
Name: svk:merge
 +d48a11ec-ee1c-0410-b3f5-c20844f99675:/patches/gdb/varobj_update_memleak/gdb_mainline:3134
 +e7755896-6108-0410-9592-8049d3e74e28:/mirrors/gdb/trunk:159718


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fix 'selected frame' varobjs
  2007-01-09 21:22   ` Vladimir Prus
@ 2007-01-09 21:45     ` Daniel Jacobowitz
  2007-01-16  2:14       ` Vladimir Prus
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2007-01-09 21:45 UTC (permalink / raw)
  To: Vladimir Prus; +Cc: gdb-patches

On Wed, Jan 10, 2007 at 12:20:55AM +0300, Vladimir Prus wrote:
> What about the attached?
> 
> - Volodya
> 
> 2006-12-31  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.

Looks good to me - this is OK.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fix 'selected frame' varobjs
  2007-01-09 21:45     ` Daniel Jacobowitz
@ 2007-01-16  2:14       ` Vladimir Prus
  0 siblings, 0 replies; 5+ messages in thread
From: Vladimir Prus @ 2007-01-16  2:14 UTC (permalink / raw)
  To: Daniel Jacobowitz, gdb-patches

Daniel Jacobowitz wrote:

> On Wed, Jan 10, 2007 at 12:20:55AM +0300, Vladimir Prus wrote:
>> What about the attached?
>> 
>> - Volodya
>> 
>> 2006-12-31  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.
> 
> Looks good to me - this is OK.

Checked in, thanks.

- Volodya


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-01-16  2:14 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-12-31  0:02 Fix 'selected frame' varobjs Vladimir Prus
2006-12-31 21:42 ` Daniel Jacobowitz
2007-01-09 21:22   ` Vladimir Prus
2007-01-09 21:45     ` Daniel Jacobowitz
2007-01-16  2:14       ` Vladimir Prus

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox