summaryrefslogtreecommitdiff
path: root/Modules/mathmodule.c
diff options
context:
space:
mode:
authorRaymond Hettinger <rhettinger@users.noreply.github.com>2020-06-23 11:45:25 -0700
committerGitHub <noreply@github.com>2020-06-23 11:45:25 -0700
commit930f4518aea7f3f0f914ce93c3fb92831a7e1d2a (patch)
tree3e66eac64056552b87f1de32304c7c6a53955b83 /Modules/mathmodule.c
parentfe2a48c605d98ac02ab2b9593cb87ce364aeae2d (diff)
downloadcpython-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.c15
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));
}