From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15908 invoked by alias); 15 Nov 2010 17:27:28 -0000 Received: (qmail 15900 invoked by uid 22791); 15 Nov 2010 17:27:26 -0000 X-SWARE-Spam-Status: No, hits=-5.7 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD 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; Mon, 15 Nov 2010 17:27:18 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oAFHRGxO020748 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 15 Nov 2010 12:27:17 -0500 Received: from localhost.localdomain (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id oAFHRFJR032170 for ; Mon, 15 Nov 2010 12:27:16 -0500 From: Phil Muldoon To: gdb-patches@sourceware.org Subject: Python PR/12199 Reply-to: pmuldoon@redhat.com X-URL: http://www.redhat.com Date: Mon, 15 Nov 2010 17:27:00 -0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-IsSubscribed: yes 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: 2010-11/txt/msg00176.txt.bz2 Hi, This patch allows users to delete a breakpoint from the Python API (assuming that breakpoint type is tracked by the API). OK? Cheers Phil -- 2010-11-15 Phil Muldoon PR python/12199 * python/py-breakpoint.c (bppy_delete_breakpoint): New function. 2010-11-15 Phil Muldoon PR python/12199 * gdb.python/py-breakpoint.exp: Test the delete method. 2010-11-15 Phil Muldoon PR python/12199 * gdb.texinfo (Breakpoints In Python): Document "delete" method. -- diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index ddc711b..5ffbcb7 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -22887,6 +22887,12 @@ watchpoint scope, the watchpoint remains valid even if execution of the inferior leaves the scope of that watchpoint. @end defmethod +@defmethod Breakpoint delete +Permanently deletes the @value{GDBN} breakpoint. This also +invalidates the Python @code{Breakpoint} object. Any further access +to this object's attributes or methods will raise an error. +@end defmethod + @defivar Breakpoint enabled This attribute is @code{True} if the breakpoint is enabled, and @code{False} otherwise. This attribute is writable. diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index 8afa414..742c702 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -630,6 +630,22 @@ bppy_new (PyTypeObject *subtype, PyObject *args, PyObject *kwargs) return result; } +/* Python function which deletes the underlying GDB breakpoint. This + triggers the breakpoint_deleted observer which will call + gdbpy_breakpoint_deleted; that function cleans up the Python + sections. */ + +static PyObject * +bppy_delete_breakpoint (PyObject *self, PyObject *args) +{ + breakpoint_object *self_bp = (breakpoint_object *) self; + + BPPY_REQUIRE_VALID (self_bp); + + delete_breakpoint (self_bp->bp); + + Py_RETURN_NONE; +} + static int @@ -843,6 +859,8 @@ static PyMethodDef breakpoint_object_methods[] = { { "is_valid", bppy_is_valid, METH_NOARGS, "Return true if this breakpoint is valid, false if not." }, + { "delete", bppy_delete_breakpoint, METH_NOARGS, + "Delete the underlying GDB breakpoint." }, { NULL } /* Sentinel. */ }; diff --git a/gdb/testsuite/gdb.python/py-breakpoint.exp b/gdb/testsuite/gdb.python/py-breakpoint.exp index d030b55..34a64a3 100644 --- a/gdb/testsuite/gdb.python/py-breakpoint.exp +++ b/gdb/testsuite/gdb.python/py-breakpoint.exp @@ -91,6 +91,29 @@ if ![runto_main] then { return 0 } +# Test breakpoints are deleted correctly. +set deltst_location [gdb_get_line_number "Break at multiply."] +set end_location [gdb_get_line_number "Break at end."] +gdb_py_test_silent_cmd "python dp1 = gdb.Breakpoint (\"$deltst_location\")" "Set breakpoint" 0 +gdb_breakpoint [gdb_get_line_number "Break at end."] +gdb_py_test_silent_cmd "python del_list = gdb.breakpoints()" "Get Breakpoint List" 0 +gdb_test "python print len(del_list)" "3" "Number of breakpoints before delete" +gdb_continue_to_breakpoint "Break at multiply." ".*/$srcfile:$deltst_location.*" +gdb_py_test_silent_cmd "python dp1.delete()" "Delete Breakpoint" 0 +gdb_test "python print dp1.number" "RuntimeError: Breakpoint 2 is invalid.*" "Check breakpoint invalidated" +gdb_py_test_silent_cmd "python del_list = gdb.breakpoints()" "Get Breakpoint List" 0 +gdb_test "python print len(del_list)" "2" "Number of breakpoints after delete" +gdb_continue_to_breakpoint "Break at end." ".*/$srcfile:$end_location.*" + + +# Start with a fresh gdb. +clean_restart ${testfile} + +if ![runto_main] then { + fail "Cannot run to main." + return 0 +} + # Test conditional setting. set bp_location1 [gdb_get_line_number "Break at multiply."] gdb_py_test_silent_cmd "python bp1 = gdb.Breakpoint (\"$bp_location1\")" "Set breakpoint" 0