Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH 0/4] Use gdbpy_borrowed_ref more + cast removal
@ 2026-08-08 21:47 Tom Tromey
  2026-08-08 21:47 ` [PATCH 1/4] Change evpy_emit_event to accept a gdbpy_opt_borrowed_ref Tom Tromey
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Tom Tromey @ 2026-08-08 21:47 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This started as a series to clean up event generation a little.  Long
term I'd like to migrate all of this to the safe API; but in the
meantime this just arranges to use gdbpy_borrowed_ref some more.  This
lets us remove calls to "get", which seems nice even on its own.

While doing this I noticed many unnecessary casts, so I've added a
patch to remove these as well.

Signed-off-by: Tom Tromey <tom@tromey.com>
---
Tom Tromey (4):
      Change evpy_emit_event to accept a gdbpy_opt_borrowed_ref
      Change evpy_add_attribute to accept gdbpy_borrowed_ref
      Use gdbpy_borrowed_ref when creating events
      Remove unneeded casts to PyObject*

 gdb/python/py-arch.c             |  2 +-
 gdb/python/py-block.c            |  2 +-
 gdb/python/py-bpevent.c          | 10 ++++------
 gdb/python/py-breakpoint.c       | 24 +++++++++---------------
 gdb/python/py-cmd.c              |  8 ++++----
 gdb/python/py-connection.c       |  4 ++--
 gdb/python/py-continueevent.c    |  4 ++--
 gdb/python/py-corefile.c         | 11 +++++------
 gdb/python/py-disasm.c           | 13 ++++++-------
 gdb/python/py-event.c            |  5 +++--
 gdb/python/py-event.h            | 13 +++++++++----
 gdb/python/py-evts.c             |  4 +---
 gdb/python/py-exitedevent.c      | 10 ++++------
 gdb/python/py-finishbreakpoint.c |  7 +++----
 gdb/python/py-inferior.c         | 31 +++++++++++++------------------
 gdb/python/py-infevents.c        | 18 +++++++++---------
 gdb/python/py-infthread.c        |  2 +-
 gdb/python/py-lazy-string.c      |  2 +-
 gdb/python/py-linetable.c        |  4 ++--
 gdb/python/py-membuf.c           |  2 +-
 gdb/python/py-micmd.c            |  2 +-
 gdb/python/py-newobjfileevent.c  | 19 ++++++++-----------
 gdb/python/py-objfile.c          |  7 +++----
 gdb/python/py-progspace.c        | 15 ++++++---------
 gdb/python/py-record-btrace.c    |  2 +-
 gdb/python/py-record.c           | 10 +++++-----
 gdb/python/py-registers.c        |  4 ++--
 gdb/python/py-signalevent.c      |  5 ++---
 gdb/python/py-stopevent.c        |  9 ++++-----
 gdb/python/py-stopevent.h        |  7 ++++---
 gdb/python/py-threadevent.c      | 10 ++++------
 gdb/python/py-tui.c              |  6 +++---
 gdb/python/py-type.c             |  6 +++---
 gdb/python/py-unwind.c           | 12 +++++-------
 gdb/python/python.c              |  4 ++--
 35 files changed, 134 insertions(+), 160 deletions(-)
---
base-commit: c7c7858871f77bb265bbce492d39716f39e0d462
change-id: 20260808-python-safety-events-simple-1a281b2c6dbf

Best regards,
-- 
Tom Tromey <tom@tromey.com>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/4] Change evpy_emit_event to accept a gdbpy_opt_borrowed_ref
  2026-08-08 21:47 [PATCH 0/4] Use gdbpy_borrowed_ref more + cast removal Tom Tromey
@ 2026-08-08 21:47 ` Tom Tromey
  2026-08-08 21:47 ` [PATCH 2/4] Change evpy_add_attribute to accept gdbpy_borrowed_ref Tom Tromey
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Tom Tromey @ 2026-08-08 21:47 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

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);
 }
 
 \f
@@ -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


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/4] Change evpy_add_attribute to accept gdbpy_borrowed_ref
  2026-08-08 21:47 [PATCH 0/4] Use gdbpy_borrowed_ref more + cast removal Tom Tromey
  2026-08-08 21:47 ` [PATCH 1/4] Change evpy_emit_event to accept a gdbpy_opt_borrowed_ref Tom Tromey
@ 2026-08-08 21:47 ` Tom Tromey
  2026-08-08 21:47 ` [PATCH 3/4] Use gdbpy_borrowed_ref when creating events Tom Tromey
  2026-08-08 21:47 ` [PATCH 4/4] Remove unneeded casts to PyObject* Tom Tromey
  3 siblings, 0 replies; 5+ messages in thread
From: Tom Tromey @ 2026-08-08 21:47 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This changes evpy_add_attribute to take gdbpy_borrowed_ref arguments.
This allows removing various calls to "get".
---
 gdb/python/py-bpevent.c         |  7 ++-----
 gdb/python/py-connection.c      |  2 +-
 gdb/python/py-corefile.c        |  3 +--
 gdb/python/py-event.c           |  3 ++-
 gdb/python/py-event.h           |  4 ++--
 gdb/python/py-exitedevent.c     |  8 +++-----
 gdb/python/py-inferior.c        | 12 +++++-------
 gdb/python/py-infevents.c       | 12 ++++++------
 gdb/python/py-newobjfileevent.c | 13 +++++--------
 gdb/python/py-progspace.c       |  9 +++------
 gdb/python/py-signalevent.c     |  5 ++---
 gdb/python/py-stopevent.c       |  2 +-
 gdb/python/py-threadevent.c     |  4 +---
 gdb/python/py-tui.c             |  2 +-
 gdb/python/python.c             |  2 +-
 15 files changed, 36 insertions(+), 52 deletions(-)

diff --git a/gdb/python/py-bpevent.c b/gdb/python/py-bpevent.c
index ae8e6e1594f..20a7745e4cc 100644
--- a/gdb/python/py-bpevent.c
+++ b/gdb/python/py-bpevent.c
@@ -32,12 +32,9 @@ create_breakpoint_event_object (const gdbpy_ref<> &dict,
   if (breakpoint_event_obj == NULL)
     return NULL;
 
-  if (evpy_add_attribute (breakpoint_event_obj.get (),
-			  "breakpoint",
-			  first_bp) < 0)
+  if (evpy_add_attribute (breakpoint_event_obj, "breakpoint", first_bp) < 0)
     return NULL;
-  if (evpy_add_attribute (breakpoint_event_obj.get (),
-			  "breakpoints",
+  if (evpy_add_attribute (breakpoint_event_obj, "breakpoints",
 			  breakpoint_list) < 0)
     return NULL;
 
diff --git a/gdb/python/py-connection.c b/gdb/python/py-connection.c
index 99bed238b6c..d2085960be4 100644
--- a/gdb/python/py-connection.c
+++ b/gdb/python/py-connection.c
@@ -143,7 +143,7 @@ emit_connection_event (process_stratum_target *target,
     return -1;
 
   gdbpy_ref<> conn = target_to_connection_object (target);
-  if (evpy_add_attribute (event_obj.get (), "connection", conn.get ()) < 0)
+  if (evpy_add_attribute (event_obj, "connection", conn) < 0)
     return -1;
 
   return evpy_emit_event (event_obj, registry);
diff --git a/gdb/python/py-corefile.c b/gdb/python/py-corefile.c
index 542bc05f560..a1dee384edf 100644
--- a/gdb/python/py-corefile.c
+++ b/gdb/python/py-corefile.c
@@ -342,8 +342,7 @@ emit_corefile_changed_event (inferior *inf)
 
   gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf);
   if (inf_obj == nullptr
-      || evpy_add_attribute (event_obj.get (), "inferior",
-			     inf_obj.get ()) < 0)
+      || evpy_add_attribute (event_obj, "inferior", inf_obj) < 0)
     return -1;
 
   return evpy_emit_event (event_obj, gdb_py_events.corefile_changed);
diff --git a/gdb/python/py-event.c b/gdb/python/py-event.c
index 6dd6f3bf356..815e815149c 100644
--- a/gdb/python/py-event.c
+++ b/gdb/python/py-event.c
@@ -45,7 +45,8 @@ create_event_object (PyTypeObject *py_type)
    function acquires a new reference to ATTR.  */
 
 int
-evpy_add_attribute (PyObject *event, const char *name, PyObject *attr)
+evpy_add_attribute (gdbpy_borrowed_ref<> event, const char *name,
+		    gdbpy_borrowed_ref<> attr)
 {
   return PyObject_SetAttrString (event, name, attr);
 }
diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h
index c8fbbf3add6..2c724c9a084 100644
--- a/gdb/python/py-event.h
+++ b/gdb/python/py-event.h
@@ -81,7 +81,7 @@ extern int emit_free_objfile_event (struct objfile *objfile);
 extern int emit_clear_objfiles_event (program_space *pspace);
 
 extern void evpy_dealloc (PyObject *self);
-extern int evpy_add_attribute (PyObject *event,
-			       const char *name, PyObject *attr);
+extern int evpy_add_attribute (gdbpy_borrowed_ref<> event,
+			       const char *name, gdbpy_borrowed_ref<> attr);
 
 #endif /* GDB_PYTHON_PY_EVENT_H */
diff --git a/gdb/python/py-exitedevent.c b/gdb/python/py-exitedevent.c
index 866adb7ff8b..83ccebb9127 100644
--- a/gdb/python/py-exitedevent.c
+++ b/gdb/python/py-exitedevent.c
@@ -33,15 +33,13 @@ create_exited_event_object (const LONGEST *exit_code, struct inferior *inf)
 
       if (exit_code_obj == NULL)
 	return NULL;
-      if (evpy_add_attribute (exited_event.get (), "exit_code",
-			      exit_code_obj.get ()) < 0)
+      if (evpy_add_attribute (exited_event, "exit_code", exit_code_obj) < 0)
 	return NULL;
     }
 
   gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf);
-  if (inf_obj == NULL || evpy_add_attribute (exited_event.get (),
-					     "inferior",
-					     (PyObject *) inf_obj.get ()) < 0)
+  if (inf_obj == nullptr
+      || evpy_add_attribute (exited_event, "inferior", inf_obj) < 0)
     return NULL;
 
   return exited_event;
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index 5f0019b7b86..ab3a95da1bf 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -255,8 +255,7 @@ python_new_inferior (struct inferior *inf)
 
   gdbpy_ref<> event = create_event_object (&new_inferior_event_object_type);
   if (event == NULL
-      || evpy_add_attribute (event.get (), "inferior",
-			     (PyObject *) inf_obj.get ()) < 0
+      || evpy_add_attribute (event, "inferior", inf_obj) < 0
       || evpy_emit_event (event, gdb_py_events.new_inferior) < 0)
     gdbpy_print_stack ();
 }
@@ -283,8 +282,7 @@ python_inferior_deleted (struct inferior *inf)
 
   gdbpy_ref<> event = create_event_object (&inferior_deleted_event_object_type);
   if (event == NULL
-      || evpy_add_attribute (event.get (), "inferior",
-			     (PyObject *) inf_obj.get ()) < 0
+      || evpy_add_attribute (event, "inferior", inf_obj) < 0
       || evpy_emit_event (event, gdb_py_events.inferior_deleted) < 0)
     gdbpy_print_stack ();
 }
@@ -1037,9 +1035,9 @@ python_context_changed (user_selected_what selection)
   gdbpy_ref<> event
     = create_event_object (&selected_context_event_object_type);
   if (event == nullptr
-      || 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_add_attribute (event, "inferior", inf_obj) < 0
+      || evpy_add_attribute (event, "thread", thr_obj) < 0
+      || evpy_add_attribute (event, "frame", frame_obj) < 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 db77f4593d6..b472c809197 100644
--- a/gdb/python/py-infevents.c
+++ b/gdb/python/py-infevents.c
@@ -44,14 +44,14 @@ create_inferior_call_event_object (inferior_call_kind flag, ptid_t ptid,
   if (ptid_obj == NULL)
     return NULL;
 
-  if (evpy_add_attribute (event.get (), "ptid", ptid_obj.get ()) < 0)
+  if (evpy_add_attribute (event, "ptid", ptid_obj) < 0)
     return NULL;
 
   gdbpy_ref<> addr_obj = gdb_py_object_from_ulongest (addr);
   if (addr_obj == NULL)
     return NULL;
 
-  if (evpy_add_attribute (event.get (), "address", addr_obj.get ()) < 0)
+  if (evpy_add_attribute (event, "address", addr_obj) < 0)
     return NULL;
 
   return event;
@@ -72,14 +72,14 @@ create_register_changed_event_object (const frame_info_ptr &frame,
   if (frame_obj == NULL)
     return NULL;
 
-  if (evpy_add_attribute (event.get (), "frame", frame_obj.get ()) < 0)
+  if (evpy_add_attribute (event, "frame", frame_obj) < 0)
     return NULL;
 
   gdbpy_ref<> regnum_obj = gdb_py_object_from_longest (regnum);
   if (regnum_obj == NULL)
     return NULL;
 
-  if (evpy_add_attribute (event.get (), "regnum", regnum_obj.get ()) < 0)
+  if (evpy_add_attribute (event, "regnum", regnum_obj) < 0)
     return NULL;
 
   return event;
@@ -100,14 +100,14 @@ create_memory_changed_event_object (CORE_ADDR addr, ssize_t len)
   if (addr_obj == NULL)
     return NULL;
 
-  if (evpy_add_attribute (event.get (), "address", addr_obj.get ()) < 0)
+  if (evpy_add_attribute (event, "address", addr_obj) < 0)
     return NULL;
 
   gdbpy_ref<> len_obj = gdb_py_object_from_longest (len);
   if (len_obj == NULL)
     return NULL;
 
-  if (evpy_add_attribute (event.get (), "length", len_obj.get ()) < 0)
+  if (evpy_add_attribute (event, "length", len_obj) < 0)
     return NULL;
 
   return event;
diff --git a/gdb/python/py-newobjfileevent.c b/gdb/python/py-newobjfileevent.c
index e72e9ae67e3..cac49b2a39c 100644
--- a/gdb/python/py-newobjfileevent.c
+++ b/gdb/python/py-newobjfileevent.c
@@ -28,9 +28,8 @@ create_new_objfile_event_object (struct objfile *objfile)
     return NULL;
 
   gdbpy_ref<> py_objfile = objfile_to_objfile_object (objfile);
-  if (py_objfile == NULL || evpy_add_attribute (objfile_event.get (),
-						"new_objfile",
-						py_objfile.get ()) < 0)
+  if (py_objfile == nullptr
+      || evpy_add_attribute (objfile_event, "new_objfile", py_objfile) < 0)
     return NULL;
 
   return objfile_event;
@@ -65,8 +64,7 @@ create_free_objfile_event_object (struct objfile *objfile)
 
   gdbpy_ref<> py_objfile = objfile_to_objfile_object (objfile);
   if (py_objfile == nullptr
-      || evpy_add_attribute (objfile_event.get (), "objfile",
-			     py_objfile.get ()) < 0)
+      || evpy_add_attribute (objfile_event, "objfile", py_objfile) < 0)
     return nullptr;
 
   return objfile_event;
@@ -100,9 +98,8 @@ create_clear_objfiles_event_object (program_space *pspace)
     return NULL;
 
   gdbpy_ref<> py_progspace = pspace_to_pspace_object (pspace);
-  if (py_progspace == NULL || evpy_add_attribute (objfile_event.get (),
-						  "progspace",
-						  py_progspace.get ()) < 0)
+  if (py_progspace == nullptr
+      || evpy_add_attribute (objfile_event, "progspace", py_progspace) < 0)
     return NULL;
 
   return objfile_event;
diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c
index 31ea3ad8fc8..a88535bdca9 100644
--- a/gdb/python/py-progspace.c
+++ b/gdb/python/py-progspace.c
@@ -638,14 +638,12 @@ emit_executable_changed_event (eventregistry_object *registry,
 
   gdbpy_ref<> py_pspace = pspace_to_pspace_object (pspace);
   if (py_pspace == nullptr
-      || evpy_add_attribute (event_obj.get (), "progspace",
-			     py_pspace.get ()) < 0)
+      || evpy_add_attribute (event_obj, "progspace", py_pspace) < 0)
     return -1;
 
   gdbpy_ref<> py_reload_p (PyBool_FromLong (reload_p ? 1 : 0));
   if (py_reload_p == nullptr
-      || evpy_add_attribute (event_obj.get (), "reload",
-			     py_reload_p.get ()) < 0)
+      || evpy_add_attribute (event_obj, "reload", py_reload_p) < 0)
     return -1;
 
   return evpy_emit_event (event_obj, registry);
@@ -706,8 +704,7 @@ gdbpy_program_space_event (program_space *pspace, bool adding_p)
 
   gdbpy_ref<> event = create_event_object (event_type);
   if (event == nullptr
-      || evpy_add_attribute (event.get (), "progspace",
-			     pspace_obj.get ()) < 0
+      || evpy_add_attribute (event, "progspace", pspace_obj) < 0
       || evpy_emit_event (event, registry) < 0)
     gdbpy_print_stack ();
 }
diff --git a/gdb/python/py-signalevent.c b/gdb/python/py-signalevent.c
index dc8639bb4d8..3be6ab31c6f 100644
--- a/gdb/python/py-signalevent.c
+++ b/gdb/python/py-signalevent.c
@@ -34,9 +34,8 @@ create_signal_event_object (const gdbpy_ref<> &dict,
   gdbpy_ref<> signal_name_obj (PyUnicode_FromString (signal_name));
   if (signal_name_obj == NULL)
     return NULL;
-  if (evpy_add_attribute (signal_event_obj.get (),
-			  "stop_signal",
-			  signal_name_obj.get ()) < 0)
+  if (evpy_add_attribute (signal_event_obj, "stop_signal",
+			  signal_name_obj) < 0)
     return NULL;
 
   return signal_event_obj;
diff --git a/gdb/python/py-stopevent.c b/gdb/python/py-stopevent.c
index 77db754140c..3f07f8a29fb 100644
--- a/gdb/python/py-stopevent.c
+++ b/gdb/python/py-stopevent.c
@@ -32,7 +32,7 @@ create_stop_event_object (PyTypeObject *py_type, const gdbpy_ref<> &dict)
   if (result == nullptr)
     return nullptr;
 
-  if (evpy_add_attribute (result.get (), "details", dict.get ()) < 0)
+  if (evpy_add_attribute (result, "details", dict) < 0)
     return nullptr;
 
   return result;
diff --git a/gdb/python/py-threadevent.c b/gdb/python/py-threadevent.c
index d2998d92304..9b0a963d0ba 100644
--- a/gdb/python/py-threadevent.c
+++ b/gdb/python/py-threadevent.c
@@ -45,9 +45,7 @@ create_thread_event_object (PyTypeObject *py_type, PyObject *thread)
   if (thread_event_obj == NULL)
     return NULL;
 
-  if (evpy_add_attribute (thread_event_obj.get (),
-			  "inferior_thread",
-			  thread) < 0)
+  if (evpy_add_attribute (thread_event_obj, "inferior_thread", thread) < 0)
     return NULL;
 
   return thread_event_obj;
diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c
index 0046c66d570..625de3bf87b 100644
--- a/gdb/python/py-tui.c
+++ b/gdb/python/py-tui.c
@@ -605,7 +605,7 @@ gdbpy_tui_enabled (bool state)
     }
 
   gdbpy_ref<> code (PyBool_FromLong (state));
-  if (evpy_add_attribute (event_obj.get (), "enabled", code.get ()) < 0
+  if (evpy_add_attribute (event_obj, "enabled", code) < 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 5312cdbdb01..83923a2059c 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -2500,7 +2500,7 @@ emit_exiting_event (int exit_code)
     return -1;
 
   gdbpy_ref<> code = gdb_py_object_from_longest (exit_code);
-  if (evpy_add_attribute (event_obj.get (), "exit_code", code.get ()) < 0)
+  if (evpy_add_attribute (event_obj, "exit_code", code) < 0)
     return -1;
 
   return evpy_emit_event (event_obj, gdb_py_events.gdb_exiting);

-- 
2.49.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 3/4] Use gdbpy_borrowed_ref when creating events
  2026-08-08 21:47 [PATCH 0/4] Use gdbpy_borrowed_ref more + cast removal Tom Tromey
  2026-08-08 21:47 ` [PATCH 1/4] Change evpy_emit_event to accept a gdbpy_opt_borrowed_ref Tom Tromey
  2026-08-08 21:47 ` [PATCH 2/4] Change evpy_add_attribute to accept gdbpy_borrowed_ref Tom Tromey
@ 2026-08-08 21:47 ` Tom Tromey
  2026-08-08 21:47 ` [PATCH 4/4] Remove unneeded casts to PyObject* Tom Tromey
  3 siblings, 0 replies; 5+ messages in thread
From: Tom Tromey @ 2026-08-08 21:47 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This changes create_thread_event_object and
create_breakpoint_event_object to accept gdbpy_borrowed_ref.  This
allows the removal of some calls to "get".
---
 gdb/python/py-bpevent.c       | 3 ++-
 gdb/python/py-continueevent.c | 2 +-
 gdb/python/py-event.h         | 2 +-
 gdb/python/py-inferior.c      | 3 +--
 gdb/python/py-stopevent.c     | 2 +-
 gdb/python/py-stopevent.h     | 7 ++++---
 gdb/python/py-threadevent.c   | 4 ++--
 7 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/gdb/python/py-bpevent.c b/gdb/python/py-bpevent.c
index 20a7745e4cc..2fcaac76c4e 100644
--- a/gdb/python/py-bpevent.c
+++ b/gdb/python/py-bpevent.c
@@ -24,7 +24,8 @@
 
 gdbpy_ref<>
 create_breakpoint_event_object (const gdbpy_ref<> &dict,
-				PyObject *breakpoint_list, PyObject *first_bp)
+				gdbpy_borrowed_ref<> breakpoint_list,
+				gdbpy_borrowed_ref<> first_bp)
 {
   gdbpy_ref<> breakpoint_event_obj
     = create_stop_event_object (&breakpoint_event_object_type, dict);
diff --git a/gdb/python/py-continueevent.c b/gdb/python/py-continueevent.c
index 06d4dabadd9..48c24cc710d 100644
--- a/gdb/python/py-continueevent.c
+++ b/gdb/python/py-continueevent.c
@@ -36,7 +36,7 @@ create_continue_event_object (ptid_t ptid)
     return nullptr;
 
   return create_thread_event_object (&continue_event_object_type,
-				     py_thr.get ());
+				     py_thr);
 }
 
 /* Callback function which notifies observers when a continue event occurs.
diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h
index 2c724c9a084..100840318a5 100644
--- a/gdb/python/py-event.h
+++ b/gdb/python/py-event.h
@@ -74,7 +74,7 @@ extern gdbpy_ref<> create_event_object (PyTypeObject *py_type);
 extern gdbpy_ref<> py_get_event_thread (ptid_t ptid);
 
 extern gdbpy_ref<> create_thread_event_object (PyTypeObject *py_type,
-					       PyObject *thread);
+					       gdbpy_borrowed_ref<> thread);
 
 extern int emit_new_objfile_event (struct objfile *objfile);
 extern int emit_free_objfile_event (struct objfile *objfile);
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index ab3a95da1bf..dd2a3a0da24 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -333,8 +333,7 @@ add_thread_object (struct thread_info *tp)
     return;
 
   gdbpy_ref<> event = create_thread_event_object
-    (&new_thread_event_object_type,
-     (PyObject *) ins_result.first->second.get ());
+    (&new_thread_event_object_type, ins_result.first->second);
 
   if (event == NULL
       || evpy_emit_event (event, gdb_py_events.new_thread) < 0)
diff --git a/gdb/python/py-stopevent.c b/gdb/python/py-stopevent.c
index 3f07f8a29fb..cdb1ad3fc50 100644
--- a/gdb/python/py-stopevent.c
+++ b/gdb/python/py-stopevent.c
@@ -28,7 +28,7 @@ create_stop_event_object (PyTypeObject *py_type, const gdbpy_ref<> &dict)
   if (thread == nullptr)
     return nullptr;
 
-  gdbpy_ref<> result = create_thread_event_object (py_type, thread.get ());
+  gdbpy_ref<> result = create_thread_event_object (py_type, thread);
   if (result == nullptr)
     return nullptr;
 
diff --git a/gdb/python/py-stopevent.h b/gdb/python/py-stopevent.h
index f9a14fe00c1..7b36825019c 100644
--- a/gdb/python/py-stopevent.h
+++ b/gdb/python/py-stopevent.h
@@ -28,9 +28,10 @@ extern gdbpy_ref<> create_stop_event_object (PyTypeObject *py_type,
 extern int emit_stop_event (struct bpstat *bs,
 			    enum gdb_signal stop_signal);
 
-extern gdbpy_ref<> create_breakpoint_event_object (const gdbpy_ref<> &dict,
-						   PyObject *breakpoint_list,
-						   PyObject *first_bp);
+extern gdbpy_ref<> create_breakpoint_event_object
+     (const gdbpy_ref<> &dict,
+      gdbpy_borrowed_ref<> breakpoint_list,
+      gdbpy_borrowed_ref<> first_bp);
 
 extern gdbpy_ref<> create_signal_event_object (const gdbpy_ref<> &dict,
 					       enum gdb_signal stop_signal);
diff --git a/gdb/python/py-threadevent.c b/gdb/python/py-threadevent.c
index 9b0a963d0ba..a4a0c16dffc 100644
--- a/gdb/python/py-threadevent.c
+++ b/gdb/python/py-threadevent.c
@@ -37,7 +37,7 @@ py_get_event_thread (ptid_t ptid)
 }
 
 gdbpy_ref<>
-create_thread_event_object (PyTypeObject *py_type, PyObject *thread)
+create_thread_event_object (PyTypeObject *py_type, gdbpy_borrowed_ref<> thread)
 {
   gdb_assert (thread != NULL);
 
@@ -65,7 +65,7 @@ emit_thread_exit_event (thread_info * thread)
     return -1;
 
   auto inf_thr = create_thread_event_object (&thread_exited_event_object_type,
-				     py_thr.get ());
+					     py_thr);
   if (inf_thr == nullptr)
     return -1;
 

-- 
2.49.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 4/4] Remove unneeded casts to PyObject*
  2026-08-08 21:47 [PATCH 0/4] Use gdbpy_borrowed_ref more + cast removal Tom Tromey
                   ` (2 preceding siblings ...)
  2026-08-08 21:47 ` [PATCH 3/4] Use gdbpy_borrowed_ref when creating events Tom Tromey
@ 2026-08-08 21:47 ` Tom Tromey
  3 siblings, 0 replies; 5+ messages in thread
From: Tom Tromey @ 2026-08-08 21:47 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

Since Python wrapper objects now derive from PyObject, upcasts to
"PyObject *" are no longer needed.  This removes many such casts.
---
 gdb/python/py-arch.c             |  2 +-
 gdb/python/py-block.c            |  2 +-
 gdb/python/py-breakpoint.c       | 19 +++++++------------
 gdb/python/py-cmd.c              |  8 ++++----
 gdb/python/py-corefile.c         |  6 +++---
 gdb/python/py-disasm.c           | 13 ++++++-------
 gdb/python/py-evts.c             |  4 +---
 gdb/python/py-finishbreakpoint.c |  7 +++----
 gdb/python/py-inferior.c         |  8 +++-----
 gdb/python/py-infthread.c        |  2 +-
 gdb/python/py-lazy-string.c      |  2 +-
 gdb/python/py-linetable.c        |  4 ++--
 gdb/python/py-membuf.c           |  2 +-
 gdb/python/py-micmd.c            |  2 +-
 gdb/python/py-objfile.c          |  7 +++----
 gdb/python/py-progspace.c        |  2 +-
 gdb/python/py-record-btrace.c    |  2 +-
 gdb/python/py-record.c           | 10 +++++-----
 gdb/python/py-registers.c        |  4 ++--
 gdb/python/py-stopevent.c        |  3 +--
 gdb/python/py-tui.c              |  2 +-
 gdb/python/py-type.c             |  6 +++---
 gdb/python/py-unwind.c           | 12 +++++-------
 23 files changed, 57 insertions(+), 72 deletions(-)

diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c
index 5b3cfbdc876..24009c958da 100644
--- a/gdb/python/py-arch.c
+++ b/gdb/python/py-arch.c
@@ -59,7 +59,7 @@ arch_object_data_init (struct gdbarch *gdbarch)
 
   arch_obj->gdbarch = gdbarch;
 
-  return (PyObject *) arch_obj;
+  return arch_obj;
 }
 
 /* Returns the struct gdbarch value corresponding to the given Python
diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c
index 99c487bc875..593c39486f8 100644
--- a/gdb/python/py-block.c
+++ b/gdb/python/py-block.c
@@ -98,7 +98,7 @@ blpy_iter (PyObject *self)
   Py_INCREF (self);
   block_iter_obj->source = (block_object *) self;
 
-  return (PyObject *) block_iter_obj;
+  return block_iter_obj;
 }
 
 static PyObject *
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index b628e14ae4e..60794be198d 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -846,7 +846,7 @@ bppy_get_locations (PyObject *self, void *closure)
       Py_INCREF (self);
       py_bploc->owner = self_bp;
       py_bploc->bp_loc = ref.release ();
-      if (PyList_Append (list.get (), (PyObject *) py_bploc.get ()) != 0)
+      if (PyList_Append (list.get (), py_bploc.get ()) != 0)
 	return nullptr;
     }
   return list.release ();
@@ -1097,7 +1097,7 @@ bppy_repr (PyObject *self)
 static bool
 build_bp_list (struct breakpoint *b, PyObject *list)
 {
-  PyObject *bp = (PyObject *) b->py_bp_object;
+  PyObject *bp = b->py_bp_object;
 
   /* Not all breakpoints will have a companion Python object.
      Only breakpoints that were created via bppy_new, or
@@ -1161,7 +1161,6 @@ gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
 {
   int stop;
   struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
-  PyObject *py_bp = (PyObject *) bp_obj;
 
   if (bp_obj == NULL)
     return EXT_LANG_BP_STOP_UNSET;
@@ -1173,9 +1172,9 @@ gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
   if (bp_obj->is_finish_bp)
     bpfinishpy_pre_stop_hook (bp_obj);
 
-  if (PyObject_HasAttrString (py_bp, stop_func))
+  if (PyObject_HasAttrString (bp_obj, stop_func))
     {
-      gdbpy_ref<> result = gdbpy_call_method (py_bp, stop_func);
+      gdbpy_ref<> result = gdbpy_call_method (bp_obj, stop_func);
 
       stop = 1;
       if (result != NULL)
@@ -1210,15 +1209,11 @@ int
 gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
 			   struct breakpoint *b)
 {
-  PyObject *py_bp;
-
   if (b->py_bp_object == NULL)
     return 0;
 
-  py_bp = (PyObject *) b->py_bp_object;
-
   gdbpy_enter enter_py (b->gdbarch);
-  return PyObject_HasAttrString (py_bp, stop_func);
+  return PyObject_HasAttrString (b->py_bp_object, stop_func);
 }
 
 \f
@@ -1337,7 +1332,7 @@ gdbpy_breakpoint_modified (struct breakpoint *b)
     {
       gdbpy_enter enter_py (b->gdbarch);
 
-      PyObject *bp_obj = (PyObject *) bp->py_bp_object;
+      PyObject *bp_obj = bp->py_bp_object;
       if (bp_obj)
 	{
 	  if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_modified))
@@ -1625,7 +1620,7 @@ bplocpy_get_owner (PyObject *py_self, void *closure)
   BPPY_REQUIRE_VALID (self->owner);
   BPLOCPY_REQUIRE_VALID (self->owner, self);
   Py_INCREF (self->owner);
-  return (PyObject *) self->owner;
+  return self->owner;
 }
 
 /* Attempt to get fully resolved file path for symtab.  */
diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c
index 24938fcda15..c305c0ab5a4 100644
--- a/gdb/python/py-cmd.c
+++ b/gdb/python/py-cmd.c
@@ -111,7 +111,7 @@ cmdpy_function (const char *args, int from_tty, cmd_list_element *command)
      'invoke' method when it was created.  If the 'invoke' method is now
      missing, then the user has done something weird (like deleting the
      invoke method, yuck!).  */
-  if (!PyObject_HasAttr ((PyObject *) obj, invoke_cst))
+  if (!PyObject_HasAttr (obj, invoke_cst))
     error (_("Python command object missing 'invoke' method."));
 
   if (args == nullptr)
@@ -125,7 +125,7 @@ cmdpy_function (const char *args, int from_tty, cmd_list_element *command)
     }
 
   gdbpy_ref<> ttyobj (PyBool_FromLong (from_tty));
-  gdbpy_ref<> result (PyObject_CallMethodObjArgs ((PyObject *) obj, invoke_cst,
+  gdbpy_ref<> result (PyObject_CallMethodObjArgs (obj, invoke_cst,
 						  argobj.get (), ttyobj.get (),
 						  NULL));
 
@@ -170,7 +170,7 @@ cmdpy_completer_helper (struct cmd_list_element *command,
 
   if (obj == NULL)
     error (_("Invalid invocation of Python command object."));
-  if (!PyObject_HasAttr ((PyObject *) obj, complete_cst))
+  if (!PyObject_HasAttr (obj, complete_cst))
     {
       /* If there is no complete method, don't error.  */
       return NULL;
@@ -201,7 +201,7 @@ cmdpy_completer_helper (struct cmd_list_element *command,
 	}
     }
 
-  gdbpy_ref<> resultobj (PyObject_CallMethodObjArgs ((PyObject *) obj,
+  gdbpy_ref<> resultobj (PyObject_CallMethodObjArgs (obj,
 						     complete_cst,
 						     textobj.get (),
 						     wordobj.get (), NULL));
diff --git a/gdb/python/py-corefile.c b/gdb/python/py-corefile.c
index a1dee384edf..58eac984feb 100644
--- a/gdb/python/py-corefile.c
+++ b/gdb/python/py-corefile.c
@@ -123,7 +123,7 @@ gdbpy_core_file_from_inferior (inferior *inf)
   if (get_inferior_core_bfd (inf) == nullptr)
     return py_none ();
 
-  PyObject *result = (PyObject *) cfpy_inferior_corefile_data_key.get (inf);
+  PyObject *result = cfpy_inferior_corefile_data_key.get (inf);
   if (result != nullptr)
     return gdbpy_ref<>::new_reference (result);
 
@@ -294,7 +294,7 @@ cfpy_mapped_files (PyObject *self, PyObject *args)
 
 	  /* Add to the gdb.CorefileMappedFileRegion list.  */
 	  if (PyTuple_SetItem (regions.get (), regions_idx++,
-			       (PyObject *) region_obj.release ()) < 0)
+			       region_obj.release ()) < 0)
 	    return nullptr;
 	}
 
@@ -313,7 +313,7 @@ cfpy_mapped_files (PyObject *self, PyObject *args)
 
       /* Add to the gdb.CorefileMappedFile list.  */
       if (PyTuple_SetItem (tuple.get (), tuple_idx++,
-			   (PyObject *) entry.release ()) < 0)
+			   entry.release ()) < 0)
 	return nullptr;
     }
 
diff --git a/gdb/python/py-disasm.c b/gdb/python/py-disasm.c
index a2abf37a605..48a2a4f6f8b 100644
--- a/gdb/python/py-disasm.c
+++ b/gdb/python/py-disasm.c
@@ -282,7 +282,7 @@ disasm_info_init (PyObject *self, PyObject *args, PyObject *kwargs)
 
   /* As the OTHER object now holds a pointer to INFO we inc the ref count
      on INFO.  This stops INFO being deleted until OTHER has gone away.  */
-  Py_INCREF ((PyObject *) info);
+  Py_INCREF (info);
   return 0;
 }
 
@@ -296,7 +296,7 @@ disasm_info_dealloc (PyObject *self)
   /* We no longer care about the object our NEXT pointer points at, so we
      can decrement its reference count.  This macro handles the case when
      NEXT is nullptr.  */
-  Py_XDECREF ((PyObject *) obj->next);
+  Py_XDECREF (obj->next);
 
   /* Now core deallocation behavior.  */
   Py_TYPE (self)->tp_free (self);
@@ -354,7 +354,7 @@ make_disasm_text_part (std::string &&str, enum disassembler_style style)
   text_part->string = new std::string (str);
   text_part->style = style;
 
-  return gdbpy_ref<> ((PyObject *) text_part);
+  return gdbpy_ref<> (text_part);
 }
 
 /* Create a new DisassemblerAddressPart and return a gdbpy_ref wrapper for
@@ -370,7 +370,7 @@ make_disasm_addr_part (struct gdbarch *gdbarch, CORE_ADDR address)
   addr_part->address = address;
   addr_part->gdbarch = gdbarch;
 
-  return gdbpy_ref<> ((PyObject *) addr_part);
+  return gdbpy_ref<> (addr_part);
 }
 
 /* Ensure that a gdb.disassembler.DisassembleInfo is valid.  */
@@ -837,8 +837,7 @@ gdbpy_disassembler::read_memory_func (bfd_vma memaddr, gdb_byte *buff,
 
   /* Now call the DisassembleInfo.read_memory method.  This might have been
      overridden by the user.  */
-  gdbpy_ref<> result_obj = gdbpy_call_method ((PyObject *) obj, "read_memory",
-					      len, offset);
+  gdbpy_ref<> result_obj = gdbpy_call_method (obj, "read_memory", len, offset);
 
   /* Handle any exceptions.  */
   if (result_obj == nullptr)
@@ -1236,7 +1235,7 @@ gdbpy_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
      disassembly.  */
   gdbpy_ref<> result
     (PyObject_CallFunctionObjArgs (hook.get (),
-				   (PyObject *) disasm_info.get (),
+				   disasm_info.get (),
 				   nullptr));
 
   if (result == nullptr)
diff --git a/gdb/python/py-evts.c b/gdb/python/py-evts.c
index 67d6caff478..adb747025fd 100644
--- a/gdb/python/py-evts.c
+++ b/gdb/python/py-evts.c
@@ -43,9 +43,7 @@ add_new_registry (eventregistry_object **registryp, const char *name)
   if (*registryp == NULL)
     return -1;
 
-  return gdb_pymodule_addobject (gdb_py_events.mod,
-				 name,
-				 (PyObject *)(*registryp));
+  return gdb_pymodule_addobject (gdb_py_events.mod, name, *registryp);
 }
 
 /* Create and populate the _gdbevents module.  Note that this is
diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c
index 49e12c00054..9f3b90acdec 100644
--- a/gdb/python/py-finishbreakpoint.c
+++ b/gdb/python/py-finishbreakpoint.c
@@ -343,12 +343,11 @@ static void
 bpfinishpy_out_of_scope (struct finish_breakpoint_object *bpfinish_obj)
 {
   gdbpy_breakpoint_object *bp_obj = (gdbpy_breakpoint_object *) bpfinish_obj;
-  PyObject *py_obj = (PyObject *) bp_obj;
 
   if (bpfinish_obj->py_bp.bp->enable_state == bp_enabled
-      && PyObject_HasAttrString (py_obj, outofscope_func))
+      && PyObject_HasAttrString (bp_obj, outofscope_func))
     {
-      gdbpy_ref<> meth_result = gdbpy_call_method (py_obj, outofscope_func);
+      gdbpy_ref<> meth_result = gdbpy_call_method (bp_obj, outofscope_func);
       if (meth_result == NULL)
 	gdbpy_print_stack ();
     }
@@ -366,7 +365,7 @@ bpfinishpy_detect_out_scope_cb (struct breakpoint *b,
 				struct breakpoint *bp_stopped,
 				bool delete_bp)
 {
-  PyObject *py_bp = (PyObject *) b->py_bp_object;
+  PyObject *py_bp = b->py_bp_object;
 
   /* Trigger out_of_scope if this is a FinishBreakpoint and its frame is
      not anymore in the current callstack.  */
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index dd2a3a0da24..4386489a8e7 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -296,8 +296,7 @@ thread_to_thread_object (thread_info *thr)
 
   auto thread_it = inf_obj->threads->find (thr);
   if (thread_it != inf_obj->threads->end ())
-    return gdbpy_ref<>::new_reference
-      ((PyObject *) (thread_it->second.get ()));
+    return gdbpy_ref<>::new_reference (thread_it->second.get ());
 
   PyErr_SetString (PyExc_SystemError,
 		   _("could not find gdb thread object"));
@@ -493,7 +492,7 @@ gdbpy_inferiors (PyObject *unused, PyObject *unused2)
       if (inferior == NULL)
 	continue;
 
-      if (PyList_Append (list.get (), (PyObject *) inferior.get ()) != 0)
+      if (PyList_Append (list.get (), inferior.get ()) != 0)
 	return NULL;
     }
 
@@ -985,8 +984,7 @@ infpy_dealloc (PyObject *obj)
 PyObject *
 gdbpy_selected_inferior (PyObject *self, PyObject *args)
 {
-  return ((PyObject *)
-	  inferior_to_inferior_object (current_inferior ()).release ());
+  return (inferior_to_inferior_object (current_inferior ()).release ());
 }
 
 /* Implement the selected_context event handler.  This is called when some
diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c
index 96c736495a8..a5ea749cba9 100644
--- a/gdb/python/py-infthread.c
+++ b/gdb/python/py-infthread.c
@@ -48,7 +48,7 @@ create_thread_object (struct thread_info *tp)
     return nullptr;
 
   thread_obj->thread = tp;
-  thread_obj->inf_obj = (PyObject *) inf_obj.release ();
+  thread_obj->inf_obj = inf_obj.release ();
   if (!thread_obj->allocate_dict ())
     return nullptr;
 
diff --git a/gdb/python/py-lazy-string.c b/gdb/python/py-lazy-string.c
index c9d06338b0a..1ea14395a73 100644
--- a/gdb/python/py-lazy-string.c
+++ b/gdb/python/py-lazy-string.c
@@ -236,7 +236,7 @@ gdbpy_create_lazy_string_object (CORE_ADDR address, long length,
     str_obj->encoding = xstrdup (encoding);
   str_obj->type = type_to_type_object (type).release ();
 
-  return (PyObject *) str_obj;
+  return str_obj;
 }
 
 static int
diff --git a/gdb/python/py-linetable.c b/gdb/python/py-linetable.c
index faaedc5e9e8..e5683b1f60a 100644
--- a/gdb/python/py-linetable.c
+++ b/gdb/python/py-linetable.c
@@ -113,7 +113,7 @@ build_linetable_entry (int line, CORE_ADDR address)
       obj->pc = address;
     }
 
-  return (PyObject *) obj;
+  return obj;
 }
 
 /* Internal helper function to build a Python Tuple from a vector.
@@ -350,7 +350,7 @@ ltpy_iter (PyObject *self)
   ltpy_iter_obj->source = self;
 
   Py_INCREF (self);
-  return (PyObject *) ltpy_iter_obj;
+  return ltpy_iter_obj;
 }
 
 static void
diff --git a/gdb/python/py-membuf.c b/gdb/python/py-membuf.c
index fa5156b885e..7951e9a92ac 100644
--- a/gdb/python/py-membuf.c
+++ b/gdb/python/py-membuf.c
@@ -53,7 +53,7 @@ gdbpy_buffer_to_membuf (gdb::unique_xmalloc_ptr<gdb_byte> buffer,
   membuf_obj->addr = address;
   membuf_obj->length = length;
 
-  return PyMemoryView_FromObject ((PyObject *) membuf_obj.get ());
+  return PyMemoryView_FromObject (membuf_obj.get ());
 }
 
 /* Destructor for gdb.Membuf objects.  */
diff --git a/gdb/python/py-micmd.c b/gdb/python/py-micmd.c
index 9f6e664a5f2..ecdf4b72018 100644
--- a/gdb/python/py-micmd.c
+++ b/gdb/python/py-micmd.c
@@ -207,7 +207,7 @@ mi_command_py::invoke (struct mi_parse *parse) const
   gdb_assert (this->m_pyobj != nullptr);
   gdb_assert (PyErr_Occurred () == nullptr);
   gdbpy_ref<> results
-    (PyObject_CallMethodObjArgs ((PyObject *) this->m_pyobj.get (), invoke_cst,
+    (PyObject_CallMethodObjArgs (this->m_pyobj.get (), invoke_cst,
 				 argobj.get (), nullptr));
   if (results == nullptr)
     gdbpy_handle_exception ();
diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
index ec8b82fbe13..dcd326b696c 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -237,7 +237,7 @@ objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
   if (self != nullptr && !objfpy_initialize (self))
     return nullptr;
 
-  return (PyObject *) self.release ();
+  return self.release ();
 }
 
 PyObject *
@@ -670,8 +670,7 @@ gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw)
 gdbpy_ref<>
 objfile_to_objfile_object (struct objfile *objfile)
 {
-  PyObject *result
-    = (PyObject *) objfpy_objfile_data_key.get (objfile);
+  PyObject *result = objfpy_objfile_data_key.get (objfile);
   if (result == NULL)
     {
       gdbpy_ref<objfile_object> object
@@ -683,7 +682,7 @@ objfile_to_objfile_object (struct objfile *objfile)
 
       object->objfile = objfile;
       objfpy_objfile_data_key.set (objfile, object.get ());
-      result = (PyObject *) object.release ();
+      result = object.release ();
     }
 
   return gdbpy_ref<>::new_reference (result);
diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c
index a88535bdca9..de6bfc65346 100644
--- a/gdb/python/py-progspace.c
+++ b/gdb/python/py-progspace.c
@@ -583,7 +583,7 @@ pspy_is_valid (PyObject *o, PyObject *args)
 gdbpy_ref<>
 pspace_to_pspace_object (struct program_space *pspace)
 {
-  PyObject *result = (PyObject *) pspy_pspace_data_key.get (pspace);
+  PyObject *result = pspy_pspace_data_key.get (pspace);
   if (result != nullptr)
     return gdbpy_ref<>::new_reference (result);
 
diff --git a/gdb/python/py-record-btrace.c b/gdb/python/py-record-btrace.c
index e60bc44e81f..a73167a5bdd 100644
--- a/gdb/python/py-record-btrace.c
+++ b/gdb/python/py-record-btrace.c
@@ -197,7 +197,7 @@ btpy_list_new (thread_info *thread, Py_ssize_t first, Py_ssize_t last,
   obj->step = step;
   obj->element_type = element_type;
 
-  return (PyObject *) obj;
+  return obj;
 }
 
 /* Implementation of RecordInstruction.sal [gdb.Symtab_and_line] for btrace.
diff --git a/gdb/python/py-record.c b/gdb/python/py-record.c
index 15e1b9f3316..c3ac53336eb 100644
--- a/gdb/python/py-record.c
+++ b/gdb/python/py-record.c
@@ -208,7 +208,7 @@ recpy_insn_new (thread_info *thread, enum record_method method,
   obj->method = method;
   obj->number = number;
 
-  return (PyObject *) obj;
+  return obj;
 }
 
 /* Implementation of RecordInstruction.sal [gdb.Symtab_and_line].  */
@@ -305,7 +305,7 @@ recpy_func_new (thread_info *thread, enum record_method method,
   obj->method = method;
   obj->number = number;
 
-  return (PyObject *) obj;
+  return obj;
 }
 
 /* Implementation of RecordFunctionSegment.level [int].  */
@@ -460,7 +460,7 @@ recpy_gap_new (int reason_code, const char *reason_string, Py_ssize_t number)
   obj->reason_string = reason_string;
   obj->number = number;
 
-  return (PyObject *) obj;
+  return obj;
 }
 
 /* Implementation of RecordGap.number [int].  */
@@ -509,7 +509,7 @@ recpy_aux_new (thread_info *thread, enum record_method method,
   obj->method = method;
   obj->number = number;
 
-  return (PyObject *) obj;
+  return obj;
 }
 
 /* Implementation of Auxiliary.data [buffer].  */
@@ -698,7 +698,7 @@ gdbpy_current_recording (PyObject *self, PyObject *args)
   ret->thread = inferior_thread ();
   ret->method = target_record_method (ret->thread->ptid);
 
-  return (PyObject *) ret;
+  return ret;
 }
 
 /* Implementation of gdb.stop_recording (self) -> None.  */
diff --git a/gdb/python/py-registers.c b/gdb/python/py-registers.c
index e0180660715..348acbfd4d0 100644
--- a/gdb/python/py-registers.c
+++ b/gdb/python/py-registers.c
@@ -244,7 +244,7 @@ gdbpy_new_reggroup_iterator (struct gdbarch *gdbarch)
     return NULL;
   iter->index = 0;
   iter->gdbarch = gdbarch;
-  return (PyObject *) iter;
+  return iter;
 }
 
 /* Create and return a new gdb.RegisterDescriptorIterator object which
@@ -286,7 +286,7 @@ gdbpy_new_register_descriptor_iterator (struct gdbarch *gdbarch,
   gdb_assert (grp != NULL);
   iter->reggroup = grp;
 
-  return (PyObject *) iter;
+  return iter;
 }
 
 /* Return a reference to the gdb.RegisterDescriptorIterator object.  */
diff --git a/gdb/python/py-stopevent.c b/gdb/python/py-stopevent.c
index cdb1ad3fc50..01c95b66e9d 100644
--- a/gdb/python/py-stopevent.c
+++ b/gdb/python/py-stopevent.c
@@ -123,8 +123,7 @@ emit_stop_event (struct bpstat *bs, enum gdb_signal stop_signal)
       if (current_bs->breakpoint_at
 	  && current_bs->breakpoint_at->py_bp_object)
 	{
-	  PyObject *current_py_bp =
-	      (PyObject *) current_bs->breakpoint_at->py_bp_object;
+	  PyObject *current_py_bp = current_bs->breakpoint_at->py_bp_object;
 
 	  if (list == NULL)
 	    {
diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c
index 625de3bf87b..465fbd2fe6d 100644
--- a/gdb/python/py-tui.c
+++ b/gdb/python/py-tui.c
@@ -420,7 +420,7 @@ gdbpy_tui_window_maker::operator() (const char *win_name)
 
   gdbpy_ref<> user_window
     (PyObject_CallFunctionObjArgs (m_constr.get (),
-				   (PyObject *) wrapper.get (),
+				   wrapper.get (),
 				   nullptr));
   if (user_window == nullptr)
     {
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index 9dd0fe2ab37..996fe54bb84 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -91,7 +91,7 @@ field_dealloc (PyObject *obj)
   Py_TYPE (obj)->tp_free (obj);
 }
 
-static PyObject *
+static gdbpy_ref<>
 field_new (void)
 {
   gdbpy_ref<field_object> result (PyObject_New (field_object,
@@ -100,7 +100,7 @@ field_new (void)
   if (result != nullptr && !result->allocate_dict ())
     return nullptr;
 
-  return (PyObject *) result.release ();
+  return result;
 }
 
 \f
@@ -1347,7 +1347,7 @@ typy_make_iter (PyObject *self, enum gdbpy_iter_kind kind)
   Py_INCREF (self);
   typy_iter_obj->source = (type_object *) self;
 
-  return (PyObject *) typy_iter_obj;
+  return typy_iter_obj;
 }
 
 /* iteritems() method.  */
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index 13eced4cecb..feeba40fe84 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -294,7 +294,7 @@ pyuw_create_unwind_info (PyObject *pyo_pending_frame,
   Py_INCREF (pyo_pending_frame);
   unwind_info->pending_frame = pyo_pending_frame;
   unwind_info->saved_regs = new std::vector<saved_reg>;
-  return (PyObject *) unwind_info;
+  return unwind_info;
 }
 
 /* The implementation of
@@ -864,10 +864,9 @@ frame_unwind_python::sniff (const frame_info_ptr &this_frame,
 		     paddress (gdbarch, get_frame_pc (this_frame)));
 
   /* Create PendingFrame instance to pass to sniffers.  */
-  pending_frame_object *pfo = PyObject_New (pending_frame_object,
-					    &pending_frame_object_type);
-  gdbpy_ref<> pyo_pending_frame ((PyObject *) pfo);
-  if (pyo_pending_frame == NULL)
+  gdbpy_ref<pending_frame_object> pfo
+    (PyObject_New (pending_frame_object, &pending_frame_object_type));
+  if (pfo == NULL)
     {
       gdbpy_print_stack ();
       return 0;
@@ -900,8 +899,7 @@ frame_unwind_python::sniff (const frame_info_ptr &this_frame,
 
   /* A (gdb.UnwindInfo, str) tuple, or None.  */
   gdbpy_ref<> pyo_execute_ret
-    (PyObject_CallFunctionObjArgs (pyo_execute.get (),
-				   pyo_pending_frame.get (), NULL));
+    (PyObject_CallFunctionObjArgs (pyo_execute.get (), pfo.get (), nullptr));
   if (pyo_execute_ret == nullptr)
     {
       /* If the unwinder is cancelled due to a Ctrl-C, then propagate

-- 
2.49.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-08-08 21:48 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-08 21:47 [PATCH 0/4] Use gdbpy_borrowed_ref more + cast removal Tom Tromey
2026-08-08 21:47 ` [PATCH 1/4] Change evpy_emit_event to accept a gdbpy_opt_borrowed_ref Tom Tromey
2026-08-08 21:47 ` [PATCH 2/4] Change evpy_add_attribute to accept gdbpy_borrowed_ref Tom Tromey
2026-08-08 21:47 ` [PATCH 3/4] Use gdbpy_borrowed_ref when creating events Tom Tromey
2026-08-08 21:47 ` [PATCH 4/4] Remove unneeded casts to PyObject* Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox