[py] take a copy for the last source block when iterating
authorPaul Brossier <piem@piem.org>
Sun, 23 Dec 2018 04:46:47 +0000 (05:46 +0100)
committerPaul Brossier <piem@piem.org>
Sun, 23 Dec 2018 04:46:47 +0000 (05:46 +0100)
Appears to be the simplest solution to prevent resizing internal objects.
See also 8e76c71.

python/ext/py-source.c

index d3c28e8..3ef4eb4 100644 (file)
@@ -581,7 +581,10 @@ static PyObject* Pyaubio_source_iter_next(Py_source *self) {
       return vec;
     } else if (PyLong_AsLong(size) > 0) {
       // short read, return a shorter array
-      PyArrayObject *shortread = (PyArrayObject*)PyTuple_GetItem(done, 0);
+      PyObject *vec = PyTuple_GetItem(done, 0);
+      // take a copy to prevent resizing internal arrays
+      PyArrayObject *shortread = PyArray_FROM_OTF(vec, NPY_NOTYPE,
+          NPY_ARRAY_ENSURECOPY);
       PyArray_Dims newdims;
       PyObject *reshaped;
       newdims.len = PyArray_NDIM(shortread);
@@ -594,6 +597,7 @@ static PyObject* Pyaubio_source_iter_next(Py_source *self) {
       }
       reshaped = PyArray_Newshape(shortread, &newdims, NPY_CORDER);
       Py_DECREF(shortread);
+      Py_DECREF(vec);
       return reshaped;
     } else {
       PyErr_SetNone(PyExc_StopIteration);