summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst1
-rw-r--r--PC/msvcrtmodule.c53
2 files changed, 26 insertions, 28 deletions
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
index 0000000..7bd191e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-04-04-21-44-25.gh-issue-103092.Dz0_Xn.rst
@@ -0,0 +1 @@
+Adapt the :mod:`msvcrt` extension module to :pep:`687`.
diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c
index 6e8b423..de9a889 100644
--- a/PC/msvcrtmodule.c
+++ b/PC/msvcrtmodule.c
@@ -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);
}