summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2019-07-07 14:35:04 +0200
committerStefan Behnel <stefan_ml@behnel.de>2019-07-07 14:35:04 +0200
commit63a239758fd3c71e45e15d24d0302057bc9317db (patch)
tree16971e8ac4269cae8394526b2ca4e5b3c9c440dc
parentf6f8917bedaa4f34b49f8c02c4a826e108b24010 (diff)
downloadcython-63a239758fd3c71e45e15d24d0302057bc9317db.tar.gz
Fix a reference leak for None when releasing a memoryview object.
Closes GH-3023.
-rw-r--r--Cython/Utility/MemoryView.pyx4
-rw-r--r--tests/memoryview/memoryview.pyx11
2 files changed, 15 insertions, 0 deletions
diff --git a/Cython/Utility/MemoryView.pyx b/Cython/Utility/MemoryView.pyx
index d03fddb86..930c2db70 100644
--- a/Cython/Utility/MemoryView.pyx
+++ b/Cython/Utility/MemoryView.pyx
@@ -372,6 +372,10 @@ cdef class memoryview(object):
def __dealloc__(memoryview self):
if self.obj is not None:
__Pyx_ReleaseBuffer(&self.view)
+ elif (<__pyx_buffer *> &self.view).obj == Py_None:
+ # Undo the incref in __cinit__() above.
+ (<__pyx_buffer *> &self.view).obj = NULL
+ Py_DECREF(Py_None)
cdef int i
global __pyx_memoryview_thread_locks_used
diff --git a/tests/memoryview/memoryview.pyx b/tests/memoryview/memoryview.pyx
index a4ca02230..44402b9e1 100644
--- a/tests/memoryview/memoryview.pyx
+++ b/tests/memoryview/memoryview.pyx
@@ -698,6 +698,17 @@ def assign_temporary_to_object(object[:] mslice):
buf = mslice
buf[1] = {3-2: 2+(2*4)-2}
+
+def test_pyview_of_memview(int[:] ints):
+ """
+ >>> A = IntMockBuffer(None, [1, 2, 3])
+ >>> view = test_pyview_of_memview(A)
+ >>> len(memoryview(view))
+ 3
+ """
+ return ints
+
+
def test_generic_slicing(arg, indirect=False):
"""
Test simple slicing