[Python-checkins] bpo-1635741: Port _contextvars module to multiphase initialization (PEP 489) (GH-18374)

Hai Shi webhook-mailer at python.org
Mon Feb 17 08:49:34 EST 2020


https://github.com/python/cpython/commit/7d7956833cc37a9d42807cbfeb7dcc041970f579
commit: 7d7956833cc37a9d42807cbfeb7dcc041970f579
branch: master
author: Hai Shi <shihai1992 at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-02-17T14:49:26+01:00
summary:

bpo-1635741: Port _contextvars module to multiphase initialization (PEP 489) (GH-18374)

files:
A Misc/NEWS.d/next/Core and Builtins/2020-02-06-09-00-35.bpo-1635741.oaxe1j.rst
M Modules/_contextvarsmodule.c

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 0000000000000..49336f02a3e40
--- /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 1abcdbfa921c2..d6d7f375d1230 100644
--- a/Modules/_contextvarsmodule.c
+++ b/Modules/_contextvarsmodule.c
@@ -27,33 +27,15 @@ static PyMethodDef _contextvars_methods[] = {
     {NULL, NULL}
 };
 
-static struct PyModuleDef _contextvarsmodule = {
-    PyModuleDef_HEAD_INIT,      /* m_base */
-    "_contextvars",             /* m_name */
-    module_doc,                 /* m_doc */
-    -1,                         /* m_size */
-    _contextvars_methods,       /* m_methods */
-    NULL,                       /* m_slots */
-    NULL,                       /* m_traverse */
-    NULL,                       /* m_clear */
-    NULL,                       /* m_free */
-};
-
-PyMODINIT_FUNC
-PyInit__contextvars(void)
+static int
+_contextvars_exec(PyObject *m)
 {
-    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;
+        return -1;
     }
 
     Py_INCREF(&PyContextVar_Type);
@@ -61,8 +43,7 @@ PyInit__contextvars(void)
                            (PyObject *)&PyContextVar_Type) < 0)
     {
         Py_DECREF(&PyContextVar_Type);
-        Py_DECREF(m);
-        return NULL;
+        return -1;
     }
 
     Py_INCREF(&PyContextToken_Type);
@@ -70,9 +51,31 @@ PyInit__contextvars(void)
                            (PyObject *)&PyContextToken_Type) < 0)
     {
         Py_DECREF(&PyContextToken_Type);
-        Py_DECREF(m);
-        return NULL;
+        return -1;
     }
 
-    return m;
+    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 */
+    0,                          /* m_size */
+    _contextvars_methods,       /* m_methods */
+    _contextvars_slots,         /* m_slots */
+    NULL,                       /* m_traverse */
+    NULL,                       /* m_clear */
+    NULL,                       /* m_free */
+};
+
+PyMODINIT_FUNC
+PyInit__contextvars(void)
+{
+    return PyModuleDef_Init(&_contextvarsmodule);
 }



More information about the Python-checkins mailing list