summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na92@gmail.com>2020-03-31 14:33:22 (GMT)
committerGitHub <noreply@github.com>2020-03-31 14:33:22 (GMT)
commit5be8241392453751beea21d2e32096c15a8d47db (patch)
treed075d5b4a008712b3b28525a2ddb1c0b2f2df30d
parent1cb763b8808745b9a368c1158fda19d329f63f6f (diff)
downloadcpython-5be8241392453751beea21d2e32096c15a8d47db.zip
cpython-5be8241392453751beea21d2e32096c15a8d47db.tar.gz
cpython-5be8241392453751beea21d2e32096c15a8d47db.tar.bz2
bpo-1635741: Port math module to multiphase initialization (GH-19243)
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-03-31-22-15-04.bpo-1635741.8Ir1a0.rst1
-rw-r--r--Modules/mathmodule.c58
2 files changed, 34 insertions, 25 deletions
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 0000000..e1c5a29
--- /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 2a73a98..f1d59c0 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);
}