@@ -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
16531654empty :
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