Merge pull request #262 from KLayout/issue-261

Fixed #261 (iterator must not be incremented while value is used)
This commit is contained in:
Matthias Köfferlein 2019-04-17 22:15:36 +02:00 committed by GitHub
commit e42b731e41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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;