diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-03-31-22-15-04.bpo-1635741.8Ir1a0.rst b/Misc/NEWS.d/next/Core and Builtins/2020-03-31-22-15-04.bpo-1635741.8Ir1a0.rst new file mode 100644 index 00000000000000..e1c5a29916b1cf --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-03-31-22-15-04.bpo-1635741.8Ir1a0.rst @@ -0,0 +1 @@ +Port :mod:`math` to multiphase initialization (:pep:`489`). diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 2a73a983f56d2d..f1d59c09e6272c 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3421,6 +3421,29 @@ math_ulp_impl(PyObject *module, double x) return x2 - x; } +static int +math_exec(PyObject *module) +{ + if (PyModule_AddObject(module, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) { + return -1; + } + // 2pi + if (PyModule_AddObject(module, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "inf", PyFloat_FromDouble(m_inf())) < 0) { + return -1; + } +#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN) + if (PyModule_AddObject(module, "nan", PyFloat_FromDouble(m_nan())) < 0) { + return -1; + } +#endif + return 0; +} static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, @@ -3479,41 +3502,26 @@ static PyMethodDef math_methods[] = { {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot math_slots[] = { + {Py_mod_exec, math_exec}, + {0, NULL} +}; PyDoc_STRVAR(module_doc, "This module provides access to the mathematical functions\n" "defined by the C standard."); - static struct PyModuleDef mathmodule = { PyModuleDef_HEAD_INIT, - "math", - module_doc, - -1, - math_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "math", + .m_doc = module_doc, + .m_size = 0, + .m_methods = math_methods, + .m_slots = math_slots, }; PyMODINIT_FUNC PyInit_math(void) { - PyObject *m; - - m = PyModule_Create(&mathmodule); - if (m == NULL) - goto finally; - - PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI)); - PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E)); - PyModule_AddObject(m, "tau", PyFloat_FromDouble(Py_MATH_TAU)); /* 2pi */ - PyModule_AddObject(m, "inf", PyFloat_FromDouble(m_inf())); -#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN) - PyModule_AddObject(m, "nan", PyFloat_FromDouble(m_nan())); -#endif - - finally: - return m; + return PyModuleDef_Init(&mathmodule); }