gdb/python: break more dependencies between gdbpy_initialize_* functions

In a later commit in this series I will propose removing all of the
explicit gdbpy_initialize_* calls from python.c and replace these
calls with a more generic mechanism.

One of the side effects of this generic mechanism is that the order in
which the various Python sub-systems within GDB are initialized is no
longer guaranteed.

On the whole I don't think this matters, most of the sub-systems are
independent of each other, though testing did reveal a few places
where we did have dependencies, though I don't think those
dependencies were explicitly documented in comment anywhere.

This commit is similar to the previous one, and fixes the second
dependency issue that I found.

In this case the finish_breakpoint_object_type uses the
breakpoint_object_type as its tp_base, this means that
breakpoint_object_type must have been initialized with a call to
PyType_Ready before finish_breakpoint_object_type can be initialized.

Previously we depended on the ordering of calls to
gdbpy_initialize_breakpoints and gdbpy_initialize_finishbreakpoints in
python.c.

After this commit a new function gdbpy_breakpoint_init_breakpoint_type
exists, this function ensures that breakpoint_object_type has been
initialized, and can be called from any gdbpy_initialize_* function.

I feel that this change makes the dependency explicit, which I think
is a good thing.

There should be no user visible changes after this commit.
This commit is contained in:
Andrew Burgess
2022-09-21 16:23:02 +01:00
parent 66bd1b294d
commit 8a3b17063e
3 changed files with 36 additions and 2 deletions

View File

@ -290,6 +290,18 @@ extern PyTypeObject frame_object_type
extern PyTypeObject thread_object_type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("thread_object");
/* Ensure that breakpoint_object_type is initialized and return true. If
breakpoint_object_type can't be initialized then set a suitable Python
error and return false.
This function needs to be called from any gdbpy_initialize_* function
that wants to reference breakpoint_object_type. After all the
gdbpy_initialize_* functions have been called then breakpoint_object_type
is guaranteed to have been initialized, and this function does not need
calling before referencing breakpoint_object_type. */
extern bool gdbpy_breakpoint_init_breakpoint_type ();
struct gdbpy_breakpoint_object
{
PyObject_HEAD