From 6cd67beaae58c9e870b79feea3cf74ffdf7a9b33 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 8 Nov 2016 16:18:24 -0700 Subject: [PATCH] Introduce gdbpy_enter_varobj and use it This introduces gdbpy_enter_varobj, a subclass of gdbpy_enter; then changes one function in py-varobj.c to use it. gdbpy_enter_varobj takes a varobj as an argument, similar to varobj_ensure_python_env. 2017-01-10 Tom Tromey * varobj.c (gdbpy_enter_varobj): New constructor. * python/python-internal.h (gdbpy_enter_varobj): New class. * python/py-varobj.c (py_varobj_get_iterator): Use gdbpy_enter_varobj. --- gdb/ChangeLog | 7 +++++++ gdb/python/py-varobj.c | 20 +++++++------------- gdb/python/python-internal.h | 12 ++++++++++++ gdb/varobj.c | 7 +++++++ 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 318c7845ca7..6bca72d57fb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2017-01-10 Tom Tromey + + * varobj.c (gdbpy_enter_varobj): New constructor. + * python/python-internal.h (gdbpy_enter_varobj): New class. + * python/py-varobj.c (py_varobj_get_iterator): Use + gdbpy_enter_varobj. + 2017-01-10 Tom Tromey * python/py-xmethods.c (gdbpy_get_xmethod_result_type): Use diff --git a/gdb/python/py-varobj.c b/gdb/python/py-varobj.c index c8684bd7e0b..ffdfa30a69f 100644 --- a/gdb/python/py-varobj.c +++ b/gdb/python/py-varobj.c @@ -17,6 +17,7 @@ #include "python-internal.h" #include "varobj.h" #include "varobj-iter.h" +#include "py-ref.h" /* A dynamic varobj iterator "class" for python pretty-printed varobjs. This inherits struct varobj_iter. */ @@ -167,28 +168,23 @@ py_varobj_iter_new (struct varobj *var, PyObject *pyiter) struct varobj_iter * py_varobj_get_iterator (struct varobj *var, PyObject *printer) { - PyObject *children; PyObject *iter; struct py_varobj_iter *py_iter; - struct cleanup *back_to = varobj_ensure_python_env (var); + + gdbpy_enter_varobj enter_py (var); if (!PyObject_HasAttr (printer, gdbpy_children_cst)) - { - do_cleanups (back_to); - return NULL; - } + return NULL; - children = PyObject_CallMethodObjArgs (printer, gdbpy_children_cst, - NULL); + gdbpy_ref children (PyObject_CallMethodObjArgs (printer, gdbpy_children_cst, + NULL)); if (children == NULL) { gdbpy_print_stack (); error (_("Null value returned for children")); } - make_cleanup_py_decref (children); - - iter = PyObject_GetIter (children); + iter = PyObject_GetIter (children.get ()); if (iter == NULL) { gdbpy_print_stack (); @@ -197,7 +193,5 @@ py_varobj_get_iterator (struct varobj *var, PyObject *printer) py_iter = py_varobj_iter_new (var, iter); - do_cleanups (back_to); - return &py_iter->base; } diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index a3b9b745edb..41275bb7d3e 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -526,6 +526,18 @@ class gdbpy_enter PyObject *m_error_type, *m_error_value, *m_error_traceback; }; +/* Like gdbpy_enter, but takes a varobj. This is a subclass just to + make constructor delegation a little nicer. */ +class gdbpy_enter_varobj : public gdbpy_enter +{ + public: + + /* This is defined in varobj.c, where it can access varobj + internals. */ + gdbpy_enter_varobj (const struct varobj *var); + +}; + struct cleanup *ensure_python_env (struct gdbarch *gdbarch, const struct language_defn *language); diff --git a/gdb/varobj.c b/gdb/varobj.c index 509cc7b7190..49df6f97fbe 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -233,6 +233,13 @@ varobj_ensure_python_env (const struct varobj *var) return ensure_python_env (var->root->exp->gdbarch, var->root->exp->language_defn); } + +/* See python-internal.h. */ +gdbpy_enter_varobj::gdbpy_enter_varobj (const struct varobj *var) +: gdbpy_enter (var->root->exp->gdbarch, var->root->exp->language_defn) +{ +} + #endif /* Return the full FRAME which corresponds to the given CORE_ADDR -- 2.30.2