]> granicus.if.org Git - python/commitdiff
Manual py3k backport: [svn r74155] Issue #6242: Fix deallocator of io.StringIO and...
authorAntoine Pitrou <solipsis@pitrou.net>
Sat, 24 Oct 2009 11:59:41 +0000 (11:59 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Sat, 24 Oct 2009 11:59:41 +0000 (11:59 +0000)
Lib/test/test_memoryio.py
Modules/_io/bytesio.c
Modules/_io/stringio.c

index d6bff67d6928f9fe35cf1161d89da742cd9d70d3..8972f79ab9627ec33fd5ace8d0f3984b58f9d22f 100644 (file)
@@ -345,6 +345,13 @@ class MemoryTestMixin:
         self.assertEqual(test1(), buf)
         self.assertEqual(test2(), buf)
 
+    def test_instance_dict_leak(self):
+        # Test case for issue #6242.
+        # This will be caught by regrtest.py -R if this leak.
+        for _ in range(100):
+            memio = self.ioclass()
+            memio.foo = 1
+
 
 class PyBytesIOTest(MemoryTestMixin, MemorySeekTestMixin, unittest.TestCase):
 
index ed2f7cc51d7e0834a52980e7d4b76a87cc3d823a..f477550b868b2f09c57b21f8034cd081bd7deb9c 100644 (file)
@@ -616,11 +616,14 @@ bytesio_close(bytesio *self)
 static void
 bytesio_dealloc(bytesio *self)
 {
+    _PyObject_GC_UNTRACK(self);
     if (self->buf != NULL) {
         PyMem_Free(self->buf);
         self->buf = NULL;
     }
-    Py_TYPE(self)->tp_clear((PyObject *)self);
+    Py_CLEAR(self->dict);
+    if (self->weakreflist != NULL)
+        PyObject_ClearWeakRefs((PyObject *) self);
     Py_TYPE(self)->tp_free(self);
 }
 
@@ -674,7 +677,6 @@ static int
 bytesio_traverse(bytesio *self, visitproc visit, void *arg)
 {
     Py_VISIT(self->dict);
-    Py_VISIT(self->weakreflist);
     return 0;
 }
 
@@ -682,8 +684,6 @@ static int
 bytesio_clear(bytesio *self)
 {
     Py_CLEAR(self->dict);
-    if (self->weakreflist != NULL)
-        PyObject_ClearWeakRefs((PyObject *)self);
     return 0;
 }
 
index ddb081df7229319abafffefdaa7373c25c1adbc9..95180a9e4b9943159f58f3a3267225e454002c02 100644 (file)
@@ -515,11 +515,15 @@ static void
 stringio_dealloc(stringio *self)
 {
     _PyObject_GC_UNTRACK(self);
+    self->ok = 0;
+    if (self->buf) {
+        PyMem_Free(self->buf);
+        self->buf = NULL;
+    }
     Py_CLEAR(self->readnl);
     Py_CLEAR(self->writenl);
     Py_CLEAR(self->decoder);
-    if (self->buf)
-        PyMem_Free(self->buf);
+    Py_CLEAR(self->dict);
     if (self->weakreflist != NULL)
         PyObject_ClearWeakRefs((PyObject *) self);
     Py_TYPE(self)->tp_free(self);