summaryrefslogtreecommitdiffstats
path: root/Modules/itertoolsmodule.c
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2009-11-01 21:02:38 (GMT)
committerRaymond Hettinger <python@rcn.com>2009-11-01 21:02:38 (GMT)
commita9311a3c50ff7f8469c61f6e3bfac87358e4ac5a (patch)
tree82c88d4cb70cee113fd4f5340bb9295ad56cffee /Modules/itertoolsmodule.c
parent6c4a725a37611fa60efe36f7e85ba8fbeab6dd15 (diff)
downloadcpython-a9311a3c50ff7f8469c61f6e3bfac87358e4ac5a.zip
cpython-a9311a3c50ff7f8469c61f6e3bfac87358e4ac5a.tar.gz
cpython-a9311a3c50ff7f8469c61f6e3bfac87358e4ac5a.tar.bz2
Fix exception handling in itertools.izip_longest().
Diffstat (limited to 'Modules/itertoolsmodule.c')
-rw-r--r--Modules/itertoolsmodule.c72
1 files changed, 37 insertions, 35 deletions
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 12144d0..1df9782 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -3344,71 +3344,73 @@ zip_longest_traverse(ziplongestobject *lz, visitproc visit, void *arg)
static PyObject *
zip_longest_next(ziplongestobject *lz)
{
- Py_ssize_t i;
- Py_ssize_t tuplesize = lz->tuplesize;
- PyObject *result = lz->result;
- PyObject *it;
- PyObject *item;
- PyObject *olditem;
-
- if (tuplesize == 0)
- return NULL;
+ Py_ssize_t i;
+ Py_ssize_t tuplesize = lz->tuplesize;
+ PyObject *result = lz->result;
+ PyObject *it;
+ PyObject *item;
+ PyObject *olditem;
+
+ if (tuplesize == 0)
+ return NULL;
if (lz->numactive == 0)
return NULL;
- if (Py_REFCNT(result) == 1) {
- Py_INCREF(result);
- for (i=0 ; i < tuplesize ; i++) {
- it = PyTuple_GET_ITEM(lz->ittuple, i);
+ if (Py_REFCNT(result) == 1) {
+ Py_INCREF(result);
+ for (i=0 ; i < tuplesize ; i++) {
+ it = PyTuple_GET_ITEM(lz->ittuple, i);
if (it == NULL) {
Py_INCREF(lz->fillvalue);
item = lz->fillvalue;
} else {
- item = (*Py_TYPE(it)->tp_iternext)(it);
+ item = PyIter_Next(it);
if (item == NULL) {
- lz->numactive -= 1;
- if (lz->numactive == 0) {
+ lz->numactive -= 1;
+ if (lz->numactive == 0 || PyErr_Occurred()) {
+ lz->numactive = 0;
Py_DECREF(result);
return NULL;
} else {
Py_INCREF(lz->fillvalue);
- item = lz->fillvalue;
+ item = lz->fillvalue;
PyTuple_SET_ITEM(lz->ittuple, i, NULL);
Py_DECREF(it);
}
}
}
- olditem = PyTuple_GET_ITEM(result, i);
- PyTuple_SET_ITEM(result, i, item);
- Py_DECREF(olditem);
- }
- } else {
- result = PyTuple_New(tuplesize);
- if (result == NULL)
- return NULL;
- for (i=0 ; i < tuplesize ; i++) {
- it = PyTuple_GET_ITEM(lz->ittuple, i);
+ olditem = PyTuple_GET_ITEM(result, i);
+ PyTuple_SET_ITEM(result, i, item);
+ Py_DECREF(olditem);
+ }
+ } else {
+ result = PyTuple_New(tuplesize);
+ if (result == NULL)
+ return NULL;
+ for (i=0 ; i < tuplesize ; i++) {
+ it = PyTuple_GET_ITEM(lz->ittuple, i);
if (it == NULL) {
Py_INCREF(lz->fillvalue);
item = lz->fillvalue;
} else {
- item = (*Py_TYPE(it)->tp_iternext)(it);
+ item = PyIter_Next(it);
if (item == NULL) {
- lz->numactive -= 1;
- if (lz->numactive == 0) {
+ lz->numactive -= 1;
+ if (lz->numactive == 0 || PyErr_Occurred()) {
+ lz->numactive = 0;
Py_DECREF(result);
return NULL;
} else {
Py_INCREF(lz->fillvalue);
- item = lz->fillvalue;
+ item = lz->fillvalue;
PyTuple_SET_ITEM(lz->ittuple, i, NULL);
Py_DECREF(it);
}
}
}
- PyTuple_SET_ITEM(result, i, item);
- }
- }
- return result;
+ PyTuple_SET_ITEM(result, i, item);
+ }
+ }
+ return result;
}
PyDoc_STRVAR(zip_longest_doc,