Index: Objects/rangeobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/rangeobject.c,v retrieving revision 2.48 diff -c -r2.48 rangeobject.c *** Objects/rangeobject.c 17 Mar 2003 19:46:11 -0000 2.48 --- Objects/rangeobject.c 2 Nov 2003 23:18:39 -0000 *************** *** 171,176 **** --- 171,185 ---- }; static PyObject * range_iter(PyObject *seq); + static PyObject * range_reverse(PyObject *seq); + + PyDoc_STRVAR(reverse_doc, + "Returns an reverse iterator."); + + static PyMethodDef range_methods[] = { + {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, + {NULL, NULL} /* sentinel */ + }; PyTypeObject PyRange_Type = { PyObject_HEAD_INIT(&PyType_Type) *************** *** 201,207 **** 0, /* tp_weaklistoffset */ (getiterfunc)range_iter, /* tp_iter */ 0, /* tp_iternext */ ! 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ --- 210,216 ---- 0, /* tp_weaklistoffset */ (getiterfunc)range_iter, /* tp_iter */ 0, /* tp_iternext */ ! range_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ *************** *** 242,247 **** --- 251,282 ---- it->start = ((rangeobject *)seq)->start; it->step = ((rangeobject *)seq)->step; it->len = ((rangeobject *)seq)->len; + return (PyObject *)it; + } + + static PyObject * + range_reverse(PyObject *seq) + { + rangeiterobject *it; + long start, step, len; + + if (!PyRange_Check(seq)) { + PyErr_BadInternalCall(); + return NULL; + } + it = PyObject_New(rangeiterobject, &Pyrangeiter_Type); + if (it == NULL) + return NULL; + + start = ((rangeobject *)seq)->start; + step = ((rangeobject *)seq)->step; + len = ((rangeobject *)seq)->len; + + it->index = 0; + it->start = start + (len-1) * step; + it->step = -step; + it->len = len; + return (PyObject *)it; }