From 930f4518aea7f3f0f914ce93c3fb92831a7e1d2a Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Tue, 23 Jun 2020 11:45:25 -0700 Subject: On path with known exact float, extract the double with the fast macro. (GH-21072) --- Modules/mathmodule.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'Modules/mathmodule.c') 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)); } -- cgit v1.2.1