@@ -756,18 +756,19 @@ PyTypeObject PyRange_Type = {
756756static PyObject *
757757rangeiter_next (_PyRangeIterObject * r )
758758{
759- if (r -> index < r -> len )
760- /* cast to unsigned to avoid possible signed overflow
761- in intermediate calculations. */
762- return PyLong_FromLong ((long )(r -> start +
763- (unsigned long )(r -> index ++ ) * r -> step ));
759+ if (r -> len > 0 ) {
760+ long result = r -> start ;
761+ r -> start = result + r -> step ;
762+ r -> len -- ;
763+ return PyLong_FromLong (result );
764+ }
764765 return NULL ;
765766}
766767
767768static PyObject *
768769rangeiter_len (_PyRangeIterObject * r , PyObject * Py_UNUSED (ignored ))
769770{
770- return PyLong_FromLong (r -> len - r -> index );
771+ return PyLong_FromLong (r -> len );
771772}
772773
773774PyDoc_STRVAR (length_hint_doc ,
@@ -794,8 +795,8 @@ rangeiter_reduce(_PyRangeIterObject *r, PyObject *Py_UNUSED(ignored))
794795 if (range == NULL )
795796 goto err ;
796797 /* return the result */
797- return Py_BuildValue (
798- "N(N)l" , _PyEval_GetBuiltin ( & _Py_ID ( iter )), range , r -> index );
798+ return Py_BuildValue ("N(N)O" , _PyEval_GetBuiltin ( & _Py_ID ( iter )),
799+ range , Py_None );
799800err :
800801 Py_XDECREF (start );
801802 Py_XDECREF (stop );
@@ -814,7 +815,8 @@ rangeiter_setstate(_PyRangeIterObject *r, PyObject *state)
814815 index = 0 ;
815816 else if (index > r -> len )
816817 index = r -> len ; /* exhausted iterator */
817- r -> index = index ;
818+ r -> start += index * r -> step ;
819+ r -> len -= index ;
818820 Py_RETURN_NONE ;
819821}
820822
@@ -904,13 +906,11 @@ fast_range_iter(long start, long stop, long step, long len)
904906 it -> start = start ;
905907 it -> step = step ;
906908 it -> len = len ;
907- it -> index = 0 ;
908909 return (PyObject * )it ;
909910}
910911
911912typedef struct {
912913 PyObject_HEAD
913- PyObject * index ;
914914 PyObject * start ;
915915 PyObject * step ;
916916 PyObject * len ;
@@ -919,7 +919,8 @@ typedef struct {
919919static PyObject *
920920longrangeiter_len (longrangeiterobject * r , PyObject * no_args )
921921{
922- return PyNumber_Subtract (r -> len , r -> index );
922+ Py_INCREF (r -> len );
923+ return r -> len ;
923924}
924925
925926static PyObject *
@@ -946,8 +947,8 @@ longrangeiter_reduce(longrangeiterobject *r, PyObject *Py_UNUSED(ignored))
946947 }
947948
948949 /* return the result */
949- return Py_BuildValue (
950- "N(N)O" , _PyEval_GetBuiltin ( & _Py_ID ( iter )), range , r -> index );
950+ return Py_BuildValue ("N(N)O" , _PyEval_GetBuiltin ( & _Py_ID ( iter )),
951+ range , Py_None );
951952}
952953
953954static PyObject *
@@ -970,7 +971,22 @@ longrangeiter_setstate(longrangeiterobject *r, PyObject *state)
970971 if (cmp > 0 )
971972 state = r -> len ;
972973 }
973- Py_XSETREF (r -> index , Py_NewRef (state ));
974+ PyObject * product = PyNumber_Multiply (state , r -> step );
975+ if (product == NULL )
976+ return NULL ;
977+ PyObject * new_start = PyNumber_Add (r -> start , product );
978+ Py_DECREF (product );
979+ if (new_start == NULL )
980+ return NULL ;
981+ PyObject * new_len = PyNumber_Subtract (r -> len , state );
982+ if (new_len == NULL ) {
983+ Py_DECREF (new_start );
984+ return NULL ;
985+ }
986+ PyObject * tmp = r -> start ;
987+ r -> start = new_start ;
988+ Py_SETREF (r -> len , new_len );
989+ Py_DECREF (tmp );
974990 Py_RETURN_NONE ;
975991}
976992
@@ -987,7 +1003,6 @@ static PyMethodDef longrangeiter_methods[] = {
9871003static void
9881004longrangeiter_dealloc (longrangeiterobject * r )
9891005{
990- Py_XDECREF (r -> index );
9911006 Py_XDECREF (r -> start );
9921007 Py_XDECREF (r -> step );
9931008 Py_XDECREF (r -> len );
@@ -997,29 +1012,21 @@ longrangeiter_dealloc(longrangeiterobject *r)
9971012static PyObject *
9981013longrangeiter_next (longrangeiterobject * r )
9991014{
1000- PyObject * product , * new_index , * result ;
1001- if (PyObject_RichCompareBool (r -> index , r -> len , Py_LT ) != 1 )
1015+ if (PyObject_RichCompareBool (r -> len , _PyLong_GetZero (), Py_GT ) != 1 )
10021016 return NULL ;
10031017
1004- new_index = PyNumber_Add (r -> index , _PyLong_GetOne () );
1005- if (! new_index )
1018+ PyObject * new_start = PyNumber_Add (r -> start , r -> step );
1019+ if (new_start == NULL ) {
10061020 return NULL ;
1007-
1008- product = PyNumber_Multiply (r -> index , r -> step );
1009- if (!product ) {
1010- Py_DECREF (new_index );
1011- return NULL ;
1012- }
1013-
1014- result = PyNumber_Add (r -> start , product );
1015- Py_DECREF (product );
1016- if (result ) {
1017- Py_SETREF (r -> index , new_index );
10181021 }
1019- else {
1020- Py_DECREF (new_index );
1022+ PyObject * new_len = PyNumber_Subtract (r -> len , _PyLong_GetOne ());
1023+ if (new_len == NULL ) {
1024+ Py_DECREF (new_start );
1025+ return NULL ;
10211026 }
1022-
1027+ PyObject * result = r -> start ;
1028+ r -> start = new_start ;
1029+ Py_SETREF (r -> len , new_len );
10231030 return result ;
10241031}
10251032
@@ -1108,7 +1115,6 @@ range_iter(PyObject *seq)
11081115 it -> start = Py_NewRef (r -> start );
11091116 it -> step = Py_NewRef (r -> step );
11101117 it -> len = Py_NewRef (r -> length );
1111- it -> index = Py_NewRef (_PyLong_GetZero ());
11121118 return (PyObject * )it ;
11131119}
11141120
@@ -1186,7 +1192,7 @@ range_reverse(PyObject *seq, PyObject *Py_UNUSED(ignored))
11861192 it = PyObject_New (longrangeiterobject , & PyLongRangeIter_Type );
11871193 if (it == NULL )
11881194 return NULL ;
1189- it -> index = it -> start = it -> step = NULL ;
1195+ it -> start = it -> step = NULL ;
11901196
11911197 /* start + (len - 1) * step */
11921198 it -> len = Py_NewRef (range -> length );
@@ -1210,7 +1216,6 @@ range_reverse(PyObject *seq, PyObject *Py_UNUSED(ignored))
12101216 if (!it -> step )
12111217 goto create_failure ;
12121218
1213- it -> index = Py_NewRef (_PyLong_GetZero ());
12141219 return (PyObject * )it ;
12151220
12161221create_failure :
0 commit comments