Kaydet (Commit) 784d4550 authored tarafından Benjamin Peterson's avatar Benjamin Peterson

*sigh* deal with instances correctly

üst 0a32f9c4
...@@ -141,6 +141,12 @@ class TestReversed(unittest.TestCase): ...@@ -141,6 +141,12 @@ class TestReversed(unittest.TestCase):
# don't allow keyword arguments # don't allow keyword arguments
self.assertRaises(TypeError, reversed, [], a=1) 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): def test_xrange_optimization(self):
x = xrange(1) x = xrange(1)
self.assertEqual(type(reversed(x)), type(iter(x))) self.assertEqual(type(reversed(x)), type(iter(x)))
......
...@@ -232,7 +232,18 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -232,7 +232,18 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) ) if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) )
return NULL; 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) { if (reversed_meth != NULL) {
PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL); PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL);
Py_DECREF(reversed_meth); Py_DECREF(reversed_meth);
......
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