mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
Tidied up the implementations of reversed (including the custom ones
for xrange and list objects). * list.__reversed__ now checks the length of the sequence object before calling PyList_GET_ITEM() because the mutable could have changed length. * all three implementations are now tranparent with respect to length and maintain the invariant len(it) == len(list(it)) even when the underlying sequence mutates. * __builtin__.reversed() now frees the underlying sequence as soon as the iterator is exhausted. * the code paths were rearranged so that the most common paths do not require a jump.
This commit is contained in:
parent
d2c36261a2
commit
ef9bf4031a
4 changed files with 59 additions and 29 deletions
|
@ -217,23 +217,21 @@ static PyObject *
|
|||
reversed_next(reversedobject *ro)
|
||||
{
|
||||
PyObject *item;
|
||||
long index = ro->index;
|
||||
|
||||
if (ro->index < 0)
|
||||
return NULL;
|
||||
|
||||
assert(PySequence_Check(ro->seq));
|
||||
item = PySequence_GetItem(ro->seq, ro->index);
|
||||
if (item == NULL)
|
||||
return NULL;
|
||||
|
||||
ro->index--;
|
||||
return item;
|
||||
}
|
||||
|
||||
static int
|
||||
reversed_len(reversedobject *ro)
|
||||
{
|
||||
return PyObject_Size(ro->seq);
|
||||
if (index >= 0) {
|
||||
item = PySequence_GetItem(ro->seq, index);
|
||||
if (item != NULL) {
|
||||
ro->index--;
|
||||
return item;
|
||||
}
|
||||
}
|
||||
ro->index = -1;
|
||||
if (ro->seq != NULL) {
|
||||
Py_DECREF(ro->seq);
|
||||
ro->seq = NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(reversed_doc,
|
||||
|
@ -241,6 +239,12 @@ PyDoc_STRVAR(reversed_doc,
|
|||
"\n"
|
||||
"Return a reverse iterator");
|
||||
|
||||
static int
|
||||
reversed_len(reversedobject *ro)
|
||||
{
|
||||
return ro->index + 1;
|
||||
}
|
||||
|
||||
static PySequenceMethods reversed_as_sequence = {
|
||||
(inquiry)reversed_len, /* sq_length */
|
||||
0, /* sq_concat */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue