]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-1635741: Port _weakref extension module to multiphase initialization (PEP 489...
authorVictor Stinner <vstinner@python.org>
Tue, 24 Mar 2020 17:31:19 +0000 (18:31 +0100)
committerGitHub <noreply@github.com>
Tue, 24 Mar 2020 17:31:19 +0000 (18:31 +0100)
Co-authored-by: Hai Shi <shihai1992@gmail.com>
Misc/NEWS.d/next/Core and Builtins/2020-03-20-13-42-35.bpo-1635741.bhIu5M.rst [new file with mode: 0644]
Modules/_weakref.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-03-20-13-42-35.bpo-1635741.bhIu5M.rst b/Misc/NEWS.d/next/Core and Builtins/2020-03-20-13-42-35.bpo-1635741.bhIu5M.rst
new file mode 100644 (file)
index 0000000..ab5d0ae
--- /dev/null
@@ -0,0 +1 @@
+Port _weakref extension module to multiphase initialization (:pep:`489`).
index c1238e00d35f4aa8315cd8d29790a1663a24dbc2..cd7c4c159ac1b6a9c6e7bc10bacd66e1cd3f203d 100644 (file)
@@ -136,14 +136,48 @@ weakref_functions[] =  {
     {NULL, NULL, 0, NULL}
 };
 
+static int
+weakref_exec(PyObject *module)
+{
+    Py_INCREF(&_PyWeakref_RefType);
+    if (PyModule_AddObject(module, "ref", (PyObject *) &_PyWeakref_RefType) < 0) {
+        Py_DECREF(&_PyWeakref_RefType);
+        return -1;
+    }
+    Py_INCREF(&_PyWeakref_RefType);
+    if (PyModule_AddObject(module, "ReferenceType",
+                           (PyObject *) &_PyWeakref_RefType) < 0) {
+        Py_DECREF(&_PyWeakref_RefType);
+        return -1;
+    }
+    Py_INCREF(&_PyWeakref_ProxyType);
+    if (PyModule_AddObject(module, "ProxyType",
+                           (PyObject *) &_PyWeakref_ProxyType) < 0) {
+        Py_DECREF(&_PyWeakref_ProxyType);
+        return -1;
+    }
+    Py_INCREF(&_PyWeakref_CallableProxyType);
+    if (PyModule_AddObject(module, "CallableProxyType",
+                           (PyObject *) &_PyWeakref_CallableProxyType) < 0) {
+        Py_DECREF(&_PyWeakref_CallableProxyType);
+        return -1;
+    }
+
+    return 0;
+}
+
+static struct PyModuleDef_Slot weakref_slots[] = {
+    {Py_mod_exec, weakref_exec},
+    {0, NULL}
+};
 
 static struct PyModuleDef weakrefmodule = {
     PyModuleDef_HEAD_INIT,
     "_weakref",
     "Weak-reference support module.",
-    -1,
+    0,
     weakref_functions,
-    NULL,
+    weakref_slots,
     NULL,
     NULL,
     NULL
@@ -152,23 +186,5 @@ static struct PyModuleDef weakrefmodule = {
 PyMODINIT_FUNC
 PyInit__weakref(void)
 {
-    PyObject *m;
-
-    m = PyModule_Create(&weakrefmodule);
-
-    if (m != NULL) {
-        Py_INCREF(&_PyWeakref_RefType);
-        PyModule_AddObject(m, "ref",
-                           (PyObject *) &_PyWeakref_RefType);
-        Py_INCREF(&_PyWeakref_RefType);
-        PyModule_AddObject(m, "ReferenceType",
-                           (PyObject *) &_PyWeakref_RefType);
-        Py_INCREF(&_PyWeakref_ProxyType);
-        PyModule_AddObject(m, "ProxyType",
-                           (PyObject *) &_PyWeakref_ProxyType);
-        Py_INCREF(&_PyWeakref_CallableProxyType);
-        PyModule_AddObject(m, "CallableProxyType",
-                           (PyObject *) &_PyWeakref_CallableProxyType);
-    }
-    return m;
+    return PyModuleDef_Init(&weakrefmodule);
 }