From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id CYzwB0qkd2rfFhUAWB0awg (envelope-from ) for ; Sat, 08 Aug 2026 17:48:58 -0400 Authentication-Results: simark.ca; dkim=fail reason="signature verification failed" (768-bit key; unprotected) header.d=tromey.com header.i=@tromey.com header.a=rsa-sha256 header.s=default header.b=X2hiMLXu; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 1A21C1E09B; Sat, 08 Aug 2026 17:48:58 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.1 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 3A1501E09B for ; Sat, 08 Aug 2026 17:48:57 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 16C8D4BA79AE for ; Sat, 8 Aug 2026 21:48:56 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 16C8D4BA79AE Authentication-Results: sourceware.org; dkim=fail reason="signature verification failed" (768-bit key, unprotected) header.d=tromey.com header.i=@tromey.com header.a=rsa-sha256 header.s=default header.b=X2hiMLXu Received: from omta040.useast.a.cloudfilter.net (omta040.useast.a.cloudfilter.net [44.202.169.39]) by sourceware.org (Postfix) with ESMTPS id B38234BA79AB for ; Sat, 8 Aug 2026 21:47:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B38234BA79AB Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org B38234BA79AB Authentication-Results: sourceware.org; arc=none smtp.remote-ip=44.202.169.39 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786225649; cv=none; b=Af6x9gCA/bLrIo1bvUmhhmoNRq08URd0ekWZhfcz8BXw40ZiXnLiuh5UKLSMbHQAf+fbGPKTrgLwSFQnF7KRYg2rXBKzFvpA9D1y2Kq6iGq2msJMkWeXPUkXJ+VuO7NgvIcqAj/Yc77Ta4bY8+1bRkj6kKn6Wb85884OiiDf3uk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786225649; c=relaxed/simple; bh=MVg2hwX8xHmRMQH7IugPyctBvOF/KFk6k7bmYNfkiXQ=; h=DKIM-Signature:From:Date:Subject:MIME-Version:Message-Id:To; b=xuL1tN7gSz/wXSpf5/nmvuIF5csDZC6MaAiR4qTXaQoyDGeqz9Cwwbc7+2Mga2Zwn8pwSyX/kemdrwy+NhFPdgSqNdU3pq0e9rcX6NhEFgKATvbbleTbdkk06YA8MPpo6V14upHRUA39qtAGzv6yt4nqER55Fz+q2qLUbIn1tGo= ARC-Authentication-Results: i=1; sourceware.org; dkim=policy (768-bit key, unprotected) header.d=tromey.com header.i=@tromey.com header.a=rsa-sha256 header.s=default header.b=X2hiMLXu reason="signing key too small" DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B38234BA79AB Received: from eig-obgw-6002b.ext.cloudfilter.net ([10.0.30.203]) by cmsmtp with ESMTPS id sOrXwbtbTuFzgsot7wruGx; Sat, 08 Aug 2026 21:47:29 +0000 Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTPS id sot6wCxcVRY4Isot6wdDkA; Sat, 08 Aug 2026 21:47:28 +0000 X-Authority-Analysis: v=2.4 cv=WNl/XmsR c=1 sm=1 tr=0 ts=6a77a3f0 a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=ItBw4LHWJt0A:10 a=4G6Sz2uICM1SZRxqge8A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=DCx65vhANUyCzuf5D8fC:22 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Cc:To:In-Reply-To:References:Message-Id: Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date:From:Sender: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=OXgJ6OrAA1vWJUidkk9o1LPKedYyusnpTM2EXnkQCUs=; b=X2hiMLXubeok5ZE8OCuv/P3cdD kiDqwrN71/OsmVDf0lSIR9M2bsYODnlHU773xx311zlVRFhJl3y9MRopaGJzw5/Fn+7ahtQgyIzwj gm05gGjUx2AKoAkBfn9jGbhhE; Received: from 75-166-225-82.hlrn.qwest.net ([75.166.225.82]:34168 helo=[192.168.122.1]) by box5379.bluehost.com with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.99.5) (envelope-from ) id 1wsot6-00000001wX6-11jn; Sat, 08 Aug 2026 15:47:28 -0600 From: Tom Tromey Date: Sat, 08 Aug 2026 15:47:25 -0600 Subject: [PATCH 1/4] Change evpy_emit_event to accept a gdbpy_opt_borrowed_ref MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260808-python-safety-events-simple-v1-1-132aea40c801@tromey.com> References: <20260808-python-safety-events-simple-v1-0-132aea40c801@tromey.com> In-Reply-To: <20260808-python-safety-events-simple-v1-0-132aea40c801@tromey.com> To: gdb-patches@sourceware.org Cc: Tom Tromey X-Mailer: b4 0.14.3 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 75.166.225.82 X-Source-L: No X-Exim-ID: 1wsot6-00000001wX6-11jn X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 75-166-225-82.hlrn.qwest.net ([192.168.122.1]) [75.166.225.82]:34168 X-Source-Auth: tom+tromey.com X-Email-Count: 2 X-Org: HG=bhshared;ORG=bluehost; X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-CMAE-Envelope: MS4xfJwsw7yHSdABOfvvrQwJ8Oen5ATgK2vTZCiwTfHswFv4d+/LLfiGqW3wmw4zhHLbFdVWwvMrDBjn2Qu5QJKnINN9IwIYFAvwLnzDD+VUMMGYF5mZjBo3 TxQFMUxVaYAgi/2hHQ5KYwSZLYNm6qE74cd/aYs92AS/3zmH63NsVF+jD2bYY8P6mKYzhbAzyXDlHMZWZmL0G49i3ylTnr5VgQk= X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org This changes evpy_emit_event to accept a gdbpy_opt_borrowed_ref. An "opt" type is used because one caller explicitly passes NULL, meaning that the event should be emitted without a payload object. This patch is a small step toward using the safety API in event generation, though for the time being it mainly allows the removal of calls to "get". --- gdb/python/py-breakpoint.c | 5 ++--- gdb/python/py-connection.c | 2 +- gdb/python/py-continueevent.c | 2 +- gdb/python/py-corefile.c | 2 +- gdb/python/py-event.c | 2 +- gdb/python/py-event.h | 7 ++++++- gdb/python/py-exitedevent.c | 2 +- gdb/python/py-inferior.c | 8 ++++---- gdb/python/py-infevents.c | 6 +++--- gdb/python/py-newobjfileevent.c | 6 +++--- gdb/python/py-progspace.c | 4 ++-- gdb/python/py-stopevent.c | 2 +- gdb/python/py-threadevent.c | 2 +- gdb/python/py-tui.c | 2 +- gdb/python/python.c | 2 +- 15 files changed, 29 insertions(+), 25 deletions(-) diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index ecb42cee5f9..b628e14ae4e 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -1283,8 +1283,7 @@ gdbpy_breakpoint_created (struct breakpoint *bp) if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_created)) { - if (evpy_emit_event ((PyObject *) newbp, - gdb_py_events.breakpoint_created) < 0) + if (evpy_emit_event (newbp, gdb_py_events.breakpoint_created) < 0) gdbpy_print_stack (); } } @@ -1312,7 +1311,7 @@ gdbpy_breakpoint_deleted (struct breakpoint *b) if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_deleted)) { - if (evpy_emit_event ((PyObject *) bp_obj.get (), + if (evpy_emit_event (bp_obj, gdb_py_events.breakpoint_deleted) < 0) gdbpy_print_stack (); } diff --git a/gdb/python/py-connection.c b/gdb/python/py-connection.c index bc738669b79..99bed238b6c 100644 --- a/gdb/python/py-connection.c +++ b/gdb/python/py-connection.c @@ -146,7 +146,7 @@ emit_connection_event (process_stratum_target *target, if (evpy_add_attribute (event_obj.get (), "connection", conn.get ()) < 0) return -1; - return evpy_emit_event (event_obj.get (), registry); + return evpy_emit_event (event_obj, registry); } /* Callback for the connection_removed observer. */ diff --git a/gdb/python/py-continueevent.c b/gdb/python/py-continueevent.c index 15404157062..06d4dabadd9 100644 --- a/gdb/python/py-continueevent.c +++ b/gdb/python/py-continueevent.c @@ -51,6 +51,6 @@ emit_continue_event (ptid_t ptid) gdbpy_ref<> event = create_continue_event_object (ptid); if (event != NULL) - return evpy_emit_event (event.get (), gdb_py_events.cont); + return evpy_emit_event (event, gdb_py_events.cont); return -1; } diff --git a/gdb/python/py-corefile.c b/gdb/python/py-corefile.c index fc5b4889fdc..542bc05f560 100644 --- a/gdb/python/py-corefile.c +++ b/gdb/python/py-corefile.c @@ -346,7 +346,7 @@ emit_corefile_changed_event (inferior *inf) inf_obj.get ()) < 0) return -1; - return evpy_emit_event (event_obj.get (), gdb_py_events.corefile_changed); + return evpy_emit_event (event_obj, gdb_py_events.corefile_changed); } /* Callback from gdb::observers::core_file_changed. The core file for diff --git a/gdb/python/py-event.c b/gdb/python/py-event.c index a7aa46dcb6f..6dd6f3bf356 100644 --- a/gdb/python/py-event.c +++ b/gdb/python/py-event.c @@ -62,7 +62,7 @@ gdbpy_initialize_event () returns 0 if emit is successful -1 otherwise. */ int -evpy_emit_event (PyObject *event, +evpy_emit_event (gdbpy_opt_borrowed_ref<> event, eventregistry_object *registry) { Py_ssize_t i; diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h index ec2e7bc03c5..c8fbbf3add6 100644 --- a/gdb/python/py-event.h +++ b/gdb/python/py-event.h @@ -53,7 +53,12 @@ extern int emit_inferior_call_event (inferior_call_kind kind, extern int emit_register_changed_event (const frame_info_ptr &frame, int regnum); extern int emit_memory_changed_event (CORE_ADDR addr, ssize_t len); -extern int evpy_emit_event (PyObject *event, + +/* Emit an event to a given event registry. Return 0 on success, -1 + with the Python exception set on failure. gdbpy_opt_borrowed_ref + is used; if NULL is passed, then the event will be emitted without + a payload. */ +extern int evpy_emit_event (gdbpy_opt_borrowed_ref<> event, eventregistry_object *registry); /* Emits a thread exit event for THREAD */ diff --git a/gdb/python/py-exitedevent.c b/gdb/python/py-exitedevent.c index d15f768ab79..866adb7ff8b 100644 --- a/gdb/python/py-exitedevent.c +++ b/gdb/python/py-exitedevent.c @@ -59,7 +59,7 @@ emit_exited_event (const LONGEST *exit_code, struct inferior *inf) gdbpy_ref<> event = create_exited_event_object (exit_code, inf); if (event != NULL) - return evpy_emit_event (event.get (), gdb_py_events.exited); + return evpy_emit_event (event, gdb_py_events.exited); return -1; } diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 426aec31e9e..5f0019b7b86 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -257,7 +257,7 @@ python_new_inferior (struct inferior *inf) if (event == NULL || evpy_add_attribute (event.get (), "inferior", (PyObject *) inf_obj.get ()) < 0 - || evpy_emit_event (event.get (), gdb_py_events.new_inferior) < 0) + || evpy_emit_event (event, gdb_py_events.new_inferior) < 0) gdbpy_print_stack (); } @@ -285,7 +285,7 @@ python_inferior_deleted (struct inferior *inf) if (event == NULL || evpy_add_attribute (event.get (), "inferior", (PyObject *) inf_obj.get ()) < 0 - || evpy_emit_event (event.get (), gdb_py_events.inferior_deleted) < 0) + || evpy_emit_event (event, gdb_py_events.inferior_deleted) < 0) gdbpy_print_stack (); } @@ -339,7 +339,7 @@ add_thread_object (struct thread_info *tp) (PyObject *) ins_result.first->second.get ()); if (event == NULL - || evpy_emit_event (event.get (), gdb_py_events.new_thread) < 0) + || evpy_emit_event (event, gdb_py_events.new_thread) < 0) gdbpy_print_stack (); } @@ -1040,7 +1040,7 @@ python_context_changed (user_selected_what selection) || evpy_add_attribute (event.get (), "inferior", inf_obj.get ()) < 0 || evpy_add_attribute (event.get (), "thread", thr_obj.get ()) < 0 || evpy_add_attribute (event.get (), "frame", frame_obj.get ()) < 0 - || evpy_emit_event (event.get (), gdb_py_events.selected_context) < 0) + || evpy_emit_event (event, gdb_py_events.selected_context) < 0) gdbpy_print_stack (); } diff --git a/gdb/python/py-infevents.c b/gdb/python/py-infevents.c index 1b27987d039..db77f4593d6 100644 --- a/gdb/python/py-infevents.c +++ b/gdb/python/py-infevents.c @@ -127,7 +127,7 @@ emit_inferior_call_event (inferior_call_kind flag, ptid_t thread, gdbpy_ref<> event = create_inferior_call_event_object (flag, thread, addr); if (event != NULL) - return evpy_emit_event (event.get (), gdb_py_events.inferior_call); + return evpy_emit_event (event, gdb_py_events.inferior_call); return -1; } @@ -142,7 +142,7 @@ emit_memory_changed_event (CORE_ADDR addr, ssize_t len) gdbpy_ref<> event = create_memory_changed_event_object (addr, len); if (event != NULL) - return evpy_emit_event (event.get (), gdb_py_events.memory_changed); + return evpy_emit_event (event, gdb_py_events.memory_changed); return -1; } @@ -157,6 +157,6 @@ emit_register_changed_event (const frame_info_ptr &frame, int regnum) gdbpy_ref<> event = create_register_changed_event_object (frame, regnum); if (event != NULL) - return evpy_emit_event (event.get (), gdb_py_events.register_changed); + return evpy_emit_event (event, gdb_py_events.register_changed); return -1; } diff --git a/gdb/python/py-newobjfileevent.c b/gdb/python/py-newobjfileevent.c index 19a33d2afc6..e72e9ae67e3 100644 --- a/gdb/python/py-newobjfileevent.c +++ b/gdb/python/py-newobjfileevent.c @@ -48,7 +48,7 @@ emit_new_objfile_event (struct objfile *objfile) gdbpy_ref<> event = create_new_objfile_event_object (objfile); if (event != NULL) - return evpy_emit_event (event.get (), gdb_py_events.new_objfile); + return evpy_emit_event (event, gdb_py_events.new_objfile); return -1; } @@ -85,7 +85,7 @@ emit_free_objfile_event (struct objfile *objfile) gdbpy_ref<> event = create_free_objfile_event_object (objfile); if (event == nullptr) return -1; - return evpy_emit_event (event.get (), gdb_py_events.free_objfile); + return evpy_emit_event (event, gdb_py_events.free_objfile); } @@ -121,6 +121,6 @@ emit_clear_objfiles_event (program_space *pspace) gdbpy_ref<> event = create_clear_objfiles_event_object (pspace); if (event != NULL) - return evpy_emit_event (event.get (), gdb_py_events.clear_objfiles); + return evpy_emit_event (event, gdb_py_events.clear_objfiles); return -1; } diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c index 48e52328e9c..31ea3ad8fc8 100644 --- a/gdb/python/py-progspace.c +++ b/gdb/python/py-progspace.c @@ -648,7 +648,7 @@ emit_executable_changed_event (eventregistry_object *registry, py_reload_p.get ()) < 0) return -1; - return evpy_emit_event (event_obj.get (), registry); + return evpy_emit_event (event_obj, registry); } /* Listener for the executable_changed observable, this is called when the @@ -708,7 +708,7 @@ gdbpy_program_space_event (program_space *pspace, bool adding_p) if (event == nullptr || evpy_add_attribute (event.get (), "progspace", pspace_obj.get ()) < 0 - || evpy_emit_event (event.get (), registry) < 0) + || evpy_emit_event (event, registry) < 0) gdbpy_print_stack (); } diff --git a/gdb/python/py-stopevent.c b/gdb/python/py-stopevent.c index cefcfdd0761..77db754140c 100644 --- a/gdb/python/py-stopevent.c +++ b/gdb/python/py-stopevent.c @@ -169,5 +169,5 @@ emit_stop_event (struct bpstat *bs, enum gdb_signal stop_signal) return -1; } - return evpy_emit_event (stop_event_obj.get (), gdb_py_events.stop); + return evpy_emit_event (stop_event_obj, gdb_py_events.stop); } diff --git a/gdb/python/py-threadevent.c b/gdb/python/py-threadevent.c index 3c28aa1174a..d2998d92304 100644 --- a/gdb/python/py-threadevent.c +++ b/gdb/python/py-threadevent.c @@ -71,5 +71,5 @@ emit_thread_exit_event (thread_info * thread) if (inf_thr == nullptr) return -1; - return evpy_emit_event (inf_thr.get (), gdb_py_events.thread_exited); + return evpy_emit_event (inf_thr, gdb_py_events.thread_exited); } diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c index 5a36814debb..0046c66d570 100644 --- a/gdb/python/py-tui.c +++ b/gdb/python/py-tui.c @@ -606,7 +606,7 @@ gdbpy_tui_enabled (bool state) gdbpy_ref<> code (PyBool_FromLong (state)); if (evpy_add_attribute (event_obj.get (), "enabled", code.get ()) < 0 - || evpy_emit_event (event_obj.get (), gdb_py_events.tui_enabled) < 0) + || evpy_emit_event (event_obj, gdb_py_events.tui_enabled) < 0) gdbpy_print_stack (); } diff --git a/gdb/python/python.c b/gdb/python/python.c index 7b5de98b903..5312cdbdb01 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -2503,7 +2503,7 @@ emit_exiting_event (int exit_code) if (evpy_add_attribute (event_obj.get (), "exit_code", code.get ()) < 0) return -1; - return evpy_emit_event (event_obj.get (), gdb_py_events.gdb_exiting); + return evpy_emit_event (event_obj, gdb_py_events.gdb_exiting); } /* Callback for the gdb_exiting observable. EXIT_CODE is the value GDB -- 2.49.0