* varobj.c (install_new_value): Always update print_value.

(value_get_print_value): Immediately return NULL for missing
	values.

	* gdb.mi/mi-var-cmd.exp: Expect lpcharacter to update when
	lcharacter or linteger change.  Correct duplicated test name.
	* gdb.mi/mi2-var-cmd.exp: Likewise.
This commit is contained in:
Daniel Jacobowitz 2007-01-08 23:11:47 +00:00
parent 822b7cb4a1
commit 57e6678071
5 changed files with 51 additions and 12 deletions

View file

@ -1,3 +1,9 @@
2007-01-08 Daniel Jacobowitz <dan@codesourcery.com>
* varobj.c (install_new_value): Always update print_value.
(value_get_print_value): Immediately return NULL for missing
values.
2007-01-08 Jim Blandy <jimb@codesourcery.com> 2007-01-08 Jim Blandy <jimb@codesourcery.com>
* configure.ac: Tighten pattern for extracting value of * configure.ac: Tighten pattern for extracting value of

View file

@ -1,3 +1,10 @@
2007-01-08 Nick Roberts <nickrob@snap.net.nz>
Daniel Jacobowitz <dan@codesourcery.com>
* gdb.mi/mi-var-cmd.exp: Expect lpcharacter to update when
lcharacter or linteger change. Correct duplicated test name.
* gdb.mi/mi2-var-cmd.exp: Likewise.
2007-01-08 Daniel Jacobowitz <dan@codesourcery.com> 2007-01-08 Daniel Jacobowitz <dan@codesourcery.com>
* gdb.threads/sigthread.c, gdb.threads/sigthread.exp: New. * gdb.threads/sigthread.c, gdb.threads/sigthread.exp: New.

View file

@ -261,8 +261,8 @@ mi_execute_to "exec-step 8" "end-stepping-range" "do_locals_tests" "" \
# Note: this test also checks that lpsimple->integer and lsimple.integer have # Note: this test also checks that lpsimple->integer and lsimple.integer have
# changed (they are the same) # changed (they are the same)
mi_gdb_test "-var-update *" \ mi_gdb_test "-var-update *" \
"\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \ "\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
"update all vars: func and lpsimple changed" "update all vars: lsimple and others changed"
### ###
@ -278,8 +278,13 @@ mi_gdb_test "-var-assign linteger 3333" \
"\\^done,value=\"3333\"" \ "\\^done,value=\"3333\"" \
"assign to linteger" "assign to linteger"
# Allow lpcharacter to update, optionally. Because it points to a
# char variable instead of a zero-terminated string, if linteger is
# directly after it in memory the printed characters may appear to
# change.
set lpchar_update "\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\},"
mi_gdb_test "-var-update *" \ mi_gdb_test "-var-update *" \
"\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \ "\\^done,changelist=\\\[($lpchar_update)?\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
"update all vars: linteger changed after assign" "update all vars: linteger changed after assign"
mi_gdb_test "-var-assign linteger 3333" \ mi_gdb_test "-var-assign linteger 3333" \

View file

@ -261,8 +261,8 @@ mi_execute_to "exec-step 8" "end-stepping-range" "do_locals_tests" "" \
# Note: this test also checks that lpsimple->integer and lsimple.integer have # Note: this test also checks that lpsimple->integer and lsimple.integer have
# changed (they are the same) # changed (they are the same)
mi_gdb_test "-var-update *" \ mi_gdb_test "-var-update *" \
"\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \ "\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
"update all vars: func and lpsimple changed" "update all vars: lsimple and others changed"
### ###
@ -278,8 +278,13 @@ mi_gdb_test "-var-assign linteger 3333" \
"\\^done,value=\"3333\"" \ "\\^done,value=\"3333\"" \
"assign to linteger" "assign to linteger"
# Allow lpcharacter to update, optionally. Because it points to a
# char variable instead of a zero-terminated string, if linteger is
# directly after it in memory the printed characters may appear to
# change.
set lpchar_update "\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\},"
mi_gdb_test "-var-update *" \ mi_gdb_test "-var-update *" \
"\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \ "\\^done,changelist=\\\[($lpchar_update)?\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
"update all vars: linteger changed after assign" "update all vars: linteger changed after assign"
mi_gdb_test "-var-assign linteger 3333" \ mi_gdb_test "-var-assign linteger 3333" \

View file

@ -966,9 +966,13 @@ install_new_value (struct varobj *var, struct value *value, int initial)
/* If the value of the varobj was changed by -var-set-value, then the /* If the value of the varobj was changed by -var-set-value, then the
value in the varobj and in the target is the same. However, that value value in the varobj and in the target is the same. However, that value
is different from the value that the varobj had after the previous is different from the value that the varobj had after the previous
-var-update. So need to the varobj as changed. */ -var-update. So need to the varobj as changed. */
if (var->updated) if (var->updated)
changed = 1; {
xfree (var->print_value);
var->print_value = value_get_print_value (value, var->format);
changed = 1;
}
else else
{ {
/* Try to compare the values. That requires that both /* Try to compare the values. That requires that both
@ -979,7 +983,11 @@ install_new_value (struct varobj *var, struct value *value, int initial)
/* Equal. */ /* Equal. */
; ;
else if (var->value == NULL || value == NULL) else if (var->value == NULL || value == NULL)
changed = 1; {
xfree (var->print_value);
var->print_value = value_get_print_value (value, var->format);
changed = 1;
}
else else
{ {
char *print_value; char *print_value;
@ -987,6 +995,7 @@ install_new_value (struct varobj *var, struct value *value, int initial)
gdb_assert (!value_lazy (value)); gdb_assert (!value_lazy (value));
print_value = value_get_print_value (value, var->format); print_value = value_get_print_value (value, var->format);
gdb_assert (var->print_value != NULL && print_value != NULL);
if (strcmp (var->print_value, print_value) != 0) if (strcmp (var->print_value, print_value) != 0)
{ {
xfree (var->print_value); xfree (var->print_value);
@ -1687,12 +1696,19 @@ static char *
value_get_print_value (struct value *value, enum varobj_display_formats format) value_get_print_value (struct value *value, enum varobj_display_formats format)
{ {
long dummy; long dummy;
struct ui_file *stb = mem_fileopen (); struct ui_file *stb;
struct cleanup *old_chain = make_cleanup_ui_file_delete (stb); struct cleanup *old_chain;
char *thevalue; char *thevalue;
if (value == NULL)
return NULL;
stb = mem_fileopen ();
old_chain = make_cleanup_ui_file_delete (stb);
common_val_print (value, stb, format_code[(int) format], 1, 0, 0); common_val_print (value, stb, format_code[(int) format], 1, 0, 0);
thevalue = ui_file_xstrdup (stb, &dummy); thevalue = ui_file_xstrdup (stb, &dummy);
do_cleanups (old_chain); do_cleanups (old_chain);
return thevalue; return thevalue;
} }