File tree 1 file changed +17
-12
lines changed
1 file changed +17
-12
lines changed Original file line number Diff line number Diff line change @@ -834,7 +834,7 @@ static PyMethodDef setiter_methods[] = {
834
834
835
835
static PyObject * setiter_iternext (setiterobject * si )
836
836
{
837
- PyObject * key ;
837
+ PyObject * key = NULL ;
838
838
Py_ssize_t i , mask ;
839
839
setentry * entry ;
840
840
PySetObject * so = si -> si_set ;
@@ -843,30 +843,35 @@ static PyObject *setiter_iternext(setiterobject *si)
843
843
return NULL ;
844
844
assert (PyAnySet_Check (so ));
845
845
846
- if (si -> si_used != so -> used ) {
846
+ Py_ssize_t so_used = FT_ATOMIC_LOAD_SSIZE (so -> used );
847
+ Py_ssize_t si_used = FT_ATOMIC_LOAD_SSIZE (si -> si_used );
848
+ if (si_used != so_used ) {
847
849
PyErr_SetString (PyExc_RuntimeError ,
848
850
"Set changed size during iteration" );
849
851
si -> si_used = -1 ; /* Make this state sticky */
850
852
return NULL ;
851
853
}
852
854
855
+ Py_BEGIN_CRITICAL_SECTION (so );
853
856
i = si -> si_pos ;
854
857
assert (i >=0 );
855
858
entry = so -> table ;
856
859
mask = so -> mask ;
857
- while (i <= mask && (entry [i ].key == NULL || entry [i ].key == dummy ))
860
+ while (i <= mask && (entry [i ].key == NULL || entry [i ].key == dummy )) {
858
861
i ++ ;
862
+ }
863
+ if (i <= mask ) {
864
+ key = Py_NewRef (entry [i ].key );
865
+ }
866
+ Py_END_CRITICAL_SECTION ();
859
867
si -> si_pos = i + 1 ;
860
- if (i > mask )
861
- goto fail ;
868
+ if (key == NULL ) {
869
+ si -> si_set = NULL ;
870
+ Py_DECREF (so );
871
+ return NULL ;
872
+ }
862
873
si -> len -- ;
863
- key = entry [i ].key ;
864
- return Py_NewRef (key );
865
-
866
- fail :
867
- si -> si_set = NULL ;
868
- Py_DECREF (so );
869
- return NULL ;
874
+ return key ;
870
875
}
871
876
872
877
PyTypeObject PySetIter_Type = {
You can’t perform that action at this time.
0 commit comments