2012-12-06 Jens Elmenthaler <jens.elmenthaler@advantest.com>

PR mi/14741:
	* mi/mi-cmd-var.c (varobj_update_one): Take value of
	attribute "dynamic" and "displayhint" from printed child,
	not the root variable.

	* gdb.python/py-mi.exp: Correct expected results for attribute
	"dynamic" returned by -var-update.
	Add test case for correct handling of "diplayhint" for children
	of dynamic varobjs.
	* gdb.python/py-prettyprint.c (set_itme): New function.
	(bug_14741) New function.
	(main) Add call to bug_14741().
	* gdb.python/py-prettyprint.py (class ArrayPrinter): New class.
This commit is contained in:
Tom Tromey 2012-12-06 18:59:57 +00:00
parent cd6fa7fd88
commit 731145cb17
6 changed files with 92 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2012-12-06 Jens Elmenthaler <jens.elmenthaler@advantest.com>
PR mi/14741:
* mi/mi-cmd-var.c (varobj_update_one): Take value of
attribute "dynamic" and "displayhint" from printed child,
not the root variable.
2012-12-06 Joel Brobecker <brobecker@adacore.com>
* aix-thread.c (getthrds): Fix type of 4th parameter.

View File

@ -793,14 +793,14 @@ varobj_update_one (struct varobj *var, enum print_values print_values,
ui_out_field_int (uiout, "new_num_children",
varobj_get_num_children (r->varobj));
display_hint = varobj_get_display_hint (var);
display_hint = varobj_get_display_hint (r->varobj);
if (display_hint)
{
ui_out_field_string (uiout, "displayhint", display_hint);
xfree (display_hint);
}
if (varobj_pretty_printed_p (var))
if (varobj_pretty_printed_p (r->varobj))
ui_out_field_int (uiout, "dynamic", 1);
varobj_get_child_range (r->varobj, &from, &to);

View File

@ -1,3 +1,14 @@
2012-12-06 Jens Elmenthaler <jens.elmenthaler@advantest.com>
* gdb.python/py-mi.exp: Correct expected results for attribute
"dynamic" returned by -var-update.
Add test case for correct handling of "diplayhint" for children
of dynamic varobjs.
* gdb.python/py-prettyprint.c (set_itme): New function.
(bug_14741) New function.
(main) Add call to bug_14741().
* gdb.python/py-prettyprint.py (class ArrayPrinter): New class.
2012-12-05 Ulrich Weigand <uweigand@de.ibm.com>
* gdb.base/gnu-debugdata.exp: Also include "D" symbols in

View File

@ -182,7 +182,7 @@ mi_varobj_update_dynamic container \
"update after next with restricted range" {
type_changed false new_num_children 1 dynamic 1 has_more 1
} {
{ name {container.\[0\]} in_scope true type_changed false dynamic 1 has_more 0 }
{ name {container.\[0\]} in_scope true type_changed false has_more 0 }
} {
}
@ -239,7 +239,7 @@ mi_list_varobj_children outer.s {
mi_next "next over outer update"
mi_gdb_test "-var-update outer" \
".done,changelist=.{name=\"outer.s.a\",in_scope=\"true\",type_changed=\"false\",dynamic=\"1\",has_more=\"0\"}." \
".done,changelist=.{name=\"outer.s.a\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"}." \
"update after updating element of outer"
mi_continue_to_line \
@ -293,6 +293,28 @@ mi_gdb_test "-var-evaluate-expression me" \
mi_create_dynamic_varobj children_as_list children_as_list \
"printer whose children are returned as a list"
# Regression test for bug 14741.
mi_continue_to_line \
[gdb_get_line_number {breakpoint bug 14741} ${srcfile}] \
"step to breakpoint for bug 14741"
mi_create_dynamic_varobj c c \
"create varobj for c"
mi_gdb_test "-var-set-visualizer c ArrayPrinter" \
"\\^done" \
"choose array visualizer for c"
mi_list_varobj_children c {
{ {c.\[0\]} {\[0\]} 0 int }
} "list children of c"
mi_next "next over change of array element"
mi_gdb_test "-var-update c" \
"\\^done,changelist=\\\[{name=\"c.\\\[0\\\]\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"}\\\]" \
"update varobj after element change"
# C++ MI tests
gdb_exit
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}-cxx" \

View File

@ -196,6 +196,13 @@ add_item (zzz_type *c, int val)
++c->len;
}
void
set_item(zzz_type *c, int i, int val)
{
if (i < c->len)
c->elements[i] = val;
}
void init_s(struct s *s, int a)
{
s->a = a;
@ -239,6 +246,15 @@ eval_sub (void)
eval1.x++; /* eval-break */
}
static void
bug_14741()
{
zzz_type c = make_container ("bug_14741");
add_item (&c, 71);
set_item(&c, 0, 42); /* breakpoint bug 14741 */
set_item(&c, 0, 5);
}
int
main ()
{
@ -332,5 +348,6 @@ main ()
eval_sub ();
return 0; /* break to inspect struct and union */
bug_14741(); /* break to inspect struct and union */
return 0;
}

View File

@ -54,6 +54,36 @@ class ContainerPrinter:
def children(self):
return self._iterator(self.val['elements'], self.val['len'])
# Treats a container as array.
class ArrayPrinter:
class _iterator:
def __init__ (self, pointer, len):
self.start = pointer
self.pointer = pointer
self.end = pointer + len
def __iter__(self):
return self
def next(self):
if self.pointer == self.end:
raise StopIteration
result = self.pointer
self.pointer = self.pointer + 1
return ('[%d]' % int (result - self.start), result.dereference())
def __init__(self, val):
self.val = val
def to_string(self):
return 'array %s with %d elements' % (self.val['name'], self.val['len'])
def children(self):
return self._iterator(self.val['elements'], self.val['len'])
def display_hint (self):
return 'array'
# Flag to make NoStringContainerPrinter throw an exception.
exception_flag = False