Commit c44eb734 authored by Benjamin Peterson's avatar Benjamin Peterson

merge 3.3 (#22517)

parents c2cfa8dd bbd0a323
...@@ -1567,6 +1567,12 @@ class BufferedRWPairTest(unittest.TestCase): ...@@ -1567,6 +1567,12 @@ class BufferedRWPairTest(unittest.TestCase):
pair = self.tp(SelectableIsAtty(True), SelectableIsAtty(True)) pair = self.tp(SelectableIsAtty(True), SelectableIsAtty(True))
self.assertTrue(pair.isatty()) self.assertTrue(pair.isatty())
def test_weakref_clearing(self):
brw = self.tp(self.MockRawIO(), self.MockRawIO())
ref = weakref.ref(brw)
brw = None
ref = None # Shouldn't segfault.
class CBufferedRWPairTest(BufferedRWPairTest): class CBufferedRWPairTest(BufferedRWPairTest):
tp = io.BufferedRWPair tp = io.BufferedRWPair
......
...@@ -16,6 +16,9 @@ Core and Builtins ...@@ -16,6 +16,9 @@ Core and Builtins
Library Library
------- -------
- Issue #22517: When a io.BufferedRWPair object is deallocated, clear its
weakrefs.
- Issue #22448: Improve canceled timer handles cleanup to prevent - Issue #22448: Improve canceled timer handles cleanup to prevent
unbound memory usage. Patch by Joshua Moore-Oliva. unbound memory usage. Patch by Joshua Moore-Oliva.
......
...@@ -2297,6 +2297,8 @@ static void ...@@ -2297,6 +2297,8 @@ static void
bufferedrwpair_dealloc(rwpair *self) bufferedrwpair_dealloc(rwpair *self)
{ {
_PyObject_GC_UNTRACK(self); _PyObject_GC_UNTRACK(self);
if (self->weakreflist != NULL)
PyObject_ClearWeakRefs((PyObject *)self);
Py_CLEAR(self->reader); Py_CLEAR(self->reader);
Py_CLEAR(self->writer); Py_CLEAR(self->writer);
Py_CLEAR(self->dict); Py_CLEAR(self->dict);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment