Skip to content

Commit e1e61df

Browse files
committed
use step as sentinel
1 parent 443404e commit e1e61df

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

Modules/itertoolsmodule.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,15 +1618,16 @@ islice_next(PyObject *op)
16181618
PyObject *item;
16191619
PyObject *it = lz->it;
16201620
Py_ssize_t stop = lz->stop;
1621-
Py_ssize_t oldnext;
16221621
PyObject *(*iternext)(PyObject *);
16231622

1624-
Py_ssize_t cnt = FT_ATOMIC_LOAD_SSIZE_RELAXED(lz->cnt);
1625-
if (cnt < 0)
1623+
Py_ssize_t step = FT_ATOMIC_LOAD_SSIZE_RELAXED(lz->step);
1624+
if (step < 0)
16261625
return NULL;
16271626

1627+
Py_ssize_t cnt = FT_ATOMIC_LOAD_SSIZE_RELAXED(lz->cnt);
1628+
Py_ssize_t oldnext = FT_ATOMIC_LOAD_SSIZE_RELAXED(lz->next);
16281629
iternext = *Py_TYPE(it)->tp_iternext;
1629-
while (cnt < lz->next) {
1630+
while (cnt < oldnext) {
16301631
item = iternext(it);
16311632
if (item == NULL)
16321633
goto empty;
@@ -1640,18 +1641,18 @@ islice_next(PyObject *op)
16401641
goto empty;
16411642
cnt++;
16421643
FT_ATOMIC_STORE_SSIZE_RELAXED(lz->cnt, cnt);
1643-
oldnext = FT_ATOMIC_LOAD_SSIZE_RELAXED(lz->next);
1644+
16441645
/* The (size_t) cast below avoids the danger of undefined
16451646
behaviour from signed integer overflow. */
1646-
Py_ssize_t new_next = oldnext + (size_t)lz->step
1647+
Py_ssize_t new_next = oldnext + (size_t)step;
16471648
FT_ATOMIC_STORE_SSIZE_RELAXED(lz->next, new_next);
16481649
if (new_next < oldnext || (stop != -1 && new_next > stop)) {
16491650
FT_ATOMIC_STORE_SSIZE_RELAXED(lz->next, stop);
16501651
}
16511652
return item;
16521653

16531654
empty:
1654-
FT_ATOMIC_STORE_SSIZE_RELAXED(lz->cnt, -1);
1655+
FT_ATOMIC_STORE_SSIZE_RELAXED(lz->step, -1);
16551656
#ifndef PY_GIL_DISABLED
16561657
Py_CLEAR(lz->it);
16571658
#endif

0 commit comments

Comments
 (0)