diff --git a/Misc/NEWS.d/next/Library/2023-04-04-21-27-51.gh-issue-103092.7s7Bzf.rst b/Misc/NEWS.d/next/Library/2023-04-04-21-27-51.gh-issue-103092.7s7Bzf.rst new file mode 100644 index 00000000000..39c62ffbe8c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-04-21-27-51.gh-issue-103092.7s7Bzf.rst @@ -0,0 +1 @@ +Adapt the :mod:`winsound` extension module to :pep:`687`. diff --git a/PC/winsound.c b/PC/winsound.c index bae8e449795..17ce2ef423b 100644 --- a/PC/winsound.c +++ b/PC/winsound.c @@ -204,31 +204,13 @@ static struct PyMethodDef sound_methods[] = #define ADD_DEFINE(CONST) do { \ if (PyModule_AddIntConstant(module, #CONST, CONST) < 0) { \ - goto error; \ + return -1; \ } \ } while (0) - -static struct PyModuleDef winsoundmodule = { - PyModuleDef_HEAD_INIT, - "winsound", - sound_module_doc, - -1, - sound_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_winsound(void) +static int +exec_module(PyObject *module) { - PyObject *module = PyModule_Create(&winsoundmodule); - if (module == NULL) { - return NULL; - } - ADD_DEFINE(SND_ASYNC); ADD_DEFINE(SND_NODEFAULT); ADD_DEFINE(SND_NOSTOP); @@ -248,9 +230,24 @@ PyInit_winsound(void) #undef ADD_DEFINE - return module; - -error: - Py_DECREF(module); - return NULL; + return 0; +} + +static PyModuleDef_Slot sound_slots[] = { + {Py_mod_exec, exec_module}, + {0, NULL} +}; + +static struct PyModuleDef winsoundmodule = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "winsound", + .m_doc = sound_module_doc, + .m_methods = sound_methods, + .m_slots = sound_slots, +}; + +PyMODINIT_FUNC +PyInit_winsound(void) +{ + return PyModuleDef_Init(&winsoundmodule); }