diff options
author | Victor Stinner <vstinner@python.org> | 2020-11-18 23:19:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-18 23:19:06 (GMT) |
commit | 6f4635fe20457a7c513050bb117c2f0511cd4e44 (patch) | |
tree | 45f7265f81477cf6edd8921819aa81e6925dc24f /Python | |
parent | 829b177436e091025813d9be28c21ca46f246af7 (diff) | |
download | cpython-6f4635fe20457a7c513050bb117c2f0511cd4e44.zip cpython-6f4635fe20457a7c513050bb117c2f0511cd4e44.tar.gz cpython-6f4635fe20457a7c513050bb117c2f0511cd4e44.tar.bz2 |
bpo-1635741: Port _warnings to the multi-phase init (GH-23379)
Port the _warnings extension module to the multi-phase initialization
API (PEP 489).
Diffstat (limited to 'Python')
-rw-r--r-- | Python/_warnings.c | 70 |
1 files changed, 30 insertions, 40 deletions
diff --git a/Python/_warnings.c b/Python/_warnings.c index 313420c..021400f 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -24,9 +24,6 @@ _Py_IDENTIFIER(ignore); typedef struct _warnings_runtime_state WarningsState; -/* Forward declaration of the _warnings module definition. */ -static struct PyModuleDef warningsmodule; - _Py_IDENTIFIER(__name__); /* Given a module object, get its per-module state. */ @@ -1353,52 +1350,45 @@ static PyMethodDef warnings_functions[] = { }; -static struct PyModuleDef warningsmodule = { - PyModuleDef_HEAD_INIT, - MODULE_NAME, /* m_name */ - warnings__doc__, /* m_doc */ - 0, /* m_size */ - warnings_functions, /* m_methods */ - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; - - -PyMODINIT_FUNC -_PyWarnings_Init(void) +static int +warnings_module_exec(PyObject *module) { - PyObject *m; - - m = PyModule_Create(&warningsmodule); - if (m == NULL) { - return NULL; - } - WarningsState *st = warnings_get_state(); if (st == NULL) { - goto error; + return -1; } - - if (PyModule_AddObjectRef(m, "filters", st->filters) < 0) { - goto error; + if (PyModule_AddObjectRef(module, "filters", st->filters) < 0) { + return -1; } - if (PyModule_AddObjectRef(m, "_onceregistry", st->once_registry) < 0) { - goto error; + if (PyModule_AddObjectRef(module, "_onceregistry", st->once_registry) < 0) { + return -1; } - if (PyModule_AddObjectRef(m, "_defaultaction", st->default_action) < 0) { - goto error; + if (PyModule_AddObjectRef(module, "_defaultaction", st->default_action) < 0) { + return -1; } + return 0; +} - return m; -error: - if (st != NULL) { - warnings_clear_state(st); - } - Py_DECREF(m); - return NULL; +static PyModuleDef_Slot warnings_slots[] = { + {Py_mod_exec, warnings_module_exec}, + {0, NULL} +}; + +static struct PyModuleDef warnings_module = { + PyModuleDef_HEAD_INIT, + .m_name = MODULE_NAME, + .m_doc = warnings__doc__, + .m_size = 0, + .m_methods = warnings_functions, + .m_slots = warnings_slots, +}; + + +PyMODINIT_FUNC +_PyWarnings_Init(void) +{ + return PyModuleDef_Init(&warnings_module); } // We need this to ensure that warnings still work until late in finalization. |