[Python-checkins] r72512 - in python/trunk: Lib/test/test_enumerate.py Objects/enumobject.c

benjamin.peterson python-checkins at python.org
Sat May 9 19:23:03 CEST 2009


Author: benjamin.peterson
Date: Sat May  9 19:23:03 2009
New Revision: 72512

Log:
*sigh* deal with instances correctly

Modified:
   python/trunk/Lib/test/test_enumerate.py
   python/trunk/Objects/enumobject.c

Modified: python/trunk/Lib/test/test_enumerate.py
==============================================================================
--- python/trunk/Lib/test/test_enumerate.py	(original)
+++ python/trunk/Lib/test/test_enumerate.py	Sat May  9 19:23:03 2009
@@ -141,6 +141,12 @@
         # don't allow keyword arguments
         self.assertRaises(TypeError, reversed, [], a=1)
 
+    def test_class_class(self):
+        class A:
+            def __reversed__(self):
+                return [2, 1]
+        self.assertEqual(list(reversed(A())), [2, 1])
+
     def test_xrange_optimization(self):
         x = xrange(1)
         self.assertEqual(type(reversed(x)), type(iter(x)))

Modified: python/trunk/Objects/enumobject.c
==============================================================================
--- python/trunk/Objects/enumobject.c	(original)
+++ python/trunk/Objects/enumobject.c	Sat May  9 19:23:03 2009
@@ -232,7 +232,18 @@
 	if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) )
 		return NULL;
 
-	reversed_meth = _PyObject_LookupSpecial(seq, "__reversed__", &reversed_cache);
+	if (PyInstance_Check(seq)) {
+		reversed_meth = PyObject_GetAttrString(seq, "__reversed__");
+		if (reversed_meth == NULL) {
+			if (PyErr_ExceptionMatches(PyExc_AttributeError))
+				PyErr_Clear();
+			else
+				return NULL;
+		}
+	}
+	else
+		reversed_meth = _PyObject_LookupSpecial(seq, "__reversed__",
+							&reversed_cache);
 	if (reversed_meth != NULL) {
 		PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL);
 		Py_DECREF(reversed_meth);


More information about the Python-checkins mailing list