diff options
author | Yao Qi <yao@codesourcery.com> | 2013-11-12 20:49:52 +0800 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2014-06-12 15:27:19 +0800 |
commit | 827f100cee10ed58ef9d22de35ba1d61db73e541 (patch) | |
tree | 8febcc9d98d73986516271aa1d92fa65a09d3cae /gdb/python | |
parent | e525021603958709381fc4dc296cc2586aaa5dd7 (diff) | |
download | gdb-827f100cee10ed58ef9d22de35ba1d61db73e541.zip gdb-827f100cee10ed58ef9d22de35ba1d61db73e541.tar.gz gdb-827f100cee10ed58ef9d22de35ba1d61db73e541.tar.bz2 |
Iterate over 'struct varobj_item' instead of PyObject
In previous patch, "saved_item" is still a PyOjbect and iteration is
still performed over PyObject. This patch continues to decouple
iteration from python code, so it changes its type to "struct
varobj_item *", so that the iterator itself is independent of python.
V2:
- Call varobj_delete_iter in free_variable.
- Fix changelog entries.
- Use XNEW.
V3:
- Return NULL early in py_varobj_iter_next if gdb_python_initialized
is false.
gdb:
2014-06-12 Pedro Alves <pedro@codesourcery.com>
Yao Qi <yao@codesourcery.com>
* python/py-varobj.c (py_varobj_iter_next): Return NULL if
gdb_python_initialized is false. Move some code from varobj.c.
* varobj-iter.h (struct varobj_item): Moved from varobj.c.
* varobj.c: Move "varobj-iter.h" inclusion earlier.
(struct varobj_item): Moved to varobj-iter.h".
(varobj_clear_saved_item): New function.
(update_dynamic_varobj_children): Move python-related code to
py-varobj.c.
(free_variable): Call varobj_clear_saved_item and
varobj_iter_delete.
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-varobj.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/gdb/python/py-varobj.c b/gdb/python/py-varobj.c index 2b95348..7dfe67c 100644 --- a/gdb/python/py-varobj.c +++ b/gdb/python/py-varobj.c @@ -54,6 +54,12 @@ py_varobj_iter_next (struct varobj_iter *self) struct py_varobj_iter *t = (struct py_varobj_iter *) self; struct cleanup *back_to; PyObject *item; + PyObject *py_v; + varobj_item *vitem; + const char *name = NULL; + + if (!gdb_python_initialized) + return NULL; back_to = varobj_ensure_python_env (self->var); @@ -101,9 +107,21 @@ py_varobj_iter_next (struct varobj_iter *self) } } + if (!PyArg_ParseTuple (item, "sO", &name, &py_v)) + { + gdbpy_print_stack (); + error (_("Invalid item from the child list")); + } + + vitem = xmalloc (sizeof *vitem); + vitem->value = convert_value_from_python (py_v); + if (vitem->value == NULL) + gdbpy_print_stack (); + vitem->name = xstrdup (name); + self->next_raw_index++; do_cleanups (back_to); - return item; + return vitem; } /* The 'vtable' of pretty-printed python varobj iterators. */ |