@@ -766,7 +766,6 @@ PyTypeObject PyRange_Type = {
766
766
767
767
typedef struct {
768
768
PyObject_HEAD
769
- long index ;
770
769
long start ;
771
770
long step ;
772
771
long len ;
@@ -775,18 +774,19 @@ typedef struct {
775
774
static PyObject *
776
775
rangeiter_next (rangeiterobject * r )
777
776
{
778
- if (r -> index < r -> len )
779
- /* cast to unsigned to avoid possible signed overflow
780
- in intermediate calculations. */
781
- return PyLong_FromLong ((long )(r -> start +
782
- (unsigned long )(r -> index ++ ) * r -> step ));
777
+ if (r -> len > 0 ) {
778
+ long result = r -> start ;
779
+ r -> start += r -> step ;
780
+ r -> len -- ;
781
+ return PyLong_FromLong (result );
782
+ }
783
783
return NULL ;
784
784
}
785
785
786
786
static PyObject *
787
787
rangeiter_len (rangeiterobject * r , PyObject * Py_UNUSED (ignored ))
788
788
{
789
- return PyLong_FromLong (r -> len - r -> index );
789
+ return PyLong_FromLong (r -> len );
790
790
}
791
791
792
792
PyDoc_STRVAR (length_hint_doc ,
@@ -813,8 +813,8 @@ rangeiter_reduce(rangeiterobject *r, PyObject *Py_UNUSED(ignored))
813
813
if (range == NULL )
814
814
goto err ;
815
815
/* return the result */
816
- return Py_BuildValue ("N(N)i " , _PyEval_GetBuiltinId (& PyId_iter ),
817
- range , r -> index );
816
+ return Py_BuildValue ("N(N)O " , _PyEval_GetBuiltinId (& PyId_iter ),
817
+ range , Py_None );
818
818
err :
819
819
Py_XDECREF (start );
820
820
Py_XDECREF (stop );
@@ -833,7 +833,8 @@ rangeiter_setstate(rangeiterobject *r, PyObject *state)
833
833
index = 0 ;
834
834
else if (index > r -> len )
835
835
index = r -> len ; /* exhausted iterator */
836
- r -> index = index ;
836
+ r -> start += index * r -> step ;
837
+ r -> len -= index ;
837
838
Py_RETURN_NONE ;
838
839
}
839
840
@@ -931,13 +932,11 @@ fast_range_iter(long start, long stop, long step)
931
932
return NULL ;
932
933
}
933
934
it -> len = (long )ulen ;
934
- it -> index = 0 ;
935
935
return (PyObject * )it ;
936
936
}
937
937
938
938
typedef struct {
939
939
PyObject_HEAD
940
- PyObject * index ;
941
940
PyObject * start ;
942
941
PyObject * step ;
943
942
PyObject * len ;
@@ -946,7 +945,8 @@ typedef struct {
946
945
static PyObject *
947
946
longrangeiter_len (longrangeiterobject * r , PyObject * no_args )
948
947
{
949
- return PyNumber_Subtract (r -> len , r -> index );
948
+ Py_INCREF (r -> len );
949
+ return r -> len ;
950
950
}
951
951
952
952
static PyObject *
@@ -976,7 +976,7 @@ longrangeiter_reduce(longrangeiterobject *r, PyObject *Py_UNUSED(ignored))
976
976
977
977
/* return the result */
978
978
return Py_BuildValue ("N(N)O" , _PyEval_GetBuiltinId (& PyId_iter ),
979
- range , r -> index );
979
+ range , Py_None );
980
980
}
981
981
982
982
static PyObject *
@@ -999,8 +999,18 @@ longrangeiter_setstate(longrangeiterobject *r, PyObject *state)
999
999
if (cmp > 0 )
1000
1000
state = r -> len ;
1001
1001
}
1002
- Py_INCREF (state );
1003
- Py_XSETREF (r -> index , state );
1002
+ PyObject * new_len = PyNumber_Subtract (r -> len , state );
1003
+ if (new_len == NULL )
1004
+ return NULL ;
1005
+ Py_SETREF (r -> len , new_len );
1006
+ PyObject * product = PyNumber_Multiply (state , r -> step );
1007
+ if (product == NULL )
1008
+ return NULL ;
1009
+ PyObject * new_start = PyNumber_Add (r -> start , product );
1010
+ Py_DECREF (product );
1011
+ if (new_start == NULL )
1012
+ return NULL ;
1013
+ Py_SETREF (r -> start , new_start );
1004
1014
Py_RETURN_NONE ;
1005
1015
}
1006
1016
@@ -1017,7 +1027,6 @@ static PyMethodDef longrangeiter_methods[] = {
1017
1027
static void
1018
1028
longrangeiter_dealloc (longrangeiterobject * r )
1019
1029
{
1020
- Py_XDECREF (r -> index );
1021
1030
Py_XDECREF (r -> start );
1022
1031
Py_XDECREF (r -> step );
1023
1032
Py_XDECREF (r -> len );
@@ -1027,29 +1036,21 @@ longrangeiter_dealloc(longrangeiterobject *r)
1027
1036
static PyObject *
1028
1037
longrangeiter_next (longrangeiterobject * r )
1029
1038
{
1030
- PyObject * product , * new_index , * result ;
1031
- if (PyObject_RichCompareBool (r -> index , r -> len , Py_LT ) != 1 )
1039
+ if (PyObject_RichCompareBool (r -> len , _PyLong_GetZero (), Py_GT ) != 1 )
1032
1040
return NULL ;
1033
1041
1034
- new_index = PyNumber_Add (r -> index , _PyLong_GetOne () );
1035
- if (! new_index )
1042
+ PyObject * new_start = PyNumber_Add (r -> start , r -> step );
1043
+ if (new_start == NULL ) {
1036
1044
return NULL ;
1037
-
1038
- product = PyNumber_Multiply (r -> index , r -> step );
1039
- if (!product ) {
1040
- Py_DECREF (new_index );
1041
- return NULL ;
1042
- }
1043
-
1044
- result = PyNumber_Add (r -> start , product );
1045
- Py_DECREF (product );
1046
- if (result ) {
1047
- Py_SETREF (r -> index , new_index );
1048
1045
}
1049
- else {
1050
- Py_DECREF (new_index );
1046
+ PyObject * new_len = PyNumber_Subtract (r -> len , _PyLong_GetOne ());
1047
+ if (new_len == NULL ) {
1048
+ Py_DECREF (new_start );
1049
+ return NULL ;
1051
1050
}
1052
-
1051
+ PyObject * result = r -> start ;
1052
+ r -> start = new_start ;
1053
+ Py_SETREF (r -> len , new_len );
1053
1054
return result ;
1054
1055
}
1055
1056
@@ -1128,11 +1129,9 @@ range_iter(PyObject *seq)
1128
1129
it -> start = r -> start ;
1129
1130
it -> step = r -> step ;
1130
1131
it -> len = r -> length ;
1131
- it -> index = _PyLong_GetZero ();
1132
1132
Py_INCREF (it -> start );
1133
1133
Py_INCREF (it -> step );
1134
1134
Py_INCREF (it -> len );
1135
- Py_INCREF (it -> index );
1136
1135
return (PyObject * )it ;
1137
1136
}
1138
1137
@@ -1210,7 +1209,7 @@ range_reverse(PyObject *seq, PyObject *Py_UNUSED(ignored))
1210
1209
it = PyObject_New (longrangeiterobject , & PyLongRangeIter_Type );
1211
1210
if (it == NULL )
1212
1211
return NULL ;
1213
- it -> index = it -> start = it -> step = NULL ;
1212
+ it -> start = it -> step = NULL ;
1214
1213
1215
1214
/* start + (len - 1) * step */
1216
1215
it -> len = range -> length ;
@@ -1235,8 +1234,6 @@ range_reverse(PyObject *seq, PyObject *Py_UNUSED(ignored))
1235
1234
if (!it -> step )
1236
1235
goto create_failure ;
1237
1236
1238
- it -> index = _PyLong_GetZero ();
1239
- Py_INCREF (it -> index );
1240
1237
return (PyObject * )it ;
1241
1238
1242
1239
create_failure :
0 commit comments