From 7d221d749c0239f06ca571be6c9452cd22b5d582 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 8 Sep 2017 15:38:12 -0600 Subject: [PATCH] Make it simpler to add events to Python The first patch in this series went through several iterations as I'd forgotten how many places had to be touched to add a new event and a new event type. This patch simplifies the process using two new ".def" files. Now, a new event type can be added by adding a line to "py-event-types.def", and a new event registry can be added by adding a line to "py-all-events.def". ChangeLog 2017-09-11 Tom Tromey * python/python.c (do_start_initialization): Use py-event-types.def to initialize types. Define all object type structures. * python/python-internal.h: Don't declare event initialization functions. * python/py-threadevent.c (thread_event_object_type): Don't define. * python/py-stopevent.c (stop_event_object_type): Don't define. * python/py-signalevent.c (signal_event_object_type): Don't declare or define. * python/py-newobjfileevent.c (new_objfile_event_object_type) (clear_objfiles_event_object_type): Don't declare or define. * python/py-infevents.c (inferior_call_pre_event_object_type) (inferior_call_post_event_object_type) (register_changed_event_object_type) (memory_changed_event_object_type): Don't declare or define. * python/py-inferior.c (new_thread_event_object_type) (new_inferior_event_object_type) (inferior_deleted_event_object_type): Don't declare or define. * python/py-exitedevent.c (exited_event_object_type): Don't declare or define. * python/py-evts.c (gdbpy_initialize_py_events): Use py-all-events.def. * python/py-events.h (thread_event_object_type): Don't declare. (events_object): Use py-all-events.def. * python/py-event.h (GDBPY_NEW_EVENT_TYPE): Remove. Use py-event-types.def. * python/py-event-types.def: New file. * python/py-continueevent.c (create_continue_event_object): Don't declare or define. * python/py-bpevent.c (breakpoint_event_object_type): Don't declare or define. * python/py-all-events.def: New file. --- gdb/ChangeLog | 36 +++++++++++ gdb/python/py-all-events.def | 40 ++++++++++++ gdb/python/py-bpevent.c | 9 --- gdb/python/py-continueevent.c | 9 --- gdb/python/py-event-types.def | 107 ++++++++++++++++++++++++++++++++ gdb/python/py-event.h | 74 ++-------------------- gdb/python/py-events.h | 22 ++----- gdb/python/py-evts.c | 52 ++-------------- gdb/python/py-exitedevent.c | 10 --- gdb/python/py-inferior.c | 23 ------- gdb/python/py-infevents.c | 34 ---------- gdb/python/py-newobjfileevent.c | 16 ----- gdb/python/py-signalevent.c | 9 --- gdb/python/py-stopevent.c | 6 -- gdb/python/py-threadevent.c | 6 -- gdb/python/python-internal.h | 32 ---------- gdb/python/python.c | 68 +++++++++++++++----- 17 files changed, 250 insertions(+), 303 deletions(-) create mode 100644 gdb/python/py-all-events.def create mode 100644 gdb/python/py-event-types.def diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 61fb77efe9b..fa94de42288 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,39 @@ +2017-09-11 Tom Tromey + + * python/python.c (do_start_initialization): Use + py-event-types.def to initialize types. + Define all object type structures. + * python/python-internal.h: Don't declare event initialization + functions. + * python/py-threadevent.c (thread_event_object_type): Don't + define. + * python/py-stopevent.c (stop_event_object_type): Don't define. + * python/py-signalevent.c (signal_event_object_type): Don't + declare or define. + * python/py-newobjfileevent.c (new_objfile_event_object_type) + (clear_objfiles_event_object_type): Don't declare or define. + * python/py-infevents.c (inferior_call_pre_event_object_type) + (inferior_call_post_event_object_type) + (register_changed_event_object_type) + (memory_changed_event_object_type): Don't declare or define. + * python/py-inferior.c (new_thread_event_object_type) + (new_inferior_event_object_type) + (inferior_deleted_event_object_type): Don't declare or define. + * python/py-exitedevent.c (exited_event_object_type): Don't + declare or define. + * python/py-evts.c (gdbpy_initialize_py_events): Use + py-all-events.def. + * python/py-events.h (thread_event_object_type): Don't declare. + (events_object): Use py-all-events.def. + * python/py-event.h (GDBPY_NEW_EVENT_TYPE): Remove. Use + py-event-types.def. + * python/py-event-types.def: New file. + * python/py-continueevent.c (create_continue_event_object): Don't + declare or define. + * python/py-bpevent.c (breakpoint_event_object_type): Don't + declare or define. + * python/py-all-events.def: New file. + 2017-09-11 Tom Tromey * python/py-threadevent.c (create_thread_event_object): Return diff --git a/gdb/python/py-all-events.def b/gdb/python/py-all-events.def new file mode 100644 index 00000000000..cdede6bc3d8 --- /dev/null +++ b/gdb/python/py-all-events.def @@ -0,0 +1,40 @@ +/* Python event definitions -*- c++ -*- + + Copyright (C) 2017 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* To use this file, define GDB_PY_DEFINE_EVENT to expand how you + like, then include the file. + + GDB_PY_DEFINE_EVENT has one parameter, the name of the event. +*/ + +GDB_PY_DEFINE_EVENT(stop) +GDB_PY_DEFINE_EVENT(cont) +GDB_PY_DEFINE_EVENT(exited) +GDB_PY_DEFINE_EVENT(new_objfile) +GDB_PY_DEFINE_EVENT(clear_objfiles) +GDB_PY_DEFINE_EVENT(new_inferior) +GDB_PY_DEFINE_EVENT(inferior_deleted) +GDB_PY_DEFINE_EVENT(new_thread) +GDB_PY_DEFINE_EVENT(inferior_call) +GDB_PY_DEFINE_EVENT(memory_changed) +GDB_PY_DEFINE_EVENT(register_changed) +GDB_PY_DEFINE_EVENT(breakpoint_created) +GDB_PY_DEFINE_EVENT(breakpoint_deleted) +GDB_PY_DEFINE_EVENT(breakpoint_modified) +GDB_PY_DEFINE_EVENT(before_prompt) diff --git a/gdb/python/py-bpevent.c b/gdb/python/py-bpevent.c index 021c83aff92..1cb3f9a45ca 100644 --- a/gdb/python/py-bpevent.c +++ b/gdb/python/py-bpevent.c @@ -21,9 +21,6 @@ #include "py-stopevent.h" #include "py-ref.h" -extern PyTypeObject breakpoint_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); - /* Create and initialize a BreakpointEvent object. This acquires new references to BREAKPOINT_LIST and FIRST_BP. */ @@ -47,9 +44,3 @@ create_breakpoint_event_object (PyObject *breakpoint_list, PyObject *first_bp) return breakpoint_event_obj; } - -GDBPY_NEW_EVENT_TYPE (breakpoint, - "gdb.BreakpointEvent", - "BreakpointEvent", - "GDB breakpoint stop event object", - stop_event_object_type); diff --git a/gdb/python/py-continueevent.c b/gdb/python/py-continueevent.c index ca2927fcf35..8c704b930f3 100644 --- a/gdb/python/py-continueevent.c +++ b/gdb/python/py-continueevent.c @@ -21,9 +21,6 @@ #include "py-event.h" #include "py-ref.h" -extern PyTypeObject continue_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); - static gdbpy_ref<> create_continue_event_object (void) { @@ -45,9 +42,3 @@ emit_continue_event (ptid_t ptid) return evpy_emit_event (event.get (), gdb_py_events.cont); return -1; } - -GDBPY_NEW_EVENT_TYPE (continue, - "gdb.ContinueEvent", - "ContinueEvent", - "GDB continue event object", - thread_event_object_type); diff --git a/gdb/python/py-event-types.def b/gdb/python/py-event-types.def new file mode 100644 index 00000000000..f571f66cd4b --- /dev/null +++ b/gdb/python/py-event-types.def @@ -0,0 +1,107 @@ +/* Python event definitions -*- c++ -*- + + Copyright (C) 2017 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* To use this file, define GDB_PY_DEFINE_EVENT_TYPE to expand how you + like, then include the file. + + Each invocation is of the form: + + GDB_PY_DEFINE_EVENT_TYPE(name, py_name, doc, base) + + NAME is the name of the event. + PY_NAME a string representing what the event should be called in + python. + DOC Python documentation for the new event type + BASE the base event for this event usually just event_object_type. +*/ + +GDB_PY_DEFINE_EVENT_TYPE (breakpoint, + "BreakpointEvent", + "GDB breakpoint stop event object", + stop_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (continue, + "ContinueEvent", + "GDB continue event object", + thread_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (exited, + "ExitedEvent", + "GDB exited event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (new_thread, + "NewThreadEvent", + "GDB new thread event object", + thread_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (new_inferior, + "NewInferiorEvent", + "GDB new inferior event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (inferior_deleted, + "InferiorDeletedEvent", + "GDB inferior deleted event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (inferior_call_pre, + "InferiorCallPreEvent", + "GDB inferior function pre-call event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (inferior_call_post, + "InferiorCallPostEvent", + "GDB inferior function post-call event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (register_changed, + "RegisterChangedEvent", + "GDB register change event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (memory_changed, + "MemoryChangedEvent", + "GDB memory change event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (new_objfile, + "NewObjFileEvent", + "GDB new object file event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (clear_objfiles, + "ClearObjFilesEvent", + "GDB clear object files event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (signal, + "SignalEvent", + "GDB signal event object", + stop_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (stop, + "StopEvent", + "GDB stop event object", + thread_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (thread, + "ThreadEvent", + "GDB thread event object", + event_object_type); diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h index 27db8287bb5..24442608653 100644 --- a/gdb/python/py-event.h +++ b/gdb/python/py-event.h @@ -26,74 +26,12 @@ #include "inferior.h" #include "py-ref.h" -/* This macro creates the following functions: - - gdbpy_initialize_{NAME}_event - Used to add the newly created event type to the gdb module. - - and the python type data structure for the event: - - struct PyTypeObject {NAME}_event_object_type - - NAME is the name of the event. - PY_PATH is a string representing the module and python name of - the event. - PY_NAME a string representing what the event should be called in - python. - DOC Python documentation for the new event type - BASE the base event for this event usually just event_object_type. -*/ - -#define GDBPY_NEW_EVENT_TYPE(name, py_path, py_name, doc, base) \ -\ - PyTypeObject name##_event_object_type \ - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object") \ - = { \ - PyVarObject_HEAD_INIT (NULL, 0) \ - py_path, /* tp_name */ \ - sizeof (event_object), /* tp_basicsize */ \ - 0, /* tp_itemsize */ \ - evpy_dealloc, /* tp_dealloc */ \ - 0, /* tp_print */ \ - 0, /* tp_getattr */ \ - 0, /* tp_setattr */ \ - 0, /* tp_compare */ \ - 0, /* tp_repr */ \ - 0, /* tp_as_number */ \ - 0, /* tp_as_sequence */ \ - 0, /* tp_as_mapping */ \ - 0, /* tp_hash */ \ - 0, /* tp_call */ \ - 0, /* tp_str */ \ - 0, /* tp_getattro */ \ - 0, /* tp_setattro */ \ - 0, /* tp_as_buffer */ \ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ \ - doc, /* tp_doc */ \ - 0, /* tp_traverse */ \ - 0, /* tp_clear */ \ - 0, /* tp_richcompare */ \ - 0, /* tp_weaklistoffset */ \ - 0, /* tp_iter */ \ - 0, /* tp_iternext */ \ - 0, /* tp_methods */ \ - 0, /* tp_members */ \ - 0, /* tp_getset */ \ - &base, /* tp_base */ \ - 0, /* tp_dict */ \ - 0, /* tp_descr_get */ \ - 0, /* tp_descr_set */ \ - 0, /* tp_dictoffset */ \ - 0, /* tp_init */ \ - 0 /* tp_alloc */ \ - }; \ -\ -int \ -gdbpy_initialize_##name##_event (void) \ -{ \ - return gdbpy_initialize_event_generic (&name##_event_object_type, \ - py_name); \ -} +/* Declare all event types. */ +#define GDB_PY_DEFINE_EVENT_TYPE(name, py_name, doc, base) \ + extern PyTypeObject name##_event_object_type \ + CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); +#include "py-event-types.def" +#undef GDB_PY_DEFINE_EVENT_TYPE typedef struct { diff --git a/gdb/python/py-events.h b/gdb/python/py-events.h index 2275d896e64..876b564fbc6 100644 --- a/gdb/python/py-events.h +++ b/gdb/python/py-events.h @@ -24,9 +24,6 @@ #include "python-internal.h" #include "inferior.h" -extern PyTypeObject thread_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); - /* Stores a list of objects to be notified when the event for which this registry tracks occurs. */ @@ -42,21 +39,10 @@ typedef struct typedef struct { - eventregistry_object *stop; - eventregistry_object *cont; - eventregistry_object *exited; - eventregistry_object *new_objfile; - eventregistry_object *clear_objfiles; - eventregistry_object *new_inferior; - eventregistry_object *inferior_deleted; - eventregistry_object *new_thread; - eventregistry_object *inferior_call; - eventregistry_object *memory_changed; - eventregistry_object *register_changed; - eventregistry_object *breakpoint_created; - eventregistry_object *breakpoint_deleted; - eventregistry_object *breakpoint_modified; - eventregistry_object *before_prompt; +#define GDB_PY_DEFINE_EVENT(name) \ + eventregistry_object *name; +#include "py-all-events.def" +#undef GDB_PY_DEFINE_EVENT PyObject *module; diff --git a/gdb/python/py-evts.c b/gdb/python/py-evts.c index ad9924190c3..0faf280045f 100644 --- a/gdb/python/py-evts.c +++ b/gdb/python/py-evts.c @@ -62,55 +62,11 @@ gdbpy_initialize_py_events (void) if (!gdb_py_events.module) return -1; - if (add_new_registry (&gdb_py_events.stop, "stop") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.cont, "cont") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.exited, "exited") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.inferior_call, - "inferior_call") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.memory_changed, - "memory_changed") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.register_changed, - "register_changed") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.new_objfile, "new_objfile") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.clear_objfiles, "clear_objfiles") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.new_inferior, "new_inferior") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.inferior_deleted, "inferior_deleted") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.new_thread, "new_thread") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.breakpoint_created, - "breakpoint_created") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.breakpoint_deleted, - "breakpoint_deleted") < 0) - return -1; - if (add_new_registry (&gdb_py_events.breakpoint_modified, - "breakpoint_modified") < 0) - return -1; - - if (add_new_registry (&gdb_py_events.before_prompt, "before_prompt") < 0) +#define GDB_PY_DEFINE_EVENT(name) \ + if (add_new_registry (&gdb_py_events.name, #name) < 0) \ return -1; +#include "py-all-events.def" +#undef GDB_PY_DEFINE_EVENT if (gdb_pymodule_addobject (gdb_module, "events", diff --git a/gdb/python/py-exitedevent.c b/gdb/python/py-exitedevent.c index 967fb1bdebf..aa4aefb7329 100644 --- a/gdb/python/py-exitedevent.c +++ b/gdb/python/py-exitedevent.c @@ -20,9 +20,6 @@ #include "defs.h" #include "py-event.h" -extern PyTypeObject exited_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); - static PyObject * create_exited_event_object (const LONGEST *exit_code, struct inferior *inf) { @@ -67,10 +64,3 @@ emit_exited_event (const LONGEST *exit_code, struct inferior *inf) return -1; } - - -GDBPY_NEW_EVENT_TYPE (exited, - "gdb.ExitedEvent", - "ExitedEvent", - "GDB exited event object", - event_object_type); diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index d7c6810884f..5cad042f820 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -30,13 +30,6 @@ #include "py-event.h" #include "py-stopevent.h" -extern PyTypeObject new_thread_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); -extern PyTypeObject new_inferior_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); -extern PyTypeObject inferior_deleted_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); - struct threadlist_entry { thread_object *thread_obj; struct threadlist_entry *next; @@ -1042,19 +1035,3 @@ PyTypeObject membuf_object_type = { 0, /* tp_init */ 0, /* tp_alloc */ }; - -GDBPY_NEW_EVENT_TYPE (new_thread, - "gdb.NewThreadEvent", - "NewThreadEvent", - "GDB new thread event object", - thread_event_object_type); -GDBPY_NEW_EVENT_TYPE (new_inferior, - "gdb.NewInferiorEvent", - "NewInferiorEvent", - "GDB new inferior event object", - event_object_type); -GDBPY_NEW_EVENT_TYPE (inferior_deleted, - "gdb.InferiorDeletedEvent", - "InferiorDeletedEvent", - "GDB inferior deleted event object", - event_object_type); diff --git a/gdb/python/py-infevents.c b/gdb/python/py-infevents.c index 8a63b79450e..825a89205d6 100644 --- a/gdb/python/py-infevents.c +++ b/gdb/python/py-infevents.c @@ -21,15 +21,6 @@ #include "py-event.h" #include "py-ref.h" -extern PyTypeObject inferior_call_pre_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); -extern PyTypeObject inferior_call_post_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); -extern PyTypeObject register_changed_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); -extern PyTypeObject memory_changed_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); - /* Construct either a gdb.InferiorCallPreEvent or a gdb.InferiorCallPostEvent. */ @@ -172,28 +163,3 @@ emit_register_changed_event (struct frame_info* frame, int regnum) return evpy_emit_event (event.get (), gdb_py_events.register_changed); return -1; } - - -GDBPY_NEW_EVENT_TYPE (inferior_call_pre, - "gdb.InferiorCallPreEvent", - "InferiorCallPreEvent", - "GDB inferior function pre-call event object", - event_object_type); - -GDBPY_NEW_EVENT_TYPE (inferior_call_post, - "gdb.InferiorCallPostEvent", - "InferiorCallPostEvent", - "GDB inferior function post-call event object", - event_object_type); - -GDBPY_NEW_EVENT_TYPE (register_changed, - "gdb.RegisterChangedEvent", - "RegisterChangedEvent", - "GDB register change event object", - event_object_type); - -GDBPY_NEW_EVENT_TYPE (memory_changed, - "gdb.MemoryChangedEvent", - "MemoryChangedEvent", - "GDB memory change event object", - event_object_type); diff --git a/gdb/python/py-newobjfileevent.c b/gdb/python/py-newobjfileevent.c index dc09e0f8349..227f4a48f1e 100644 --- a/gdb/python/py-newobjfileevent.c +++ b/gdb/python/py-newobjfileevent.c @@ -20,11 +20,6 @@ #include "defs.h" #include "py-event.h" -extern PyTypeObject new_objfile_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); -extern PyTypeObject clear_objfiles_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); - static PyObject * create_new_objfile_event_object (struct objfile *objfile) { @@ -62,11 +57,6 @@ emit_new_objfile_event (struct objfile *objfile) return -1; } -GDBPY_NEW_EVENT_TYPE (new_objfile, - "gdb.NewObjFileEvent", - "NewObjFileEvent", - "GDB new object file event object", - event_object_type); /* Subroutine of emit_clear_objfiles_event to simplify it. */ @@ -107,9 +97,3 @@ emit_clear_objfiles_event (void) return evpy_emit_event (event.get (), gdb_py_events.clear_objfiles); return -1; } - -GDBPY_NEW_EVENT_TYPE (clear_objfiles, - "gdb.ClearObjFilesEvent", - "ClearObjFilesEvent", - "GDB clear object files event object", - event_object_type); diff --git a/gdb/python/py-signalevent.c b/gdb/python/py-signalevent.c index c2391def087..185e6f513fb 100644 --- a/gdb/python/py-signalevent.c +++ b/gdb/python/py-signalevent.c @@ -20,9 +20,6 @@ #include "defs.h" #include "py-stopevent.h" -extern PyTypeObject signal_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); - gdbpy_ref<> create_signal_event_object (enum gdb_signal stop_signal) { @@ -45,9 +42,3 @@ create_signal_event_object (enum gdb_signal stop_signal) return signal_event_obj; } - -GDBPY_NEW_EVENT_TYPE (signal, - "gdb.SignalEvent", - "SignalEvent", - "GDB signal event object", - stop_event_object_type); diff --git a/gdb/python/py-stopevent.c b/gdb/python/py-stopevent.c index a0be5f2a26f..57179478bc1 100644 --- a/gdb/python/py-stopevent.c +++ b/gdb/python/py-stopevent.c @@ -96,9 +96,3 @@ emit_stop_event (struct bpstats *bs, enum gdb_signal stop_signal) return evpy_emit_event (stop_event_obj.get (), gdb_py_events.stop); } - -GDBPY_NEW_EVENT_TYPE (stop, - "gdb.StopEvent", - "StopEvent", - "GDB stop event object", - thread_event_object_type); diff --git a/gdb/python/py-threadevent.c b/gdb/python/py-threadevent.c index 8b742ca94a7..322fa266ebc 100644 --- a/gdb/python/py-threadevent.c +++ b/gdb/python/py-threadevent.c @@ -68,9 +68,3 @@ create_thread_event_object (PyTypeObject *py_type, PyObject *thread) return thread_event_obj; } - -GDBPY_NEW_EVENT_TYPE (thread, - "gdb.ThreadEvent", - "ThreadEvent", - "GDB thread event object", - event_object_type); diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 0c3582f180f..abfec91a561 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -373,8 +373,6 @@ extern PyTypeObject symbol_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("symbol_object"); extern PyTypeObject event_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); -extern PyTypeObject stop_event_object_type - CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object"); extern PyTypeObject breakpoint_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("breakpoint_object"); extern PyTypeObject frame_object_type @@ -606,36 +604,6 @@ int gdbpy_initialize_event (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_py_events (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_stop_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_signal_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_breakpoint_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_continue_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_inferior_call_pre_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_inferior_call_post_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_register_changed_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_memory_changed_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_exited_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_thread_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_new_objfile_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_clear_objfiles_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_new_inferior_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_inferior_deleted_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; -int gdbpy_initialize_new_thread_event (void) - CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_arch (void) CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION; int gdbpy_initialize_xmethods (void) diff --git a/gdb/python/python.c b/gdb/python/python.c index fbb4747c5fa..ff757fdc421 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1591,26 +1591,17 @@ do_start_initialization () || gdbpy_initialize_eventregistry () < 0 || gdbpy_initialize_py_events () < 0 || gdbpy_initialize_event () < 0 - || gdbpy_initialize_stop_event () < 0 - || gdbpy_initialize_signal_event () < 0 - || gdbpy_initialize_breakpoint_event () < 0 - || gdbpy_initialize_continue_event () < 0 - || gdbpy_initialize_inferior_call_pre_event () < 0 - || gdbpy_initialize_inferior_call_post_event () < 0 - || gdbpy_initialize_register_changed_event () < 0 - || gdbpy_initialize_memory_changed_event () < 0 - || gdbpy_initialize_exited_event () < 0 - || gdbpy_initialize_thread_event () < 0 - || gdbpy_initialize_new_objfile_event () < 0 - || gdbpy_initialize_clear_objfiles_event () < 0 - || gdbpy_initialize_new_inferior_event () < 0 - || gdbpy_initialize_inferior_deleted_event () < 0 - || gdbpy_initialize_new_thread_event () < 0 || gdbpy_initialize_arch () < 0 || gdbpy_initialize_xmethods () < 0 || gdbpy_initialize_unwind () < 0) return false; +#define GDB_PY_DEFINE_EVENT_TYPE(name, py_name, doc, base) \ + if (gdbpy_initialize_event_generic (&name##_event_object_type, py_name) < 0) \ + return false; +#include "py-event-types.def" +#undef GDB_PY_DEFINE_EVENT_TYPE + gdbpy_to_string_cst = PyString_FromString ("to_string"); if (gdbpy_to_string_cst == NULL) return false; @@ -1963,4 +1954,51 @@ struct PyModuleDef python_GdbModuleDef = NULL }; #endif + +/* Define all the event objects. */ +#define GDB_PY_DEFINE_EVENT_TYPE(name, py_name, doc, base) \ + PyTypeObject name##_event_object_type \ + CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("event_object") \ + = { \ + PyVarObject_HEAD_INIT (NULL, 0) \ + "gdb." py_name, /* tp_name */ \ + sizeof (event_object), /* tp_basicsize */ \ + 0, /* tp_itemsize */ \ + evpy_dealloc, /* tp_dealloc */ \ + 0, /* tp_print */ \ + 0, /* tp_getattr */ \ + 0, /* tp_setattr */ \ + 0, /* tp_compare */ \ + 0, /* tp_repr */ \ + 0, /* tp_as_number */ \ + 0, /* tp_as_sequence */ \ + 0, /* tp_as_mapping */ \ + 0, /* tp_hash */ \ + 0, /* tp_call */ \ + 0, /* tp_str */ \ + 0, /* tp_getattro */ \ + 0, /* tp_setattro */ \ + 0, /* tp_as_buffer */ \ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ \ + doc, /* tp_doc */ \ + 0, /* tp_traverse */ \ + 0, /* tp_clear */ \ + 0, /* tp_richcompare */ \ + 0, /* tp_weaklistoffset */ \ + 0, /* tp_iter */ \ + 0, /* tp_iternext */ \ + 0, /* tp_methods */ \ + 0, /* tp_members */ \ + 0, /* tp_getset */ \ + &base, /* tp_base */ \ + 0, /* tp_dict */ \ + 0, /* tp_descr_get */ \ + 0, /* tp_descr_set */ \ + 0, /* tp_dictoffset */ \ + 0, /* tp_init */ \ + 0 /* tp_alloc */ \ + }; +#include "py-event-types.def" +#undef GDB_PY_DEFINE_EVENT_TYPE + #endif /* HAVE_PYTHON */ -- 2.30.2