diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2010-05-30 12:12:25 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2010-05-30 12:12:25 (GMT) |
commit | 813363743d4f46062b1d5149d62252c0e2794289 (patch) | |
tree | e560c6e9c8b3b73381f0ae162cd096efa324dd10 | |
parent | ddac33882b7c51c4b0770fd39adaee33dfcd9a1c (diff) | |
download | cpython-813363743d4f46062b1d5149d62252c0e2794289.zip cpython-813363743d4f46062b1d5149d62252c0e2794289.tar.gz cpython-813363743d4f46062b1d5149d62252c0e2794289.tar.bz2 |
Issue #5211: Complete removal of implicit coercions for the complex
type. Coercion for arithmetic operations was already removed in
r78280, but that commit didn't remove coercion for rich comparisons.
-rw-r--r-- | Lib/test/test_complex.py | 13 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Objects/complexobject.c | 21 |
3 files changed, 19 insertions, 19 deletions
diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index fc47b23..f27593e 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -115,6 +115,19 @@ class ComplexTest(unittest.TestCase): def test_coerce(self): self.assertRaises(OverflowError, complex.__coerce__, 1+1j, 1L<<10000) + def test_no_implicit_coerce(self): + # Python 2.7 removed implicit coercion from the complex type + class A(object): + def __coerce__(self, other): + raise RuntimeError + __hash__ = None + def __cmp__(self, other): + return -1 + + a = A() + self.assertRaises(TypeError, lambda: a + 2.0j) + self.assertTrue(a < 2.0j) + def test_richcompare(self): self.assertRaises(OverflowError, complex.__eq__, 1+1j, 1L<<10000) self.assertEqual(complex.__lt__(1+1j, None), NotImplemented) @@ -12,6 +12,10 @@ What's New in Python 2.7 Release Candidate 1? Core and Builtins ----------------- +- Issue #5211: Implicit coercion for the complex type is now completely + removed. (Coercion for arithmetic operations was already removed in 2.7 + alpha 4, but coercion for rich comparisons was accidentally left in.) + - Issue #3798: Write sys.exit() message to sys.stderr to use stderr encoding and error handler, instead of writing to the C stderr file in utf-8 diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 5f26a6a..3577a29 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -787,25 +787,8 @@ complex_richcompare(PyObject *v, PyObject *w, int op) Py_complex i, j; PyObject *res; - c = PyNumber_CoerceEx(&v, &w); - if (c < 0) - return NULL; - if (c > 0) { - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - /* Make sure both arguments are complex. */ - if (!(PyComplex_Check(v) && PyComplex_Check(w))) { - Py_DECREF(v); - Py_DECREF(w); - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - - i = ((PyComplexObject *)v)->cval; - j = ((PyComplexObject *)w)->cval; - Py_DECREF(v); - Py_DECREF(w); + TO_COMPLEX(v, i); + TO_COMPLEX(w, j); if (op != Py_EQ && op != Py_NE) { PyErr_SetString(PyExc_TypeError, |