From 7d7956833cc37a9d42807cbfeb7dcc041970f579 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Mon, 17 Feb 2020 21:49:26 +0800 Subject: [PATCH] bpo-1635741: Port _contextvars module to multiphase initialization (PEP 489) (GH-18374) --- ...2020-02-06-09-00-35.bpo-1635741.oaxe1j.rst | 1 + Modules/_contextvarsmodule.c | 73 ++++++++++--------- 2 files changed, 39 insertions(+), 35 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-06-09-00-35.bpo-1635741.oaxe1j.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-06-09-00-35.bpo-1635741.oaxe1j.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-06-09-00-35.bpo-1635741.oaxe1j.rst new file mode 100644 index 00000000000..49336f02a3e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-06-09-00-35.bpo-1635741.oaxe1j.rst @@ -0,0 +1 @@ +Port _contextvars extension module to multiphase initialization (:pep:`489`). \ No newline at end of file diff --git a/Modules/_contextvarsmodule.c b/Modules/_contextvarsmodule.c index 1abcdbfa921..d6d7f375d12 100644 --- a/Modules/_contextvarsmodule.c +++ b/Modules/_contextvarsmodule.c @@ -27,13 +27,48 @@ static PyMethodDef _contextvars_methods[] = { {NULL, NULL} }; +static int +_contextvars_exec(PyObject *m) +{ + Py_INCREF(&PyContext_Type); + if (PyModule_AddObject(m, "Context", + (PyObject *)&PyContext_Type) < 0) + { + Py_DECREF(&PyContext_Type); + return -1; + } + + Py_INCREF(&PyContextVar_Type); + if (PyModule_AddObject(m, "ContextVar", + (PyObject *)&PyContextVar_Type) < 0) + { + Py_DECREF(&PyContextVar_Type); + return -1; + } + + Py_INCREF(&PyContextToken_Type); + if (PyModule_AddObject(m, "Token", + (PyObject *)&PyContextToken_Type) < 0) + { + Py_DECREF(&PyContextToken_Type); + return -1; + } + + return 0; +} + +static struct PyModuleDef_Slot _contextvars_slots[] = { + {Py_mod_exec, _contextvars_exec}, + {0, NULL} +}; + static struct PyModuleDef _contextvarsmodule = { PyModuleDef_HEAD_INIT, /* m_base */ "_contextvars", /* m_name */ module_doc, /* m_doc */ - -1, /* m_size */ + 0, /* m_size */ _contextvars_methods, /* m_methods */ - NULL, /* m_slots */ + _contextvars_slots, /* m_slots */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL, /* m_free */ @@ -42,37 +77,5 @@ static struct PyModuleDef _contextvarsmodule = { PyMODINIT_FUNC PyInit__contextvars(void) { - PyObject *m = PyModule_Create(&_contextvarsmodule); - if (m == NULL) { - return NULL; - } - - Py_INCREF(&PyContext_Type); - if (PyModule_AddObject(m, "Context", - (PyObject *)&PyContext_Type) < 0) - { - Py_DECREF(&PyContext_Type); - Py_DECREF(m); - return NULL; - } - - Py_INCREF(&PyContextVar_Type); - if (PyModule_AddObject(m, "ContextVar", - (PyObject *)&PyContextVar_Type) < 0) - { - Py_DECREF(&PyContextVar_Type); - Py_DECREF(m); - return NULL; - } - - Py_INCREF(&PyContextToken_Type); - if (PyModule_AddObject(m, "Token", - (PyObject *)&PyContextToken_Type) < 0) - { - Py_DECREF(&PyContextToken_Type); - Py_DECREF(m); - return NULL; - } - - return m; + return PyModuleDef_Init(&_contextvarsmodule); }