summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-11-18 23:19:06 (GMT)
committerGitHub <noreply@github.com>2020-11-18 23:19:06 (GMT)
commit6f4635fe20457a7c513050bb117c2f0511cd4e44 (patch)
tree45f7265f81477cf6edd8921819aa81e6925dc24f /Python
parent829b177436e091025813d9be28c21ca46f246af7 (diff)
downloadcpython-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.c70
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.