From: Nick Roberts <nickrob@snap.net.nz>
To: gdb-patches@sources.redhat.com
Subject: RFC: MI - Detecting change of string contents with variable objects
Date: Mon, 18 Dec 2006 02:42:00 -0000 [thread overview]
Message-ID: <17797.65268.689590.797944@kahikatea.snap.net.nz> (raw)
This post follows on from a thread earlier this month on the GDB mailing list
called "memory address ranges (-var-create)"
Currently variable objects treat strings as pointers so -var-update only
detects a change of address or, if the child is created, when the first
character changes. The patch below detects when the contents change which is
more useful. I've only tested it for C, but I guess it could work for other
languages that variable objects handle (C++, Java). The function
value_get_value gets both the address and string value but it's probably better
to just get the string value directly.
--
Nick http://www.inet.net.nz/~nickrob
*** varobj.c 11 Dec 2006 08:13:03 +1300 1.65
--- varobj.c 18 Dec 2006 15:06:23 +1300
*************** struct varobj
*** 101,106 ****
--- 101,107 ----
/* The type of this variable. This may NEVER be NULL. */
struct type *type;
+
/* The value of this expression or subexpression. This may be NULL.
Invariant: if type_changeable (this) is non-zero, the value is either
NULL, or not lazy. */
*************** struct varobj
*** 126,131 ****
--- 127,135 ----
/* Was this variable updated via a varobj_set_value operation */
int updated;
+
+ /* Last string value, if appropriate */
+ char *string_value;
};
/* Every variable keeps a linked list of its children, described
*************** static int variable_editable (struct var
*** 233,238 ****
--- 237,244 ----
static char *my_value_of_variable (struct varobj *var);
+ static char *value_get_value (struct value* value);
+
static int type_changeable (struct varobj *var);
/* C implementation */
*************** install_new_value (struct varobj *var, s
*** 983,1003 ****
if (!value_contents_equal (var->value, value))
changed = 1;
}
}
}
!
/* We must always keep the new value, since children depend on it. */
if (var->value != NULL)
value_free (var->value);
var->value = value;
var->updated = 0;
!
gdb_assert (!var->value || value_type (var->value));
return changed;
}
-
/* Update the values for a variable and its children. This is a
two-pronged attack. First, re-parse the value for the root's
--- 989,1025 ----
if (!value_contents_equal (var->value, value))
changed = 1;
+
+ if (variable_language (var) == vlang_c &&
+ !strcmp (varobj_get_type (var), "char *"))
+ {
+ if (var->string_value)
+ {
+ if (strcmp (var->string_value, value_get_value (value)))
+ {
+ free (var->string_value);
+ var->string_value =
+ xstrdup (value_get_value (value));
+ changed = 1;
+ }
+ }
+ else
+ var->string_value = xstrdup (value_get_value (value));
+ }
}
}
}
!
/* We must always keep the new value, since children depend on it. */
if (var->value != NULL)
value_free (var->value);
var->value = value;
var->updated = 0;
!
gdb_assert (!var->value || value_type (var->value));
return changed;
}
/* Update the values for a variable and its children. This is a
two-pronged attack. First, re-parse the value for the root's
*************** new_variable (void)
*** 1470,1475 ****
--- 1492,1498 ----
var->format = 0;
var->root = NULL;
var->updated = 0;
+ var->string_value = NULL;
return var;
}
*************** my_value_of_variable (struct varobj *var
*** 1785,1790 ****
--- 1808,1827 ----
return (*var->root->lang->value_of_variable) (var);
}
+ static char *
+ value_get_value (struct value* value)
+ {
+ long dummy;
+ struct ui_file *stb = mem_fileopen ();
+ struct cleanup *old_chain = make_cleanup_ui_file_delete (stb);
+ char *thevalue;
+
+ common_val_print (value, stb, 0, 1, 0, 0);
+ thevalue = ui_file_xstrdup (stb, &dummy);
+ do_cleanups (old_chain);
+ return thevalue;
+ }
+
/* Return non-zero if changes in value of VAR
must be detected and reported by -var-update.
Return zero is -var-update should never report
next reply other threads:[~2006-12-18 2:42 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-18 2:42 Nick Roberts [this message]
2006-12-18 7:01 ` Vladimir Prus
2006-12-18 8:15 ` Nick Roberts
2006-12-18 8:36 ` Vladimir Prus
2006-12-18 13:38 ` Daniel Jacobowitz
2006-12-18 21:57 ` Nick Roberts
2006-12-21 15:25 ` Vladimir Prus
2006-12-21 22:28 ` Nick Roberts
2006-12-22 6:16 ` Vladimir Prus
2006-12-22 7:16 ` Nick Roberts
2006-12-22 7:23 ` Vladimir Prus
2007-01-03 22:46 ` Daniel Jacobowitz
2007-01-04 4:13 ` Nick Roberts
2007-01-04 4:20 ` Daniel Jacobowitz
2007-01-04 6:10 ` Nick Roberts
2007-01-04 19:40 ` Daniel Jacobowitz
2007-01-04 20:35 ` Nick Roberts
2007-01-04 20:50 ` Daniel Jacobowitz
2007-01-04 21:00 ` Vladimir Prus
2007-01-05 4:46 ` Nick Roberts
2007-01-05 14:49 ` Daniel Jacobowitz
2007-01-05 21:54 ` Nick Roberts
2007-01-06 7:07 ` Vladimir Prus
2007-01-08 15:51 ` Daniel Jacobowitz
2007-01-08 21:30 ` Nick Roberts
2007-01-08 21:41 ` Daniel Jacobowitz
2007-01-04 20:57 ` Vladimir Prus
2007-01-05 2:26 ` Nick Roberts
2007-01-04 21:05 ` Vladimir Prus
2007-01-05 1:09 ` Nick Roberts
2007-01-05 14:44 ` Daniel Jacobowitz
2007-01-05 14:49 ` Vladimir Prus
2007-01-05 16:04 ` Jim Blandy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=17797.65268.689590.797944@kahikatea.snap.net.nz \
--to=nickrob@snap.net.nz \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox