File tree 1 file changed +14
-6
lines changed
1 file changed +14
-6
lines changed Original file line number Diff line number Diff line change 7
7
#include "pycore_modsupport.h" // _PyArg_NoKwnames()
8
8
#include "pycore_range.h"
9
9
#include "pycore_tuple.h" // _PyTuple_ITEMS()
10
+ #include "pycore_pyatomic_ft_wrappers.h"
10
11
11
12
12
13
/* Support objects whose length is > PY_SSIZE_T_MAX.
@@ -813,24 +814,31 @@ PyTypeObject PyRange_Type = {
813
814
in the normal case, but possible for any numeric value.
814
815
*/
815
816
816
-
817
- #include "pycore_pyatomic_ft_wrappers.h"
818
-
819
817
static PyObject *
820
818
rangeiter_next (_PyRangeIterObject * r )
821
819
{
820
+ #ifdef Py_GIL_DISABLED
821
+ uint64_t step = _Py_atomic_load_int64_relaxed (& r -> step );
822
822
do {
823
- long len = _Py_atomic_load_int64_relaxed (& r -> len );
823
+ uint64_t len = _Py_atomic_load_int64_relaxed (& r -> len );
824
824
if (len <= 0 ) {
825
825
return NULL ;
826
826
}
827
- long result = _Py_atomic_load_int64_relaxed (& r -> start );
828
- long step = _Py_atomic_load_int64_relaxed (& r -> step );
827
+ uint64_t result = _Py_atomic_load_int64_relaxed (& r -> start );
829
828
if (_Py_atomic_compare_exchange_int64 (& r -> start , & result , result + step )) {
830
829
_Py_atomic_add_int64 (& r -> len , -1 );
831
830
return PyLong_FromLong (result );
832
831
}
833
832
} while (1 );
833
+ #else
834
+ if (r -> len > 0 ) {
835
+ long result = r -> start ;
836
+ r -> start = result + r -> step ;
837
+ r -> len -- ;
838
+ return PyLong_FromLong (result );
839
+ }
840
+ return NULL ;
841
+ #endif
834
842
}
835
843
836
844
static PyObject *
You can’t perform that action at this time.
0 commit comments