From 0bde41446a27a97f71ef0de16c4d45fa8cc7680b Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 16 Apr 2019 23:54:11 +0200 Subject: [PATCH] Fixed #261 (iterator must not be incremented while value is used) --- src/pya/pya/pyaHelpers.cc | 16 +++++++++++++--- src/pya/pya/pyaHelpers.h | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/pya/pya/pyaHelpers.cc b/src/pya/pya/pyaHelpers.cc index 01e4858ac..399c26776 100644 --- a/src/pya/pya/pyaHelpers.cc +++ b/src/pya/pya/pyaHelpers.cc @@ -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; } diff --git a/src/pya/pya/pyaHelpers.h b/src/pya/pya/pyaHelpers.h index 9bfac61c1..e9afa8611 100644 --- a/src/pya/pya/pyaHelpers.h +++ b/src/pya/pya/pyaHelpers.h @@ -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;