summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2010-05-30 12:12:25 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2010-05-30 12:12:25 (GMT)
commit813363743d4f46062b1d5149d62252c0e2794289 (patch)
treee560c6e9c8b3b73381f0ae162cd096efa324dd10
parentddac33882b7c51c4b0770fd39adaee33dfcd9a1c (diff)
downloadcpython-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.py13
-rw-r--r--Misc/NEWS4
-rw-r--r--Objects/complexobject.c21
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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 17f7164..e63d905 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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,