Fixed #261 (iterator must not be incremented while value is used)

This commit is contained in:
Matthias Koefferlein 2019-04-16 23:54:11 +02:00
parent 42cb95188d
commit 0bde41446a
2 changed files with 14 additions and 3 deletions

View File

@ -357,7 +357,18 @@ pya_plain_iterator_next (PyObject *self)
{
PYAIteratorObject *iter = (PYAIteratorObject *) self;
if (! iter->iter || iter->iter->at_end ()) {
if (! iter->iter) {
PyErr_SetNone (PyExc_StopIteration);
return NULL;
}
// increment on first visit
if (! iter->first) {
iter->iter->inc ();
}
iter->first = false;
if (iter->iter->at_end ()) {
PyErr_SetNone (PyExc_StopIteration);
return NULL;
}
@ -369,8 +380,6 @@ pya_plain_iterator_next (PyObject *self)
iter->iter->get (args);
PythonRef obj = pop_arg (*iter->value_type, args, 0, heap);
iter->iter->inc ();
return obj.release ();
}
@ -426,6 +435,7 @@ PYAIteratorObject::create (PyObject *origin, gsi::IterAdaptorAbstractBase *iter,
iter_obj->origin = origin;
iter_obj->iter = iter;
iter_obj->value_type = value_type;
iter_obj->first = true;
}
return iter_obj;
}

View File

@ -101,6 +101,7 @@ struct PYAIteratorObject
static PYAIteratorObject *create (PyObject *origin, gsi::IterAdaptorAbstractBase *iter, const gsi::ArgType *value_type);
PyObject *origin;
bool first;
gsi::IterAdaptorAbstractBase *iter;
const gsi::ArgType *value_type;