mirror of https://github.com/KLayout/klayout.git
Merge pull request #262 from KLayout/issue-261
Fixed #261 (iterator must not be incremented while value is used)
This commit is contained in:
commit
e42b731e41
|
|
@ -357,7 +357,18 @@ pya_plain_iterator_next (PyObject *self)
|
||||||
{
|
{
|
||||||
PYAIteratorObject *iter = (PYAIteratorObject *) 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);
|
PyErr_SetNone (PyExc_StopIteration);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -369,8 +380,6 @@ pya_plain_iterator_next (PyObject *self)
|
||||||
iter->iter->get (args);
|
iter->iter->get (args);
|
||||||
PythonRef obj = pop_arg (*iter->value_type, args, 0, heap);
|
PythonRef obj = pop_arg (*iter->value_type, args, 0, heap);
|
||||||
|
|
||||||
iter->iter->inc ();
|
|
||||||
|
|
||||||
return obj.release ();
|
return obj.release ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -426,6 +435,7 @@ PYAIteratorObject::create (PyObject *origin, gsi::IterAdaptorAbstractBase *iter,
|
||||||
iter_obj->origin = origin;
|
iter_obj->origin = origin;
|
||||||
iter_obj->iter = iter;
|
iter_obj->iter = iter;
|
||||||
iter_obj->value_type = value_type;
|
iter_obj->value_type = value_type;
|
||||||
|
iter_obj->first = true;
|
||||||
}
|
}
|
||||||
return iter_obj;
|
return iter_obj;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ struct PYAIteratorObject
|
||||||
static PYAIteratorObject *create (PyObject *origin, gsi::IterAdaptorAbstractBase *iter, const gsi::ArgType *value_type);
|
static PYAIteratorObject *create (PyObject *origin, gsi::IterAdaptorAbstractBase *iter, const gsi::ArgType *value_type);
|
||||||
|
|
||||||
PyObject *origin;
|
PyObject *origin;
|
||||||
|
bool first;
|
||||||
gsi::IterAdaptorAbstractBase *iter;
|
gsi::IterAdaptorAbstractBase *iter;
|
||||||
const gsi::ArgType *value_type;
|
const gsi::ArgType *value_type;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue