summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2022-12-04 18:26:29 +0100
committerArmin Rigo <arigo@tunes.org>2022-12-04 18:26:29 +0100
commit97d2ed49cebd47618fa1cee435085a2bdd64fcd3 (patch)
tree24f91859b92c6e9356c57d64755d276fdcb3551b
parent5701750b89042b73af15630f4561f0d81f206ce2 (diff)
downloadcffi-97d2ed49cebd47618fa1cee435085a2bdd64fcd3.tar.gz
Issue 553
Two missing calls to PyObject_GC_UnTrack()
-rw-r--r--c/_cffi_backend.c2
-rw-r--r--testing/cffi0/test_ffi_backend.py18
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):