@@ -756,18 +756,19 @@ PyTypeObject PyRange_Type = {
756
756
static PyObject *
757
757
rangeiter_next (_PyRangeIterObject * r )
758
758
{
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
+ }
764
765
return NULL ;
765
766
}
766
767
767
768
static PyObject *
768
769
rangeiter_len (_PyRangeIterObject * r , PyObject * Py_UNUSED (ignored ))
769
770
{
770
- return PyLong_FromLong (r -> len - r -> index );
771
+ return PyLong_FromLong (r -> len );
771
772
}
772
773
773
774
PyDoc_STRVAR (length_hint_doc ,
@@ -794,8 +795,8 @@ rangeiter_reduce(_PyRangeIterObject *r, PyObject *Py_UNUSED(ignored))
794
795
if (range == NULL )
795
796
goto err ;
796
797
/* 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 );
799
800
err :
800
801
Py_XDECREF (start );
801
802
Py_XDECREF (stop );
@@ -814,7 +815,8 @@ rangeiter_setstate(_PyRangeIterObject *r, PyObject *state)
814
815
index = 0 ;
815
816
else if (index > r -> len )
816
817
index = r -> len ; /* exhausted iterator */
817
- r -> index = index ;
818
+ r -> start += index * r -> step ;
819
+ r -> len -= index ;
818
820
Py_RETURN_NONE ;
819
821
}
820
822
@@ -904,13 +906,11 @@ fast_range_iter(long start, long stop, long step, long len)
904
906
it -> start = start ;
905
907
it -> step = step ;
906
908
it -> len = len ;
907
- it -> index = 0 ;
908
909
return (PyObject * )it ;
909
910
}
910
911
911
912
typedef struct {
912
913
PyObject_HEAD
913
- PyObject * index ;
914
914
PyObject * start ;
915
915
PyObject * step ;
916
916
PyObject * len ;
@@ -919,7 +919,8 @@ typedef struct {
919
919
static PyObject *
920
920
longrangeiter_len (longrangeiterobject * r , PyObject * no_args )
921
921
{
922
- return PyNumber_Subtract (r -> len , r -> index );
922
+ Py_INCREF (r -> len );
923
+ return r -> len ;
923
924
}
924
925
925
926
static PyObject *
@@ -946,8 +947,8 @@ longrangeiter_reduce(longrangeiterobject *r, PyObject *Py_UNUSED(ignored))
946
947
}
947
948
948
949
/* 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 );
951
952
}
952
953
953
954
static PyObject *
@@ -970,7 +971,22 @@ longrangeiter_setstate(longrangeiterobject *r, PyObject *state)
970
971
if (cmp > 0 )
971
972
state = r -> len ;
972
973
}
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 );
974
990
Py_RETURN_NONE ;
975
991
}
976
992
@@ -987,7 +1003,6 @@ static PyMethodDef longrangeiter_methods[] = {
987
1003
static void
988
1004
longrangeiter_dealloc (longrangeiterobject * r )
989
1005
{
990
- Py_XDECREF (r -> index );
991
1006
Py_XDECREF (r -> start );
992
1007
Py_XDECREF (r -> step );
993
1008
Py_XDECREF (r -> len );
@@ -997,29 +1012,21 @@ longrangeiter_dealloc(longrangeiterobject *r)
997
1012
static PyObject *
998
1013
longrangeiter_next (longrangeiterobject * r )
999
1014
{
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 )
1002
1016
return NULL ;
1003
1017
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 ) {
1006
1020
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 );
1018
1021
}
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 ;
1021
1026
}
1022
-
1027
+ PyObject * result = r -> start ;
1028
+ r -> start = new_start ;
1029
+ Py_SETREF (r -> len , new_len );
1023
1030
return result ;
1024
1031
}
1025
1032
@@ -1108,7 +1115,6 @@ range_iter(PyObject *seq)
1108
1115
it -> start = Py_NewRef (r -> start );
1109
1116
it -> step = Py_NewRef (r -> step );
1110
1117
it -> len = Py_NewRef (r -> length );
1111
- it -> index = Py_NewRef (_PyLong_GetZero ());
1112
1118
return (PyObject * )it ;
1113
1119
}
1114
1120
@@ -1186,7 +1192,7 @@ range_reverse(PyObject *seq, PyObject *Py_UNUSED(ignored))
1186
1192
it = PyObject_New (longrangeiterobject , & PyLongRangeIter_Type );
1187
1193
if (it == NULL )
1188
1194
return NULL ;
1189
- it -> index = it -> start = it -> step = NULL ;
1195
+ it -> start = it -> step = NULL ;
1190
1196
1191
1197
/* start + (len - 1) * step */
1192
1198
it -> len = Py_NewRef (range -> length );
@@ -1210,7 +1216,6 @@ range_reverse(PyObject *seq, PyObject *Py_UNUSED(ignored))
1210
1216
if (!it -> step )
1211
1217
goto create_failure ;
1212
1218
1213
- it -> index = Py_NewRef (_PyLong_GetZero ());
1214
1219
return (PyObject * )it ;
1215
1220
1216
1221
create_failure :
0 commit comments