From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11101 invoked by alias); 7 Feb 2013 21:00:58 -0000 Received: (qmail 11069 invoked by uid 22791); 7 Feb 2013 21:00:56 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_SPAMHAUS_DROP,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS,TW_BP,TW_HP X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 07 Feb 2013 21:00:47 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r17L0lP2022397 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 7 Feb 2013 16:00:47 -0500 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r17L0Qbx008583 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 7 Feb 2013 16:00:42 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Subject: [2/5] RFC: fix py-finishbreakpoint bug Date: Thu, 07 Feb 2013 21:00:00 -0000 Message-ID: <87bobvvnyt.fsf@fleche.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2.92 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-02/txt/msg00197.txt.bz2 The exception checker pointed out that we called frame_object_to_frame_info in the Python code outside of a TRY_CATCH. Also, the code seemed somewhat convoluted in that it called gdbpy_newest_frame rather than directly calling get_current_frame. This patch rearranges the code to be correct. Tom * py-finishbreakpoint.c (bpfinishpy_init): Reorganize to call frame_object_to_frame_info inside TRY_CATCH. --- gdb/python/py-finishbreakpoint.c | 70 +++++++++++++++++++------------------- 1 files changed, 35 insertions(+), 35 deletions(-) diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c index 5685308..edf75d7 100644 --- a/gdb/python/py-finishbreakpoint.c +++ b/gdb/python/py-finishbreakpoint.c @@ -173,40 +173,45 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) &frame_obj, &internal)) return -1; - /* Default frame to gdb.newest_frame if necessary. */ - if (!frame_obj) - frame_obj = gdbpy_newest_frame (NULL, NULL); - else - Py_INCREF (frame_obj); - - frame = frame_object_to_frame_info (frame_obj); - Py_DECREF (frame_obj); - - if (frame == NULL) - goto invalid_frame; - TRY_CATCH (except, RETURN_MASK_ALL) { - prev_frame = get_prev_frame (frame); - if (prev_frame == 0) - { - PyErr_SetString (PyExc_ValueError, _("\"FinishBreakpoint\" not " \ - "meaningful in the outermost "\ - "frame.")); - } - else if (get_frame_type (prev_frame) == DUMMY_FRAME) - { - PyErr_SetString (PyExc_ValueError, _("\"FinishBreakpoint\" cannot "\ - "be set on a dummy frame.")); - } + /* Default frame to newest frame if necessary. */ + if (frame_obj == NULL) + frame = get_current_frame (); else - { - frame_id = get_frame_id (prev_frame); - if (frame_id_eq (frame_id, null_frame_id)) - PyErr_SetString (PyExc_ValueError, - _("Invalid ID for the `frame' object.")); - } + frame = frame_object_to_frame_info (frame_obj); + + if (frame == NULL) + { + PyErr_SetString (PyExc_ValueError, + _("Invalid ID for the `frame' object.")); + } + else + { + prev_frame = get_prev_frame (frame); + if (prev_frame == 0) + { + PyErr_SetString (PyExc_ValueError, + _("\"FinishBreakpoint\" not " + "meaningful in the outermost " + "frame.")); + } + else if (get_frame_type (prev_frame) == DUMMY_FRAME) + { + PyErr_SetString (PyExc_ValueError, + _("\"FinishBreakpoint\" cannot " + "be set on a dummy frame.")); + } + else + { + frame_id = get_frame_id (prev_frame); + if (frame_id_eq (frame_id, null_frame_id)) + PyErr_SetString (PyExc_ValueError, + _("Invalid ID for the `frame' object.")); + } + } } + Py_XDECREF (frame_obj); if (except.reason < 0) { gdbpy_convert_exception (except); @@ -305,11 +310,6 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) self_bpfinish->py_bp.bp->pspace = current_program_space; return 0; - - invalid_frame: - PyErr_SetString (PyExc_ValueError, - _("Invalid ID for the `frame' object.")); - return -1; } /* Called when GDB notices that the finish breakpoint BP_OBJ is out of -- 1.7.7.6