MI testsuite failures [PATCH]
Nick Roberts
nickrob@snap.net.nz
Mon Jan 8 05:53:00 GMT 2007
> After this I plan to fix the testsuite failures so I can then
> add the field for -var-update.
Here's a patch with fixes for the testsuite. I've made a further change to
varobj.c to fix a failure in mi-var-child.exp. I'm not sure what
saved_input_radix does because currently GDB can return from varobj_set_value
without restoring input_radix.
I've fixed mi-var-cmd.exp and mi-var-display.exp but nor their mi2
counterparts. I can easily do this but I'd rather just remove the mi2-*.exp
files completely especially with the changes needed for the proposed change to
-var-update. Is this an option?
--
Nick http://www.inet.net.nz/~nickrob
2007-01-08 Nick Roberts <nickrob@snap.net.nz>
* varobj.h: Declare varobj_set_value as char*.
* varobj.c (varobj_set_value): Make type char*. Return new value but
don't install it.
* mi/mi-cmd-var.c (mi_cmd_var_assign): Don't use varobj_get_value.
2007-01-08 Nick Roberts <nickrob@snap.net.nz>
* gdb.mi/mi-var-cmd.exp: Add fields to changelists for string
contents changes. After -var-assign, do -var-update before
-var-evaluate-expression.
* gdb.mi/mi-var-display.exp: After -var-assign, do -var-update
before -var-evaluate-expression.
Index: varobj.h
===================================================================
RCS file: /cvs/src/src/gdb/varobj.h,v
retrieving revision 1.6
diff -c -p -r1.6 varobj.h
*** varobj.h 17 Dec 2005 22:34:03 -0000 1.6
--- varobj.h 8 Jan 2007 05:37:44 -0000
*************** extern int varobj_get_attributes (struct
*** 93,99 ****
extern char *varobj_get_value (struct varobj *var);
! extern int varobj_set_value (struct varobj *var, char *expression);
extern int varobj_list (struct varobj ***rootlist);
--- 93,99 ----
extern char *varobj_get_value (struct varobj *var);
! extern char* varobj_set_value (struct varobj *var, char *expression);
extern int varobj_list (struct varobj ***rootlist);
Index: varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/varobj.c,v
retrieving revision 1.76
diff -c -p -r1.76 varobj.c
*** varobj.c 5 Jan 2007 21:58:48 -0000 1.76
--- varobj.c 8 Jan 2007 05:37:47 -0000
*************** struct varobj
*** 130,138 ****
/* The format of the output for this object */
enum varobj_display_formats format;
- /* Was this variable updated via a varobj_set_value operation */
- int updated;
-
/* Last print value. */
char *print_value;
};
--- 130,135 ----
*************** varobj_get_value (struct varobj *var)
*** 797,808 ****
value of the given expression */
/* Note: Invokes functions that can call error() */
! int
varobj_set_value (struct varobj *var, char *expression)
{
struct value *val;
! int offset = 0;
! int error = 0;
/* The argument "expression" contains the variable's new value.
We need to first construct a legal expression for this -- ugh! */
--- 794,804 ----
value of the given expression */
/* Note: Invokes functions that can call error() */
! char*
varobj_set_value (struct varobj *var, char *expression)
{
struct value *val;
! char* print_value;
/* The argument "expression" contains the variable's new value.
We need to first construct a legal expression for this -- ugh! */
*************** varobj_set_value (struct varobj *var, ch
*** 822,864 ****
{
/* We cannot proceed without a valid expression. */
xfree (exp);
! return 0;
}
- /* All types that are editable must also be changeable. */
- gdb_assert (varobj_value_is_changeable_p (var));
-
- /* The value of a changeable variable object must not be lazy. */
- gdb_assert (!value_lazy (var->value));
-
- /* Need to coerce the input. We want to check if the
- value of the variable object will be different
- after assignment, and the first thing value_assign
- does is coerce the input.
- For example, if we are assigning an array to a pointer variable we
- should compare the pointer with the the array's address, not with the
- array's content. */
- value = coerce_array (value);
-
- /* The new value may be lazy. gdb_value_assign, or
- rather value_contents, will take care of this.
- If fetching of the new value will fail, gdb_value_assign
- with catch the exception. */
if (!gdb_value_assign (var->value, value, &val))
return 0;
!
! /* If the value has changed, record it, so that next -var-update can
! report this change. If a variable had a value of '1', we've set it
! to '333' and then set again to '1', when -var-update will report this
! variable as changed -- because the first assignment has set the
! 'updated' flag. There's no need to optimize that, because return value
! of -var-update should be considered an approximation. */
! var->updated = install_new_value (var, val, 0 /* Compare values. */);
input_radix = saved_input_radix;
! return 1;
}
! return 0;
}
/* Returns a malloc'ed list with all root variable objects */
--- 818,836 ----
{
/* We cannot proceed without a valid expression. */
xfree (exp);
! return NULL;
}
if (!gdb_value_assign (var->value, value, &val))
return 0;
!
! print_value = value_get_print_value (val, var->format);
input_radix = saved_input_radix;
!
! return print_value;
}
! return NULL;
}
/* Returns a malloc'ed list with all root variable objects */
*************** install_new_value (struct varobj *var, s
*** 963,1001 ****
var->print_value = value_get_print_value (value, var->format);
else if (changeable)
{
! /* 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
! is different from the value that the varobj had after the previous
! -var-update. So need to the varobj as changed. */
! if (var->updated)
changed = 1;
! else
{
! /* Try to compare the values. That requires that both
! values are non-lazy. */
!
! /* Quick comparison of NULL values. */
! if (var->value == NULL && value == NULL)
! /* Equal. */
! ;
! else if (var->value == NULL || value == NULL)
! changed = 1;
! else
! {
! char *print_value;
! gdb_assert (!value_lazy (var->value));
! gdb_assert (!value_lazy (value));
! print_value = value_get_print_value (value, var->format);
! if (strcmp (var->print_value, print_value) != 0)
! {
! xfree (var->print_value);
! var->print_value = print_value;
! changed = 1;
! }
! else
! xfree (print_value);
}
}
}
--- 935,963 ----
var->print_value = value_get_print_value (value, var->format);
else if (changeable)
{
! /* Try to compare the values. That requires that both
! values are non-lazy. */
!
! /* Quick comparison of NULL values. */
! if (var->value == NULL && value == NULL)
! /* Equal. */
! ;
! else if (value == NULL)
changed = 1;
! else
{
! char *print_value;
! gdb_assert (!value_lazy (value));
! print_value = value_get_print_value (value, var->format);
! if (strcmp (var->print_value, print_value) != 0)
! {
! xfree (var->print_value);
! var->print_value = print_value;
! changed = 1;
}
+ else
+ xfree (print_value);
}
}
*************** install_new_value (struct varobj *var, s
*** 1003,1009 ****
if (var->value != NULL)
value_free (var->value);
var->value = value;
- var->updated = 0;
gdb_assert (!var->value || value_type (var->value));
--- 965,970 ----
*************** varobj_update (struct varobj **varp, str
*** 1116,1122 ****
{
/* Note that it's changed */
VEC_safe_push (varobj_p, result, v);
- v->updated = 0;
}
}
}
--- 1077,1082 ----
*************** new_variable (void)
*** 1390,1396 ****
var->children = NULL;
var->format = 0;
var->root = NULL;
- var->updated = 0;
var->print_value = NULL;
return var;
--- 1350,1355 ----
Index: mi/mi-cmd-var.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmd-var.c,v
retrieving revision 1.27
diff -c -p -r1.27 mi-cmd-var.c
*** mi/mi-cmd-var.c 8 Dec 2006 04:09:53 -0000 1.27
--- mi/mi-cmd-var.c 8 Jan 2007 05:37:49 -0000
*************** enum mi_cmd_result
*** 447,453 ****
mi_cmd_var_assign (char *command, char **argv, int argc)
{
struct varobj *var;
! char *expression;
if (argc != 2)
error (_("mi_cmd_var_assign: Usage: NAME EXPRESSION."));
--- 447,453 ----
mi_cmd_var_assign (char *command, char **argv, int argc)
{
struct varobj *var;
! char *expression, *print_value;
if (argc != 2)
error (_("mi_cmd_var_assign: Usage: NAME EXPRESSION."));
*************** mi_cmd_var_assign (char *command, char *
*** 463,472 ****
expression = xstrdup (argv[1]);
! if (!varobj_set_value (var, expression))
error (_("mi_cmd_var_assign: Could not assign expression to varible object"));
! ui_out_field_string (uiout, "value", varobj_get_value (var));
return MI_CMD_DONE;
}
--- 463,474 ----
expression = xstrdup (argv[1]);
! print_value = varobj_set_value (var, expression);
!
! if (!print_value)
error (_("mi_cmd_var_assign: Could not assign expression to varible object"));
! ui_out_field_string (uiout, "value", print_value);
return MI_CMD_DONE;
}
Index: testsuite/gdb.mi/mi-var-cmd.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-cmd.exp,v
retrieving revision 1.22
diff -c -p -r1.22 mi-var-cmd.exp
*** testsuite/gdb.mi/mi-var-cmd.exp 4 Jan 2007 21:59:10 -0000 1.22
--- testsuite/gdb.mi/mi-var-cmd.exp 8 Jan 2007 05:37:50 -0000
*************** mi_execute_to "exec-step 8" "end-steppin
*** 261,267 ****
# Note: this test also checks that lpsimple->integer and lsimple.integer have
# changed (they are the same)
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\"\}\\\]" \
"update all vars: func and lpsimple changed"
--- 261,267 ----
# Note: this test also checks that lpsimple->integer and lsimple.integer have
# changed (they are the same)
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=\"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"
*************** mi_gdb_test "-var-assign linteger 3333"
*** 279,285 ****
"assign to linteger"
mi_gdb_test "-var-update *" \
! "\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
"update all vars: linteger changed after assign"
mi_gdb_test "-var-assign linteger 3333" \
--- 279,285 ----
"assign to linteger"
mi_gdb_test "-var-update *" \
! "\\^done,changelist=\\\[\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
"update all vars: linteger changed after assign"
mi_gdb_test "-var-assign linteger 3333" \
*************** mi_gdb_test "-var-assign lcharacter 'z'"
*** 324,329 ****
--- 324,332 ----
"\\^done,value=\"122 'z'\"" \
"assign to lcharacter"
+ mi_gdb_test "-var-update *" \
+ "\\^done,changelist=.*" \
+ "var update"
mi_gdb_test "-var-evaluate-expression lcharacter" \
"\\^done,value=\"122 'z'\"" \
"eval lcharacter"
*************** mi_gdb_test "-var-evaluate-expression lc
*** 331,336 ****
--- 334,342 ----
mi_gdb_test "-var-assign llong 1313L" \
"\\^done,value=\"1313\"" \
"assign to llong"
+ mi_gdb_test "-var-update *" \
+ "\\^done,changelist=.*" \
+ "var update"
mi_gdb_test "-var-evaluate-expression llong" \
"\\^done,value=\"1313\"" \
"eval llong"
*************** mi_gdb_test "-var-assign lplong &llong"
*** 351,356 ****
--- 357,365 ----
mi_gdb_test "-var-assign lfloat 3.4567" \
"\\^done,value=\"3.45.*\"" \
"assign to lfloat"
+ mi_gdb_test "-var-update *" \
+ "\\^done,changelist=.*" \
+ "var update"
mi_gdb_test "-var-evaluate-expression lfloat" \
"\\^done,value=\"3.45.*\"" \
"eval lfloat"
Index: testsuite/gdb.mi/mi-var-display.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-display.exp,v
retrieving revision 1.15
diff -c -p -r1.15 mi-var-display.exp
*** testsuite/gdb.mi/mi-var-display.exp 10 Aug 2006 05:27:21 -0000 1.15
--- testsuite/gdb.mi/mi-var-display.exp 8 Jan 2007 05:37:51 -0000
*************** mi_gdb_test "-var-assign bar 3" \
*** 108,114 ****
mi_gdb_test "-var-set-format bar decimal" \
"\\^done,format=\"decimal\"" \
"set format variable bar"
!
mi_gdb_test "-var-evaluate-expression bar" \
"\\^done,value=\"3\"" \
"eval variable bar with new value"
--- 108,116 ----
mi_gdb_test "-var-set-format bar decimal" \
"\\^done,format=\"decimal\"" \
"set format variable bar"
! mi_gdb_test "-var-update *" \
! "\\^done,changelist=.*" \
! "var update"
mi_gdb_test "-var-evaluate-expression bar" \
"\\^done,value=\"3\"" \
"eval variable bar with new value"
*************** mi_gdb_test "-var-set-format foo decimal
*** 169,174 ****
--- 171,179 ----
# Test: c_variable-6.18
# Desc: check new value of foo
+ mi_gdb_test "-var-update *" \
+ "\\^done,changelist=.*" \
+ "var update"
mi_gdb_test "-var-evaluate-expression foo" \
"\\^done,value=\"3\"" \
"eval variable foo"
More information about the Gdb-patches
mailing list