diff options
author | Raymond Hettinger <python@rcn.com> | 2009-11-01 20:55:33 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2009-11-01 20:55:33 (GMT) |
commit | fc438518a0a3b471a187f0473b62a0dcaefd539e (patch) | |
tree | 45467853125d73333ccd7752ab80010dc00aa229 /Modules/itertoolsmodule.c | |
parent | cafc22f0b82c93f8e905bb78f0b36c6bcdbd3a60 (diff) | |
download | cpython-fc438518a0a3b471a187f0473b62a0dcaefd539e.zip cpython-fc438518a0a3b471a187f0473b62a0dcaefd539e.tar.gz cpython-fc438518a0a3b471a187f0473b62a0dcaefd539e.tar.bz2 |
Fix exception handling in itertools.izip_longest().
Diffstat (limited to 'Modules/itertoolsmodule.c')
-rw-r--r-- | Modules/itertoolsmodule.c | 72 |
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, |