diff options
-rw-r--r-- | Lib/test/test_descr.py | 1 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Modules/mathmodule.c | 18 |
3 files changed, 12 insertions, 11 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 297cc35..0979880 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1581,6 +1581,7 @@ order (MRO) for bases """ ("__format__", format, format_impl, set(), {}), ("__floor__", math.floor, zero, set(), {}), ("__trunc__", math.trunc, zero, set(), {}), + ("__ceil__", math.ceil, zero, set(), {}), ] class Checker(object): @@ -1374,8 +1374,8 @@ Library Extension Modules ----------------- -- In the math module, correctly lookup __trunc__ and __floor__ as special - methods. +- In the math module, correctly lookup __trunc__, __ceil__, and __floor__ as + special methods. - Issue #9005: Prevent utctimetuple() from producing year 0 or year 10,000. Prior to this change, timezone adjustment in utctimetuple() diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 64738f0..9141805 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -843,17 +843,17 @@ static PyObject * math_ceil(PyObject *self, PyObject *number) { static PyObject *ceil_str = NULL; PyObject *method; - if (ceil_str == NULL) { - ceil_str = PyUnicode_InternFromString("__ceil__"); - if (ceil_str == NULL) + method = _PyObject_LookupSpecial(number, "__ceil__", &ceil_str); + if (method == NULL) { + if (PyErr_Occurred()) return NULL; - } - - method = _PyType_Lookup(Py_TYPE(number), ceil_str); - if (method == NULL) return math_1_to_int(number, ceil, 0); - else - return PyObject_CallFunction(method, "O", number); + } + else { + PyObject *result = PyObject_CallFunctionObjArgs(method, NULL); + Py_DECREF(method); + return result; + } } PyDoc_STRVAR(math_ceil_doc, |