diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2014-03-02 09:27:43 +0100 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2014-03-02 09:27:43 +0100 |
commit | 095a289af9913efbdb76f31c3c5484464b271b16 (patch) | |
tree | 3ae0f8e4104931cd6bb8389db24ef40b0a6a74f7 | |
parent | d8898626836c75a023ceeb03589606513fa1d907 (diff) | |
download | cython-095a289af9913efbdb76f31c3c5484464b271b16.tar.gz |
fix memory leak in exception case
-rw-r--r-- | Cython/Utility/MemoryView.pyx | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/Cython/Utility/MemoryView.pyx b/Cython/Utility/MemoryView.pyx index 5629440dc..0fca758f0 100644 --- a/Cython/Utility/MemoryView.pyx +++ b/Cython/Utility/MemoryView.pyx @@ -412,22 +412,20 @@ cdef class memoryview(object): else: item = <void *> array - if self.dtype_is_object: - (<PyObject **> item)[0] = <PyObject *> value - else: - try: + try: + if self.dtype_is_object: + (<PyObject **> item)[0] = <PyObject *> value + else: self.assign_item_from_object(<char *> item, value) - except: - free(tmp) - raise - - # It would be easy to support indirect dimensions, but it's easier - # to disallow :) - if self.view.suboffsets != NULL: - assert_direct_dimensions(self.view.suboffsets, self.view.ndim) - slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, - item, self.dtype_is_object) - free(tmp) + + # It would be easy to support indirect dimensions, but it's easier + # to disallow :) + if self.view.suboffsets != NULL: + assert_direct_dimensions(self.view.suboffsets, self.view.ndim) + slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, + item, self.dtype_is_object) + finally: + free(tmp) cdef setitem_indexed(self, index, value): cdef char *itemp = self.get_item_pointer(index) |