diff options
author | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2020-06-23 11:45:25 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-23 11:45:25 -0700 |
commit | 930f4518aea7f3f0f914ce93c3fb92831a7e1d2a (patch) | |
tree | 3e66eac64056552b87f1de32304c7c6a53955b83 /Modules/mathmodule.c | |
parent | fe2a48c605d98ac02ab2b9593cb87ce364aeae2d (diff) | |
download | cpython-git-930f4518aea7f3f0f914ce93c3fb92831a7e1d2a.tar.gz |
On path with known exact float, extract the double with the fast macro. (GH-21072)
Diffstat (limited to 'Modules/mathmodule.c')
-rw-r--r-- | Modules/mathmodule.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 4450ce1894..411c6eb193 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1256,9 +1256,15 @@ static PyObject * math_floor(PyObject *module, PyObject *number) /*[clinic end generated code: output=c6a65c4884884b8a input=63af6b5d7ebcc3d6]*/ { + double x; + _Py_IDENTIFIER(__floor__); - if (!PyFloat_CheckExact(number)) { + if (PyFloat_CheckExact(number)) { + x = PyFloat_AS_DOUBLE(number); + } + else + { PyObject *method = _PyObject_LookupSpecial(number, &PyId___floor__); if (method != NULL) { PyObject *result = _PyObject_CallNoArg(method); @@ -1267,11 +1273,10 @@ math_floor(PyObject *module, PyObject *number) } if (PyErr_Occurred()) return NULL; + x = PyFloat_AsDouble(number); + if (x == -1.0 && PyErr_Occurred()) + return NULL; } - double x = PyFloat_AsDouble(number); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyLong_FromDouble(floor(x)); } |