@@ -830,13 +830,10 @@ static PyObject *
830830rangeiter_next (PyObject * op )
831831{
832832 _PyRangeIterObject * r = (_PyRangeIterObject * )op ;
833- long start = FT_ATOMIC_LOAD_LONG_RELAXED ( r -> start ) ;
834- long len = _PyRangeIter_GetLength (r , start );
833+ long start ;
834+ long len = _PyRangeIter_GetLengthAndStart (r , & start );
835835 if (len > 0 ) {
836- #ifndef Py_GIL_DISABLED
837- r -> len = len - 1 ;
838- #endif
839- FT_ATOMIC_STORE_LONG_RELAXED (r -> start , start + r -> step );
836+ _PyRangeIter_SetLength (r , len - 1 );
840837 return PyLong_FromLong (start );
841838 }
842839 return NULL ;
@@ -846,8 +843,9 @@ static PyObject *
846843rangeiter_len (PyObject * op , PyObject * Py_UNUSED (ignored ))
847844{
848845 _PyRangeIterObject * r = (_PyRangeIterObject * )op ;
849- long start = FT_ATOMIC_LOAD_LONG_RELAXED (r -> start );
850- return PyLong_FromLong (_PyRangeIter_GetLength (r , start ));
846+ long start ;
847+ long len = _PyRangeIter_GetLengthAndStart (r , & start );
848+ return PyLong_FromLong (len );
851849}
852850
853851PyDoc_STRVAR (length_hint_doc ,
@@ -861,7 +859,9 @@ rangeiter_reduce(PyObject *op, PyObject *Py_UNUSED(ignored))
861859 PyObject * range ;
862860
863861 /* create a range object for pickling */
864- start = PyLong_FromLong (FT_ATOMIC_LOAD_LONG_RELAXED (r -> start ));
862+ long lstart ;
863+ (void )_PyRangeIter_GetLengthAndStart (r , & lstart );
864+ start = PyLong_FromLong (lstart );
865865 if (start == NULL )
866866 goto err ;
867867 stop = PyLong_FromLong (r -> stop );
@@ -892,14 +892,13 @@ rangeiter_setstate(PyObject *op, PyObject *state)
892892 if (index == -1 && PyErr_Occurred ())
893893 return NULL ;
894894 /* silently clip the index value */
895- long start = FT_ATOMIC_LOAD_LONG_RELAXED ( r -> start ) ;
896- long len = _PyRangeIter_GetLength (r , start );
895+ long start ;
896+ long len = _PyRangeIter_GetLengthAndStart (r , & start );
897897 if (index < 0 )
898898 index = 0 ;
899899 else if (index > len )
900900 index = len ; /* exhausted iterator */
901- r -> len = len - index ;
902- FT_ATOMIC_STORE_LONG_RELAXED (r -> start , start + index * r -> step );
901+ _PyRangeIter_SetLength (r , len - index );
903902 Py_RETURN_NONE ;
904903}
905904
@@ -983,9 +982,9 @@ fast_range_iter(long start, long stop, long step, long len)
983982 _PyRangeIterObject * it = PyObject_New (_PyRangeIterObject , & PyRangeIter_Type );
984983 if (it == NULL )
985984 return NULL ;
986- it -> start = start ;
987- it -> step = step ;
988985 it -> len = len ;
986+ it -> end = start + step * len ;
987+ it -> step = step ;
989988 it -> stop = stop ;
990989 return (PyObject * )it ;
991990}
0 commit comments