diff options
-rw-r--r-- | c/_cffi_backend.c | 2 | ||||
-rw-r--r-- | testing/cffi0/test_ffi_backend.py | 18 |
2 files changed, 20 insertions, 0 deletions
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c index b9618bd..d2dc76c 100644 --- a/c/_cffi_backend.c +++ b/c/_cffi_backend.c @@ -1938,6 +1938,7 @@ static void cdataowninggc_dealloc(CDataObject *cd) static void cdatafrombuf_dealloc(CDataObject *cd) { Py_buffer *view = ((CDataObject_frombuf *)cd)->bufferview; + PyObject_GC_UnTrack(cd); cdata_dealloc(cd); PyBuffer_Release(view); @@ -2043,6 +2044,7 @@ static void cdatagcp_dealloc(CDataObject_gcp *cd) { PyObject *destructor = cd->destructor; PyObject *origobj = cd->origobj; + PyObject_GC_UnTrack(cd); cdata_dealloc((CDataObject *)cd); gcp_finalize(destructor, origobj); diff --git a/testing/cffi0/test_ffi_backend.py b/testing/cffi0/test_ffi_backend.py index 2545d1f..399fb77 100644 --- a/testing/cffi0/test_ffi_backend.py +++ b/testing/cffi0/test_ffi_backend.py @@ -159,6 +159,24 @@ class TestFFI(backend_tests.BackendTests, assert p.bcd == 9999999 assert p.foo.data[3] != 78 # has been overwritten with 9999999 + def test_issue553(self): + import gc, warnings + ffi = FFI(backend=self.Backend()) + p = ffi.new("int *", 123) + with warnings.catch_warnings(record=True) as w: + ffi.gc(p, lambda x: None) + gc.collect() + assert w == [] + + def test_issue553_from_buffer(self): + import gc, warnings + ffi = FFI(backend=self.Backend()) + buf = b"123" + with warnings.catch_warnings(record=True) as w: + ffi.from_buffer(buf) + gc.collect() + assert w == [] + class TestBitfield: def check(self, source, expected_ofs_y, expected_align, expected_size): |