[Python-checkins] r77292 - in python/trunk: Lib/test/test_descr.py Misc/NEWS Objects/complexobject.c

benjamin.peterson python-checkins at python.org
Mon Jan 4 01:43:01 CET 2010


Author: benjamin.peterson
Date: Mon Jan  4 01:43:01 2010
New Revision: 77292

Log:
do correct lookup of the __complex__ method

Modified:
   python/trunk/Lib/test/test_descr.py
   python/trunk/Misc/NEWS
   python/trunk/Objects/complexobject.c

Modified: python/trunk/Lib/test/test_descr.py
==============================================================================
--- python/trunk/Lib/test/test_descr.py	(original)
+++ python/trunk/Lib/test/test_descr.py	Mon Jan  4 01:43:01 2010
@@ -1691,6 +1691,8 @@
             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 @@
              set(("__bases__",)), {}),
             ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
             ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
+            ("__complex__", complex, complex_num, set(), {}),
             ]
 
         class Checker(object):

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Mon Jan  4 01:43:01 2010
@@ -12,6 +12,9 @@
 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.
 

Modified: python/trunk/Objects/complexobject.c
==============================================================================
--- python/trunk/Objects/complexobject.c	(original)
+++ python/trunk/Objects/complexobject.c	Mon Jan  4 01:43:01 2010
@@ -1114,21 +1114,27 @@
 		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;


More information about the Python-checkins mailing list