summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2014-03-02 09:27:43 +0100
committerStefan Behnel <stefan_ml@behnel.de>2014-03-02 09:27:43 +0100
commit095a289af9913efbdb76f31c3c5484464b271b16 (patch)
tree3ae0f8e4104931cd6bb8389db24ef40b0a6a74f7
parentd8898626836c75a023ceeb03589606513fa1d907 (diff)
downloadcython-095a289af9913efbdb76f31c3c5484464b271b16.tar.gz
fix memory leak in exception case
-rw-r--r--Cython/Utility/MemoryView.pyx28
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)