summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
Diffstat (limited to 'Objects')
-rw-r--r--Objects/complexobject.c22
1 files changed, 14 insertions, 8 deletions
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;