Commit 363a83bb authored by Mark Dickinson's avatar Mark Dickinson

Issue #16290: __complex__ must now always return an instance of complex.

parent feb8d2e3
...@@ -221,6 +221,8 @@ class ComplexTest(unittest.TestCase): ...@@ -221,6 +221,8 @@ class ComplexTest(unittest.TestCase):
self.assertRaises(TypeError, complex, OS(None)) self.assertRaises(TypeError, complex, OS(None))
self.assertRaises(TypeError, complex, NS(None)) self.assertRaises(TypeError, complex, NS(None))
self.assertRaises(TypeError, complex, {}) self.assertRaises(TypeError, complex, {})
self.assertRaises(TypeError, complex, NS(1.5))
self.assertRaises(TypeError, complex, NS(1))
self.assertAlmostEqual(complex("1+10j"), 1+10j) self.assertAlmostEqual(complex("1+10j"), 1+10j)
self.assertAlmostEqual(complex(10), 10+0j) self.assertAlmostEqual(complex(10), 10+0j)
......
...@@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #16290: A float return value from the __complex__ special method is no
longer accepted in the complex() constructor.
- Issue #16416: On Mac OS X, operating system data are now always - Issue #16416: On Mac OS X, operating system data are now always
encoded/decoded to/from UTF-8/surrogateescape, instead of the locale encoding encoded/decoded to/from UTF-8/surrogateescape, instead of the locale encoding
(which may be ASCII if no locale environment variable is set), to avoid (which may be ASCII if no locale environment variable is set), to avoid
......
...@@ -271,6 +271,12 @@ try_complex_special_method(PyObject *op) { ...@@ -271,6 +271,12 @@ try_complex_special_method(PyObject *op) {
if (f) { if (f) {
PyObject *res = PyObject_CallFunctionObjArgs(f, NULL); PyObject *res = PyObject_CallFunctionObjArgs(f, NULL);
Py_DECREF(f); Py_DECREF(f);
if (res != NULL && !PyComplex_Check(res)) {
PyErr_SetString(PyExc_TypeError,
"__complex__ should return a complex object");
Py_DECREF(res);
return NULL;
}
return res; return res;
} }
return NULL; return NULL;
...@@ -296,12 +302,6 @@ PyComplex_AsCComplex(PyObject *op) ...@@ -296,12 +302,6 @@ PyComplex_AsCComplex(PyObject *op)
newop = try_complex_special_method(op); newop = try_complex_special_method(op);
if (newop) { if (newop) {
if (!PyComplex_Check(newop)) {
PyErr_SetString(PyExc_TypeError,
"__complex__ should return a complex object");
Py_DECREF(newop);
return cv;
}
cv = ((PyComplexObject *)newop)->cval; cv = ((PyComplexObject *)newop)->cval;
Py_DECREF(newop); Py_DECREF(newop);
return cv; return cv;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment