diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2019-07-07 14:35:04 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2019-07-07 14:35:04 +0200 |
commit | 63a239758fd3c71e45e15d24d0302057bc9317db (patch) | |
tree | 16971e8ac4269cae8394526b2ca4e5b3c9c440dc | |
parent | f6f8917bedaa4f34b49f8c02c4a826e108b24010 (diff) | |
download | cython-63a239758fd3c71e45e15d24d0302057bc9317db.tar.gz |
Fix a reference leak for None when releasing a memoryview object.
Closes GH-3023.
-rw-r--r-- | Cython/Utility/MemoryView.pyx | 4 | ||||
-rw-r--r-- | tests/memoryview/memoryview.pyx | 11 |
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 |