]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-103092: Isolate msvcrt (#103248)
authorAN Long <aisk@users.noreply.github.com>
Wed, 12 Apr 2023 10:41:21 +0000 (18:41 +0800)
committerGitHub <noreply@github.com>
Wed, 12 Apr 2023 10:41:21 +0000 (12:41 +0200)
Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst [new file with mode: 0644]
PC/msvcrtmodule.c

diff --git a/Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst b/Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst
new file mode 100644 (file)
index 0000000..7bd191e
--- /dev/null
@@ -0,0 +1 @@
+Adapt the :mod:`msvcrt` extension module to :pep:`687`.
index 6e8b423c3839a939d3c6263c037e68b8f39bb178..de9a88946aff3e2bd583c61a1192620f4867e883 100644 (file)
@@ -564,19 +564,6 @@ static struct PyMethodDef msvcrt_functions[] = {
     {NULL,                      NULL}
 };
 
-
-static struct PyModuleDef msvcrtmodule = {
-    PyModuleDef_HEAD_INIT,
-    "msvcrt",
-    NULL,
-    -1,
-    msvcrt_functions,
-    NULL,
-    NULL,
-    NULL,
-    NULL
-};
-
 static void
 insertint(PyObject *d, char *name, int value)
 {
@@ -605,14 +592,10 @@ insertptr(PyObject *d, char *name, void *value)
     }
 }
 
-PyMODINIT_FUNC
-PyInit_msvcrt(void)
+static int
+exec_module(PyObject* m)
 {
     int st;
-    PyObject *m = PyModule_Create(&msvcrtmodule);
-    if (m == NULL) {
-        return NULL;
-    }
     PyObject *d = PyModule_GetDict(m);  // Borrowed ref.
 
     /* constants for the locking() function's mode argument */
@@ -645,21 +628,21 @@ PyInit_msvcrt(void)
     st = PyModule_AddStringConstant(m, "VC_ASSEMBLY_PUBLICKEYTOKEN",
                                     _VC_ASSEMBLY_PUBLICKEYTOKEN);
     if (st < 0) {
-        goto error;
+        return -1;
     }
 #endif
 #ifdef _CRT_ASSEMBLY_VERSION
     st = PyModule_AddStringConstant(m, "CRT_ASSEMBLY_VERSION",
                                     _CRT_ASSEMBLY_VERSION);
     if (st < 0) {
-        goto error;
+        return -1;
     }
 #endif
 #ifdef __LIBRARIES_ASSEMBLY_NAME_PREFIX
     st = PyModule_AddStringConstant(m, "LIBRARIES_ASSEMBLY_NAME_PREFIX",
                                     __LIBRARIES_ASSEMBLY_NAME_PREFIX);
     if (st < 0) {
-        goto error;
+        return -1;
     }
 #endif
 
@@ -671,20 +654,34 @@ PyInit_msvcrt(void)
                                              _VC_CRT_BUILD_VERSION,
                                              _VC_CRT_RBUILD_VERSION);
     if (version == NULL) {
-        goto error;
+        return -1;
     }
     st = PyModule_AddObjectRef(m, "CRT_ASSEMBLY_VERSION", version);
     Py_DECREF(version);
     if (st < 0) {
-        goto error;
+        return -1;
     }
 #endif
     /* make compiler warning quiet if st is unused */
     (void)st;
 
-    return m;
+    return 0;
+}
+
+static PyModuleDef_Slot msvcrt_slots[] = {
+    {Py_mod_exec, exec_module},
+    {0, NULL}
+};
 
-error:
-    Py_DECREF(m);
-    return NULL;
+static struct PyModuleDef msvcrtmodule = {
+    .m_base = PyModuleDef_HEAD_INIT,
+    .m_name = "msvcrt",
+    .m_methods = msvcrt_functions,
+    .m_slots = msvcrt_slots,
+};
+
+PyMODINIT_FUNC
+PyInit_msvcrt(void)
+{
+    return PyModuleDef_Init(&msvcrtmodule);
 }