From 2c12abee48e5615dd8573bbafd1b8a167967147d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 6 Aug 2012 18:44:45 +0000 Subject: [PATCH] PR python/14386: * varobj.c (update_dynamic_varobj_children): Don't call PyIter_Check. gdb/testsuite * gdb.python/py-mi.exp: Add test for printer whose children are a list. * gdb.python/py-prettyprint.c (struct children_as_list): New. (main): New variable children_as_list. * gdb.python/py-prettyprint.py (class pp_children_as_list): New. (register_pretty_printers): Register new printer. --- gdb/ChangeLog | 6 ++++++ gdb/testsuite/ChangeLog | 10 ++++++++++ gdb/testsuite/gdb.python/py-mi.exp | 4 ++++ gdb/testsuite/gdb.python/py-prettyprint.c | 5 +++++ gdb/testsuite/gdb.python/py-prettyprint.py | 15 +++++++++++++++ gdb/varobj.c | 3 --- 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e36f729..e2ff0a9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2012-08-06 Tom Tromey + PR python/14386: + * varobj.c (update_dynamic_varobj_children): Don't call + PyIter_Check. + +2012-08-06 Tom Tromey + PR cli/14392: * cli/cli-cmds.c (list_command): Filter 'sals_end'. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index debce65..3f2e496 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2012-08-06 Tom Tromey + + * gdb.python/py-mi.exp: Add test for printer whose children + are a list. + * gdb.python/py-prettyprint.c (struct children_as_list): New. + (main): New variable children_as_list. + * gdb.python/py-prettyprint.py (class pp_children_as_list): + New. + (register_pretty_printers): Register new printer. + 2012-08-03 Edjunior Machado * gdb.base/valgrind-infcall.exp: Expect leading `.' on ppc64's diff --git a/gdb/testsuite/gdb.python/py-mi.exp b/gdb/testsuite/gdb.python/py-mi.exp index a792e44..e7034a1 100644 --- a/gdb/testsuite/gdb.python/py-mi.exp +++ b/gdb/testsuite/gdb.python/py-mi.exp @@ -289,6 +289,10 @@ mi_gdb_test "-var-evaluate-expression me" \ "\\^done,value=\".*\"" \ "evaluate me varobj" +# Regression test for python/14836. +mi_create_dynamic_varobj children_as_list children_as_list \ + "printer whose children are returned as a list" + # C++ MI tests gdb_exit if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}-cxx" \ diff --git a/gdb/testsuite/gdb.python/py-prettyprint.c b/gdb/testsuite/gdb.python/py-prettyprint.c index 1ff9e05..b1a12b1 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.c +++ b/gdb/testsuite/gdb.python/py-prettyprint.c @@ -48,6 +48,10 @@ struct hint_error { int x; }; +struct children_as_list { + int x; +}; + #ifdef __cplusplus struct S : public s { int zs; @@ -252,6 +256,7 @@ main () struct ns ns, ns2; struct lazystring estring, estring2; struct hint_error hint_error; + struct children_as_list children_as_list; nstype.elements = narray; nstype.len = 0; diff --git a/gdb/testsuite/gdb.python/py-prettyprint.py b/gdb/testsuite/gdb.python/py-prettyprint.py index b02b90f..6e960e6 100644 --- a/gdb/testsuite/gdb.python/py-prettyprint.py +++ b/gdb/testsuite/gdb.python/py-prettyprint.py @@ -174,6 +174,18 @@ class pp_hint_error: def display_hint (self): raise Exception("hint failed") +class pp_children_as_list: + "Throw error from display_hint" + + def __init__(self, val): + self.val = val + + def to_string(self): + return 'children_as_list_val' + + def children (self): + return [('one', 1)] + class pp_outer: "Print struct outer" @@ -282,6 +294,9 @@ def register_pretty_printers (): pretty_printers_dict[re.compile ('^struct hint_error$')] = pp_hint_error pretty_printers_dict[re.compile ('^hint_error$')] = pp_hint_error + pretty_printers_dict[re.compile ('^struct children_as_list$')] = pp_children_as_list + pretty_printers_dict[re.compile ('^children_as_list$')] = pp_children_as_list + pretty_printers_dict[re.compile ('^memory_error$')] = MemoryErrorString pretty_printers_dict[re.compile ('^eval_type_s$')] = pp_eval_type diff --git a/gdb/varobj.c b/gdb/varobj.c index c345c80..6699699 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -1114,9 +1114,6 @@ update_dynamic_varobj_children (struct varobj *var, make_cleanup_py_decref (children); - if (!PyIter_Check (children)) - error (_("Returned value is not iterable")); - Py_XDECREF (var->child_iter); var->child_iter = PyObject_GetIter (children); if (!var->child_iter) -- 2.7.4