summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-09-24 10:36:11 (GMT)
committerGitHub <noreply@github.com>2017-09-24 10:36:11 (GMT)
commitc247caf33f6e6000d828db4762d1cb12edf3cd57 (patch)
tree85caedaba2394380c428839bda687f23dd853e43 /Modules
parent4facdf523aa6967487a9425f124da9661b59fd43 (diff)
downloadcpython-c247caf33f6e6000d828db4762d1cb12edf3cd57.zip
cpython-c247caf33f6e6000d828db4762d1cb12edf3cd57.tar.gz
cpython-c247caf33f6e6000d828db4762d1cb12edf3cd57.tar.bz2
bpo-30346: An iterator produced by the itertools.groupby() iterator (#1569)
now becames exhausted after advancing the groupby iterator.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/itertoolsmodule.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 48e6c35..2ac5ab2 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -17,6 +17,7 @@ typedef struct {
PyObject *tgtkey;
PyObject *currkey;
PyObject *currvalue;
+ const void *currgrouper; /* borrowed reference */
} groupbyobject;
static PyTypeObject groupby_type;
@@ -77,6 +78,7 @@ groupby_next(groupbyobject *gbo)
{
PyObject *newvalue, *newkey, *r, *grouper;
+ gbo->currgrouper = NULL;
/* skip to next iteration group */
for (;;) {
if (gbo->currkey == NULL)
@@ -255,6 +257,7 @@ _grouper_create(groupbyobject *parent, PyObject *tgtkey)
Py_INCREF(parent);
igo->tgtkey = tgtkey;
Py_INCREF(tgtkey);
+ parent->currgrouper = igo; /* borrowed reference */
PyObject_GC_Track(igo);
return (PyObject *)igo;
@@ -284,6 +287,8 @@ _grouper_next(_grouperobject *igo)
PyObject *newvalue, *newkey, *r;
int rcmp;
+ if (gbo->currgrouper != igo)
+ return NULL;
if (gbo->currvalue == NULL) {
newvalue = PyIter_Next(gbo->it);
if (newvalue == NULL)
@@ -321,6 +326,9 @@ _grouper_next(_grouperobject *igo)
static PyObject *
_grouper_reduce(_grouperobject *lz)
{
+ if (((groupbyobject *)lz->parent)->currgrouper != lz) {
+ return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
+ }
return Py_BuildValue("O(OO)", Py_TYPE(lz), lz->parent, lz->tgtkey);
}