diff options
author | Benjamin Peterson <benjamin@python.org> | 2010-07-01 15:16:55 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2010-07-01 15:16:55 (GMT) |
commit | 8bb9cde6c040fd1026b5f05d1ebdba19a8b149a8 (patch) | |
tree | 4677867143c72668580c7ba0b523c037c38fd3a1 | |
parent | 6e73b197479d54d5d6d7461d3cc336c545cc6295 (diff) | |
download | cpython-8bb9cde6c040fd1026b5f05d1ebdba19a8b149a8.zip cpython-8bb9cde6c040fd1026b5f05d1ebdba19a8b149a8.tar.gz cpython-8bb9cde6c040fd1026b5f05d1ebdba19a8b149a8.tar.bz2 |
correctly lookup __trunc__ and __floor__
-rw-r--r-- | Lib/test/test_descr.py | 3 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/mathmodule.c | 31 |
3 files changed, 17 insertions, 20 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 10820ab..297cc35 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1,6 +1,7 @@ import builtins import sys import types +import math import unittest from copy import deepcopy @@ -1578,6 +1579,8 @@ order (MRO) for bases """ ("__exit__", run_context, swallow, set(), {"__enter__" : iden}), ("__complex__", complex, complex_num, set(), {}), ("__format__", format, format_impl, set(), {}), + ("__floor__", math.floor, zero, set(), {}), + ("__trunc__", math.trunc, zero, set(), {}), ] class Checker(object): @@ -1374,6 +1374,9 @@ Library Extension Modules ----------------- +- In the math module, correctly lookup __trunc__ 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() could produce tm_year value of 0 or 10,000. Now an OverflowError is diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index ef6980f..2f656bb 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -883,17 +883,13 @@ static PyObject * math_floor(PyObject *self, PyObject *number) { static PyObject *floor_str = NULL; PyObject *method; - if (floor_str == NULL) { - floor_str = PyUnicode_InternFromString("__floor__"); - if (floor_str == NULL) + method = _PyObject_LookupSpecial(number, "__floor__", &floor_str); + if (method == NULL) { + if (PyErr_Occurred()) return NULL; - } - - method = _PyType_Lookup(Py_TYPE(number), floor_str); - if (method == NULL) return math_1_to_int(number, floor, 0); - else - return PyObject_CallFunction(method, "O", number); + } + return PyObject_CallFunctionObjArgs(method, NULL); } PyDoc_STRVAR(math_floor_doc, @@ -1427,20 +1423,15 @@ math_trunc(PyObject *self, PyObject *number) return NULL; } - if (trunc_str == NULL) { - trunc_str = PyUnicode_InternFromString("__trunc__"); - if (trunc_str == NULL) - return NULL; - } - - trunc = _PyType_Lookup(Py_TYPE(number), trunc_str); + trunc = _PyObject_LookupSpecial(number, "__trunc__", &trunc_str); if (trunc == NULL) { - PyErr_Format(PyExc_TypeError, - "type %.100s doesn't define __trunc__ method", - Py_TYPE(number)->tp_name); + if (!PyErr_Occurred()) + PyErr_Format(PyExc_TypeError, + "type %.100s doesn't define __trunc__ method", + Py_TYPE(number)->tp_name); return NULL; } - return PyObject_CallFunctionObjArgs(trunc, number, NULL); + return PyObject_CallFunctionObjArgs(trunc, NULL); } PyDoc_STRVAR(math_trunc_doc, |