From patchwork Sat Sep 9 00:33:53 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 22772 Received: (qmail 38627 invoked by alias); 9 Sep 2017 00:34:06 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 38571 invoked by uid 89); 9 Sep 2017 00:34:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=acquires, DOC, 973, sk:python- X-HELO: gproxy2-pub.mail.unifiedlayer.com Received: from gproxy2-pub.mail.unifiedlayer.com (HELO gproxy2-pub.mail.unifiedlayer.com) (69.89.18.3) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 09 Sep 2017 00:34:01 +0000 Received: from cmgw3 (unknown [10.0.90.84]) by gproxy2.mail.unifiedlayer.com (Postfix) with ESMTP id D140B1E06CF for ; Fri, 8 Sep 2017 18:33:59 -0600 (MDT) Received: from box522.bluehost.com ([74.220.219.122]) by cmgw3 with id 7CZw1w0102f2jeq01CZzWL; Fri, 08 Sep 2017 18:33:59 -0600 X-Authority-Analysis: v=2.2 cv=K/VSJ2eI c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=2JCJgTwv5E4A:10 a=zstS-IiYAAAA:8 a=mDV3o1hIAAAA:8 a=Ohf4edDS-wLJrDgtzOQA:9 a=qMEQgpbgf-V7rJqZ:21 a=fLkP-HyrcFSf3UX5:21 a=uOT5qG5ChUcyrimJ:21 a=4G6NA9xxw8l3yy4pmD5M:22 a=_FVE-zBwftR9WsbkzFJk:22 Received: from 75-166-76-94.hlrn.qwest.net ([75.166.76.94]:58502 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.87) (envelope-from ) id 1dqTie-000PVl-Ay; Fri, 08 Sep 2017 18:33:56 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 3/3] Make it simpler to add events to Python Date: Fri, 8 Sep 2017 18:33:53 -0600 Message-Id: <20170909003353.25883-4-tom@tromey.com> In-Reply-To: <20170909003353.25883-1-tom@tromey.com> References: <20170909003353.25883-1-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1dqTie-000PVl-Ay X-Source-Sender: 75-166-76-94.hlrn.qwest.net (bapiya.Home) [75.166.76.94]:58502 X-Source-Auth: tom+tromey.com X-Email-Count: 4 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== X-Local-Domain: yes 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". 2017-09-08 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 | 120 ++++++++++++++++++++++++++++++++++++++++ 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 | 67 +++++++++++++++++----- 17 files changed, 262 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 f49b428..6590a50 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,41 @@ 2017-09-08 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-08 Tom Tromey + * python/py-threadevent.c (create_thread_event_object): Return gdbpy_ref. * python/py-stopevent.h (create_stop_event_object) diff --git a/gdb/python/py-all-events.def b/gdb/python/py-all-events.def new file mode 100644 index 0000000..cdede6b --- /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 021c83a..1cb3f9a 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 ca2927f..8c704b9 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 0000000..d35cbe5 --- /dev/null +++ b/gdb/python/py-event-types.def @@ -0,0 +1,120 @@ +/* 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. + + 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. +*/ + +GDB_PY_DEFINE_EVENT_TYPE (breakpoint, + "gdb.BreakpointEvent", + "BreakpointEvent", + "GDB breakpoint stop event object", + stop_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (continue, + "gdb.ContinueEvent", + "ContinueEvent", + "GDB continue event object", + thread_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (exited, + "gdb.ExitedEvent", + "ExitedEvent", + "GDB exited event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (new_thread, + "gdb.NewThreadEvent", + "NewThreadEvent", + "GDB new thread event object", + thread_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (new_inferior, + "gdb.NewInferiorEvent", + "NewInferiorEvent", + "GDB new inferior event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (inferior_deleted, + "gdb.InferiorDeletedEvent", + "InferiorDeletedEvent", + "GDB inferior deleted event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (inferior_call_pre, + "gdb.InferiorCallPreEvent", + "InferiorCallPreEvent", + "GDB inferior function pre-call event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (inferior_call_post, + "gdb.InferiorCallPostEvent", + "InferiorCallPostEvent", + "GDB inferior function post-call event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (register_changed, + "gdb.RegisterChangedEvent", + "RegisterChangedEvent", + "GDB register change event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (memory_changed, + "gdb.MemoryChangedEvent", + "MemoryChangedEvent", + "GDB memory change event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (new_objfile, + "gdb.NewObjFileEvent", + "NewObjFileEvent", + "GDB new object file event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (clear_objfiles, + "gdb.ClearObjFilesEvent", + "ClearObjFilesEvent", + "GDB clear object files event object", + event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (signal, + "gdb.SignalEvent", + "SignalEvent", + "GDB signal event object", + stop_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (stop, + "gdb.StopEvent", + "StopEvent", + "GDB stop event object", + thread_event_object_type); + +GDB_PY_DEFINE_EVENT_TYPE (thread, + "gdb.ThreadEvent", + "ThreadEvent", + "GDB thread event object", + event_object_type); diff --git a/gdb/python/py-event.h b/gdb/python/py-event.h index 27db828..28a1b58 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_path, 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 2275d89..876b564 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 ad99241..0faf280 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 967fb1b..aa4aefb 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 d7c6810..5cad042 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 8a63b79..825a892 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 dc09e0f..227f4a4 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 c2391de..185e6f5 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 a0be5f2..5717947 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 8b742ca..322fa26 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 0c3582f..abfec91 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 7ff84e4..9f3606f 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1597,26 +1597,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_path, 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; @@ -1970,3 +1961,49 @@ struct PyModuleDef python_GdbModuleDef = }; #endif #endif /* HAVE_PYTHON */ + +/* Define all the event objects. */ +#define GDB_PY_DEFINE_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 */ \ + }; +#include "py-event-types.def" +#undef GDB_PY_DEFINE_EVENT_TYPE