From patchwork Mon Nov 7 05:47:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 17254 Received: (qmail 79649 invoked by alias); 7 Nov 2016 05:48:42 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 78672 invoked by uid 89); 7 Nov 2016 05:48:26 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=H*r:4.86_1, H*Ad:U*tom, publicly X-HELO: gproxy5-pub.mail.unifiedlayer.com Received: from gproxy5-pub.mail.unifiedlayer.com (HELO gproxy5-pub.mail.unifiedlayer.com) (67.222.38.55) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Mon, 07 Nov 2016 05:47:47 +0000 Received: (qmail 22127 invoked by uid 0); 7 Nov 2016 05:47:45 -0000 Received: from unknown (HELO CMOut01) (10.0.90.82) by gproxy5.mail.unifiedlayer.com with SMTP; 7 Nov 2016 05:47:45 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by CMOut01 with id 4tng1u00V2f2jeq01tnji1; Sun, 06 Nov 2016 22:47:43 -0700 X-Authority-Analysis: v=2.1 cv=beT4Do/B c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=L24OOQBejmoA:10 a=zstS-IiYAAAA:8 a=416KQiS9EtKcqCAppg0A:9 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 174-16-143-211.hlrn.qwest.net ([174.16.143.211]:47918 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1c3cmT-0008A3-T3; Sun, 06 Nov 2016 22:47:42 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 08/14] Use gdbpy_reference in py-framefilter.c Date: Sun, 6 Nov 2016 22:47:30 -0700 Message-Id: <1478497656-11832-9-git-send-email-tom@tromey.com> In-Reply-To: <1478497656-11832-1-git-send-email-tom@tromey.com> References: <1478497656-11832-1-git-send-email-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1c3cmT-0008A3-T3 X-Source-Sender: 174-16-143-211.hlrn.qwest.net (bapiya.Home) [174.16.143.211]:47918 X-Source-Auth: tom+tromey.com X-Email-Count: 9 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== This changes some code in py-framefilter.c to use gdbpy_reference. 2016-11-06 Tom Tromey * python/py-framefilter.c (extract_sym, extract_value) (get_py_iter_from_func, bootstrap_python_frame_filters): Use gdbpy_reference. --- 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 53f2e5f..4921600 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2016-11-06 Tom Tromey + * python/py-framefilter.c (extract_sym, extract_value) + (get_py_iter_from_func, bootstrap_python_frame_filters): Use + gdbpy_reference. + +2016-11-06 Tom Tromey + * python/py-breakpoint.c (gdbpy_breakpoints): Use gdbpy_reference. 2016-11-06 Tom Tromey diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 6692ac5..d010408 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 { @@ -55,17 +56,16 @@ static enum ext_lang_bt_status extract_sym (PyObject *obj, char **name, struct symbol **sym, struct block **sym_block, const struct language_defn **language) { - PyObject *result = PyObject_CallMethod (obj, "symbol", NULL); + gdbpy_reference 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; @@ -82,15 +82,13 @@ extract_sym (PyObject *obj, char **name, struct symbol **sym, { /* 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, @@ -129,7 +127,7 @@ extract_value (PyObject *obj, struct value **value) { if (PyObject_HasAttrString (obj, "value")) { - PyObject *vresult = PyObject_CallMethod (obj, "value", NULL); + gdbpy_reference vresult (PyObject_CallMethod (obj, "value", NULL)); if (vresult == NULL) return EXT_LANG_BT_ERROR; @@ -139,14 +137,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; @@ -315,20 +311,17 @@ get_py_iter_from_func (PyObject *filter, char *func) { if (PyObject_HasAttrString (filter, func)) { - PyObject *result = PyObject_CallMethod (filter, func, NULL); + gdbpy_reference 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 ()); } } } @@ -1445,60 +1438,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_reference 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_reference 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_reference 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_reference 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_reference 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_reference 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