@@ -17,6 +17,7 @@ typedef struct {
1717 PyObject * tgtkey ;
1818 PyObject * currkey ;
1919 PyObject * currvalue ;
20+ const void * currgrouper ; /* borrowed reference */
2021} groupbyobject ;
2122
2223static PyTypeObject groupby_type ;
@@ -77,6 +78,7 @@ groupby_next(groupbyobject *gbo)
7778{
7879 PyObject * newvalue , * newkey , * r , * grouper ;
7980
81+ gbo -> currgrouper = NULL ;
8082 /* skip to next iteration group */
8183 for (;;) {
8284 if (gbo -> currkey == NULL )
@@ -255,6 +257,7 @@ _grouper_create(groupbyobject *parent, PyObject *tgtkey)
255257 Py_INCREF (parent );
256258 igo -> tgtkey = tgtkey ;
257259 Py_INCREF (tgtkey );
260+ parent -> currgrouper = igo ; /* borrowed reference */
258261
259262 PyObject_GC_Track (igo );
260263 return (PyObject * )igo ;
@@ -284,6 +287,8 @@ _grouper_next(_grouperobject *igo)
284287 PyObject * newvalue , * newkey , * r ;
285288 int rcmp ;
286289
290+ if (gbo -> currgrouper != igo )
291+ return NULL ;
287292 if (gbo -> currvalue == NULL ) {
288293 newvalue = PyIter_Next (gbo -> it );
289294 if (newvalue == NULL )
@@ -321,6 +326,9 @@ _grouper_next(_grouperobject *igo)
321326static PyObject *
322327_grouper_reduce (_grouperobject * lz )
323328{
329+ if (((groupbyobject * )lz -> parent )-> currgrouper != lz ) {
330+ return Py_BuildValue ("N(())" , _PyObject_GetBuiltin ("iter" ));
331+ }
324332 return Py_BuildValue ("O(OO)" , Py_TYPE (lz ), lz -> parent , lz -> tgtkey );
325333}
326334
0 commit comments