binutils-gdb/gdb/python/py-evts.c
Tom Tromey 3acd9a692d Make 'import gdb.events' work
Pierre-Marie noticed that, while gdb.events is a Python module, it
can't be imported.  This patch changes how this module is created, so
that it can be imported, while also ensuring that the module is always
visible, just as it was in the past.

This new approach required one non-obvious change -- when running
gdb.base/warning.exp, where --data-directory is intentionally not
found, the event registries can now be nullptr.  Consequently, this
patch probably also requires

    https://sourceware.org/pipermail/gdb-patches/2022-June/189796.html

Note that this patch obsoletes

    https://sourceware.org/pipermail/gdb-patches/2022-June/189797.html
2022-07-05 10:28:39 -06:00

70 lines
1.8 KiB
C

/* Python interface to inferior events.
Copyright (C) 2009-2022 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 <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "py-events.h"
static struct PyModuleDef EventModuleDef =
{
PyModuleDef_HEAD_INIT,
"_gdbevents",
NULL,
-1,
NULL,
NULL,
NULL,
NULL,
NULL
};
/* Helper function to add a single event registry to the events
module. */
static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
add_new_registry (eventregistry_object **registryp, const char *name)
{
*registryp = create_eventregistry_object ();
if (*registryp == NULL)
return -1;
return gdb_pymodule_addobject (gdb_py_events.module,
name,
(PyObject *)(*registryp));
}
/* Create and populate the _gdbevents module. Note that this is
always created, see the base gdb __init__.py. */
PyMODINIT_FUNC
gdbpy_events_mod_func ()
{
gdb_py_events.module = PyModule_Create (&EventModuleDef);
if (gdb_py_events.module == nullptr)
return nullptr;
#define GDB_PY_DEFINE_EVENT(name) \
if (add_new_registry (&gdb_py_events.name, #name) < 0) \
return nullptr;
#include "py-all-events.def"
#undef GDB_PY_DEFINE_EVENT
return gdb_py_events.module;
}