summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2010-01-04 00:43:01 (GMT)
committerBenjamin Peterson <benjamin@python.org>2010-01-04 00:43:01 (GMT)
commitecdae19fbe9506fffe6616d86f3bbf4a1858f3e2 (patch)
treec4ce3ae37922e1b9cfff5f835e2c2b55ad306ce1
parent37559a085b423e4f2c1d512fb8296cae27c9317b (diff)
downloadcpython-ecdae19fbe9506fffe6616d86f3bbf4a1858f3e2.zip
cpython-ecdae19fbe9506fffe6616d86f3bbf4a1858f3e2.tar.gz
cpython-ecdae19fbe9506fffe6616d86f3bbf4a1858f3e2.tar.bz2
do correct lookup of the __complex__ method
-rw-r--r--Lib/test/test_descr.py3
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/complexobject.c22
3 files changed, 20 insertions, 8 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 10b5af9..418337b 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1691,6 +1691,8 @@ order (MRO) for bases """
return []
def zero(self):
return 0
+ def complex_num(self):
+ return 1j
def stop(self):
raise StopIteration
def return_true(self, thing=None):
@@ -1725,6 +1727,7 @@ order (MRO) for bases """
set(("__bases__",)), {}),
("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
+ ("__complex__", complex, complex_num, set(), {}),
]
class Checker(object):
diff --git a/Misc/NEWS b/Misc/NEWS
index cb39331..06fb9ee 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 2?
Core and Builtins
-----------------
+- The __complex__ method is now looked up on the class of instances to make it
+ consistent with other special methods.
+
- Issue #7462: Implement the stringlib fast search algorithm for the `rfind`,
`rindex`, `rsplit` and `rpartition` methods. Patch by Florent Xicluna.
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index 298e262..60f2c15 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -1114,21 +1114,27 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL;
}
- /* XXX Hack to support classes with __complex__ method */
if (complexstr == NULL) {
complexstr = PyString_InternFromString("__complex__");
if (complexstr == NULL)
return NULL;
}
- f = PyObject_GetAttr(r, complexstr);
- if (f == NULL)
- PyErr_Clear();
+ if (PyInstance_Check(r)) {
+ f = PyObject_GetAttr(r, complexstr);
+ if (f == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError))
+ PyErr_Clear();
+ else
+ return NULL;
+ }
+ }
else {
- PyObject *args = PyTuple_New(0);
- if (args == NULL)
+ f = _PyObject_LookupSpecial(r, "__complex__", &complexstr);
+ if (f == NULL && PyErr_Occurred())
return NULL;
- r = PyEval_CallObject(f, args);
- Py_DECREF(args);
+ }
+ if (f != NULL) {
+ r = PyObject_CallFunctionObjArgs(f, NULL);
Py_DECREF(f);
if (r == NULL)
return NULL;