diff --git a/python/kvikio/kvikio/_lib/arr.pyx b/python/kvikio/kvikio/_lib/arr.pyx index e147dbcf90..19818d7cc0 100644 --- a/python/kvikio/kvikio/_lib/arr.pyx +++ b/python/kvikio/kvikio/_lib/arr.pyx @@ -130,36 +130,37 @@ cdef class Array: self.strides_mv = None else: PyObject_GetBuffer(obj, &pybuf, PyBUF_FULL_RO) - - if pybuf.suboffsets != NULL: - raise NotImplementedError("Suboffsets are not supported") - - self.ptr = pybuf.buf - self.obj = pybuf.obj - self.readonly = pybuf.readonly - self.ndim = pybuf.ndim - self.itemsize = pybuf.itemsize - - if self.ndim > 0: - self.shape_mv = new_Py_ssize_t_array(self.ndim) - memcpy( - &self.shape_mv[0], - pybuf.shape, - self.ndim * sizeof(Py_ssize_t) - ) - if not PyBuffer_IsContiguous(&pybuf, b"C"): - self.strides_mv = new_Py_ssize_t_array(self.ndim) + try: + if pybuf.suboffsets != NULL: + raise NotImplementedError("Suboffsets are not supported") + + self.ptr = pybuf.buf + self.obj = pybuf.obj + self.readonly = pybuf.readonly + self.ndim = pybuf.ndim + self.itemsize = pybuf.itemsize + + if self.ndim > 0: + self.shape_mv = new_Py_ssize_t_array(self.ndim) memcpy( - &self.strides_mv[0], - pybuf.strides, + &self.shape_mv[0], + pybuf.shape, self.ndim * sizeof(Py_ssize_t) ) + if not PyBuffer_IsContiguous(&pybuf, b"C"): + self.strides_mv = new_Py_ssize_t_array(self.ndim) + memcpy( + &self.strides_mv[0], + pybuf.strides, + self.ndim * sizeof(Py_ssize_t) + ) + else: + self.strides_mv = None else: + self.shape_mv = None self.strides_mv = None - else: - self.shape_mv = None - self.strides_mv = None - PyBuffer_Release(&pybuf) + finally: + PyBuffer_Release(&pybuf) cpdef bint _c_contiguous(self): return _c_contiguous(