From ee0a3fb85b33b172f704796612c4487ea368d675 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 6 Nov 2016 21:25:31 -0700 Subject: [PATCH] Use gdbpy_ref in py-framefilter.c This changes some code in py-framefilter.c to use gdbpy_ref. 2017-01-10 Tom Tromey * python/py-framefilter.c (extract_sym, extract_value) (get_py_iter_from_func, bootstrap_python_frame_filters): Use gdbpy_ref. --- gdb/ChangeLog | 6 +++ gdb/python/py-framefilter.c | 86 +++++++++++++------------------------ 2 files changed, 35 insertions(+), 57 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e2cf5b9f5e..1dc7b32803 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2017-01-10 Tom Tromey + + * python/py-framefilter.c (extract_sym, extract_value) + (get_py_iter_from_func, bootstrap_python_frame_filters): Use + gdbpy_ref. + 2017-01-10 Tom Tromey * python/py-breakpoint.c (gdbpy_breakpoints): Use gdbpy_ref. diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 434e43acf6..6d22321ef1 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -30,6 +30,7 @@ #include "demangle.h" #include "mi/mi-cmds.h" #include "python-internal.h" +#include "py-ref.h" enum mi_print_types { @@ -56,17 +57,16 @@ extract_sym (PyObject *obj, gdb::unique_xmalloc_ptr *name, struct symbol **sym, struct block **sym_block, const struct language_defn **language) { - PyObject *result = PyObject_CallMethod (obj, "symbol", NULL); + gdbpy_ref result (PyObject_CallMethod (obj, "symbol", NULL)); if (result == NULL) return EXT_LANG_BT_ERROR; /* For 'symbol' callback, the function can return a symbol or a string. */ - if (gdbpy_is_string (result)) + if (gdbpy_is_string (result.get ())) { - *name = python_string_to_host_string (result); - Py_DECREF (result); + *name = python_string_to_host_string (result.get ()); if (*name == NULL) return EXT_LANG_BT_ERROR; @@ -83,15 +83,13 @@ extract_sym (PyObject *obj, gdb::unique_xmalloc_ptr *name, { /* This type checks 'result' during the conversion so we just call it unconditionally and check the return. */ - *sym = symbol_object_to_symbol (result); + *sym = symbol_object_to_symbol (result.get ()); /* TODO: currently, we have no way to recover the block in which SYMBOL was found, so we have no block to return. Trying to evaluate SYMBOL will yield an incorrect value when it's located in a FRAME and evaluated from another frame (as permitted in nested functions). */ *sym_block = NULL; - Py_DECREF (result); - if (*sym == NULL) { PyErr_SetString (PyExc_RuntimeError, @@ -130,7 +128,7 @@ extract_value (PyObject *obj, struct value **value) { if (PyObject_HasAttrString (obj, "value")) { - PyObject *vresult = PyObject_CallMethod (obj, "value", NULL); + gdbpy_ref vresult (PyObject_CallMethod (obj, "value", NULL)); if (vresult == NULL) return EXT_LANG_BT_ERROR; @@ -140,14 +138,12 @@ extract_value (PyObject *obj, struct value **value) value. */ if (vresult == Py_None) { - Py_DECREF (vresult); *value = NULL; return EXT_LANG_BT_OK; } else { - *value = convert_value_from_python (vresult); - Py_DECREF (vresult); + *value = convert_value_from_python (vresult.get ()); if (*value == NULL) return EXT_LANG_BT_ERROR; @@ -316,20 +312,17 @@ get_py_iter_from_func (PyObject *filter, char *func) { if (PyObject_HasAttrString (filter, func)) { - PyObject *result = PyObject_CallMethod (filter, func, NULL); + gdbpy_ref result (PyObject_CallMethod (filter, func, NULL)); if (result != NULL) { if (result == Py_None) { - return result; + return result.release (); } else { - PyObject *iterator = PyObject_GetIter (result); - - Py_DECREF (result); - return iterator; + return PyObject_GetIter (result.get ()); } } } @@ -1441,60 +1434,39 @@ static PyObject * bootstrap_python_frame_filters (struct frame_info *frame, int frame_low, int frame_high) { - struct cleanup *cleanups = - make_cleanup (null_cleanup, NULL); - PyObject *module, *sort_func, *iterable, *frame_obj, *iterator; - PyObject *py_frame_low, *py_frame_high; - - frame_obj = frame_info_to_frame_object (frame); + gdbpy_ref frame_obj (frame_info_to_frame_object (frame)); if (frame_obj == NULL) - goto error; - make_cleanup_py_decref (frame_obj); + return NULL; - module = PyImport_ImportModule ("gdb.frames"); + gdbpy_ref module (PyImport_ImportModule ("gdb.frames")); if (module == NULL) - goto error; - make_cleanup_py_decref (module); + return NULL; - sort_func = PyObject_GetAttrString (module, "execute_frame_filters"); + gdbpy_ref sort_func (PyObject_GetAttrString (module.get (), + "execute_frame_filters")); if (sort_func == NULL) - goto error; - make_cleanup_py_decref (sort_func); + return NULL; - py_frame_low = PyInt_FromLong (frame_low); + gdbpy_ref py_frame_low (PyInt_FromLong (frame_low)); if (py_frame_low == NULL) - goto error; - make_cleanup_py_decref (py_frame_low); + return NULL; - py_frame_high = PyInt_FromLong (frame_high); + gdbpy_ref py_frame_high (PyInt_FromLong (frame_high)); if (py_frame_high == NULL) - goto error; - make_cleanup_py_decref (py_frame_high); + return NULL; - iterable = PyObject_CallFunctionObjArgs (sort_func, frame_obj, - py_frame_low, - py_frame_high, - NULL); + gdbpy_ref iterable (PyObject_CallFunctionObjArgs (sort_func.get (), + frame_obj.get (), + py_frame_low.get (), + py_frame_high.get (), + NULL)); if (iterable == NULL) - goto error; - - do_cleanups (cleanups); + return NULL; if (iterable != Py_None) - { - iterator = PyObject_GetIter (iterable); - Py_DECREF (iterable); - } + return PyObject_GetIter (iterable.get ()); else - { - return iterable; - } - - return iterator; - - error: - do_cleanups (cleanups); - return NULL; + return iterable.release (); } /* This is the only publicly exported function in this file. FRAME