]> granicus.if.org Git - python/commitdiff
fix lookup of __ceil__
authorBenjamin Peterson <benjamin@python.org>
Fri, 2 Jul 2010 13:46:42 +0000 (13:46 +0000)
committerBenjamin Peterson <benjamin@python.org>
Fri, 2 Jul 2010 13:46:42 +0000 (13:46 +0000)
Lib/test/test_descr.py
Misc/NEWS
Modules/mathmodule.c

index 297cc35531ac52ff8793704a36f5f0581ac3d4f4..09798802f3a32061a43ad2867748ad44b5df2667 100644 (file)
@@ -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):
index 2671d85467d987e27edb8ba10da2f0e1d7a71722..94de1714d3c4f2be6eab8552fcb88013be404771 100644 (file)
--- 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()
index 64738f0bc859c1c5345bd74adf0cddf8da220786..9141805f74018a80294dcd29568e429dfa111c1d 100644 (file)
@@ -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,