]> granicus.if.org Git - python/commitdiff
Let reversed() work with itself.
authorRaymond Hettinger <python@rcn.com>
Sun, 8 Feb 2004 10:49:42 +0000 (10:49 +0000)
committerRaymond Hettinger <python@rcn.com>
Sun, 8 Feb 2004 10:49:42 +0000 (10:49 +0000)
Include/listobject.h
Lib/test/test_enumerate.py
Objects/enumobject.c

index 14ed72ef87532a91ca43a9735350bc109094b60b..6221b80d1f9262d7033aaec0740b4379c89cbc80 100644 (file)
@@ -22,6 +22,7 @@ extern "C" {
 typedef struct {
     PyObject_VAR_HEAD
     PyObject **ob_item;
+    int allocated;
 } PyListObject;
 
 PyAPI_DATA(PyTypeObject) PyList_Type;
index 636f883754aed328ede9f8a411d653965d0971fb..ab1a60d0ef7c3527617f1d9871e1bd27d748b15c 100644 (file)
@@ -141,6 +141,10 @@ class TestReversed(unittest.TestCase):
         x = xrange(1)
         self.assertEqual(type(reversed(x)), type(iter(x)))
 
+    def test_double_reverse(self):
+        s = 'hello'
+        self.assertEqual(list(reversed(reversed(s))), list(s))
+
 def test_main(verbose=None):
     testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig,
                    TestReversed)
index 7ed58da09e5808145a440e33eab2984523b392ad..3aac68095f71ecd31abd8898f24941d90f2f90f4 100644 (file)
@@ -230,11 +230,22 @@ reversed_next(reversedobject *ro)
        return item;
 }
 
+static PyObject *
+reversed_reverse(reversedobject *ro, PyObject *unused)
+{
+       return PyObject_GetIter(ro->seq);
+}
+
 PyDoc_STRVAR(reversed_doc,
 "reverse(sequence) -> reverse iterator over values of the sequence\n"
 "\n"
 "Return a reverse iterator");
 
+static PyMethodDef reversed_methods[] = {
+       {"__reversed__",        (PyCFunction)reversed_reverse,  
+               METH_NOARGS,     reversed_doc},
+};
+
 PyTypeObject PyReversed_Type = {
        PyObject_HEAD_INIT(&PyType_Type)
        0,                              /* ob_size */
@@ -266,7 +277,7 @@ PyTypeObject PyReversed_Type = {
        0,                              /* tp_weaklistoffset */
        PyObject_SelfIter,              /* tp_iter */
        (iternextfunc)reversed_next,    /* tp_iternext */
-       0,                              /* tp_methods */
+       reversed_methods,               /* tp_methods */
        0,                              /* tp_members */
        0,                              /* tp_getset */
        0,                              /* tp_base */