summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_descr.py1
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/mathmodule.c18
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):
diff --git a/Misc/NEWS b/Misc/NEWS
index 2671d85..94de171 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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,