diff options
author | Armin Rigo <arigo@tunes.org> | 2022-12-04 18:26:29 +0100 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2022-12-04 18:26:29 +0100 |
commit | 97d2ed49cebd47618fa1cee435085a2bdd64fcd3 (patch) | |
tree | 24f91859b92c6e9356c57d64755d276fdcb3551b | |
parent | 5701750b89042b73af15630f4561f0d81f206ce2 (diff) | |
download | cffi-97d2ed49cebd47618fa1cee435085a2bdd64fcd3.tar.gz |
Issue 553
Two missing calls to PyObject_GC_UnTrack()
-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): |