[PATCH 1/4] Change evpy_emit_event to accept a gdbpy_opt_borrowed_ref

Tom Tromey <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <20260808-python-safety-events-simple-v1-1-132aea40c801@tromey.com>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.