diff options
Diffstat (limited to 'source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp')
-rw-r--r-- | source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp index 2906f20be06..18d1b37eb3b 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp @@ -102,8 +102,8 @@ static PyObject *StrokeVertexIterator_iter(BPy_StrokeVertexIterator *self) static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self) { /* Because Freestyle iterators for which it.isEnd() holds true have no valid object - * (referencing it.object in this case leads to a crash), we must check if it.object - * is valid after incrementing, to prevent crashes in Python. + * (they point to the past-the-end element and can't be dereferenced), we have to check + * iterators for validity. * Additionally, the at_start attribute is used to keep Freestyle iterator objects * and Python for loops in sync. */ @@ -115,7 +115,10 @@ static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self) self->sv_it->decrement(); } else { - if (self->sv_it->isEnd()) { + /* if sv_it.isEnd() is true, the iterator can't be incremented. if sv_it.isLast() is true, + * the iterator is currently pointing to the final valid argument. Incrementing it further would + * give a python object that can't be dereferenced. */ + if (self->sv_it->atLast() || self->sv_it->isEnd()) { PyErr_SetNone(PyExc_StopIteration); return NULL; } @@ -123,15 +126,8 @@ static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self) * and don't increment, to keep for-loops in sync */ if (self->at_start) self->at_start = false; - /* after incrementing, check if the iterator is at its end - * exit the loop if it is. not doing so will result in a crash */ - else { + else self->sv_it->increment(); - if (self->sv_it->isEnd()) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - } } StrokeVertex *sv = self->sv_it->operator->(); return BPy_StrokeVertex_from_StrokeVertex(*sv); @@ -194,7 +190,7 @@ static PyObject *StrokeVertexIterator_reversed(BPy_StrokeVertexIterator *self) } static PyMethodDef BPy_StrokeVertexIterator_methods[] = { - {"incremented", (PyCFunction) StrokeVertexIterator_incremented, METH_NOARGS, StrokeVertexIterator_incremented_doc}, + {"incremented", (PyCFunction)StrokeVertexIterator_incremented, METH_NOARGS, StrokeVertexIterator_incremented_doc}, {"decremented", (PyCFunction)StrokeVertexIterator_decremented, METH_NOARGS, StrokeVertexIterator_decremented_doc}, {"reversed", (PyCFunction)StrokeVertexIterator_reversed, METH_NOARGS, StrokeVertexIterator_reversed_doc}, {NULL, NULL, 0, NULL} @@ -239,11 +235,25 @@ static PyObject *StrokeVertexIterator_u_get(BPy_StrokeVertexIterator *self, void return PyFloat_FromDouble(self->sv_it->u()); } +PyDoc_STRVAR(StrokeVertexIterator_at_last_doc, +"True if the interator points to the last valid element.\n" +"For its counterpart (pointing to the first valid element), use it.is_begin.\n" +"\n" +":type: bool"); + +static PyObject *StrokeVertexIterator_at_last_get(BPy_StrokeVertexIterator *self) +{ + return PyBool_from_bool(self->sv_it->atLast()); + +} + static PyGetSetDef BPy_StrokeVertexIterator_getseters[] = { {(char *)"object", (getter)StrokeVertexIterator_object_get, (setter)NULL, (char *)StrokeVertexIterator_object_doc, NULL}, {(char *)"t", (getter)StrokeVertexIterator_t_get, (setter)NULL, (char *)StrokeVertexIterator_t_doc, NULL}, {(char *)"u", (getter)StrokeVertexIterator_u_get, (setter)NULL, (char *)StrokeVertexIterator_u_doc, NULL}, + {(char *)"at_last", (getter)StrokeVertexIterator_at_last_get, (setter)NULL, + (char *)StrokeVertexIterator_at_last_doc, NULL}, {NULL, NULL, NULL, NULL, NULL} /* Sentinel */ }; |