mirror of
https://github.com/python/cpython
synced 2024-09-16 00:48:28 +00:00
GH-89988: Fix memory leak in pickle.Pickler dispatch_table lookup (GH-94298)
This commit is contained in:
parent
e6391e08bf
commit
01ef1f95da
|
@ -154,6 +154,29 @@ def persistent_id(obj):
|
||||||
return obj
|
return obj
|
||||||
check(PersPickler)
|
check(PersPickler)
|
||||||
|
|
||||||
|
@support.cpython_only
|
||||||
|
def test_custom_pickler_dispatch_table_memleak(self):
|
||||||
|
# See https://github.com/python/cpython/issues/89988
|
||||||
|
|
||||||
|
class Pickler(self.pickler):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.dispatch_table = table
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
class DispatchTable:
|
||||||
|
pass
|
||||||
|
|
||||||
|
table = DispatchTable()
|
||||||
|
pickler = Pickler(io.BytesIO())
|
||||||
|
self.assertIs(pickler.dispatch_table, table)
|
||||||
|
table_ref = weakref.ref(table)
|
||||||
|
self.assertIsNotNone(table_ref())
|
||||||
|
del pickler
|
||||||
|
del table
|
||||||
|
support.gc_collect()
|
||||||
|
self.assertIsNone(table_ref())
|
||||||
|
|
||||||
|
|
||||||
@support.cpython_only
|
@support.cpython_only
|
||||||
def test_unpickler_reference_cycle(self):
|
def test_unpickler_reference_cycle(self):
|
||||||
def check(Unpickler):
|
def check(Unpickler):
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix memory leak in :class:`pickle.Pickler` when looking up :attr:`dispatch_table`. Patch by Kumar Aditya.
|
|
@ -4761,7 +4761,9 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (self->dispatch_table != NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (_PyObject_LookupAttr((PyObject *)self, &_Py_ID(dispatch_table),
|
if (_PyObject_LookupAttr((PyObject *)self, &_Py_ID(dispatch_table),
|
||||||
&self->dispatch_table) < 0) {
|
&self->dispatch_table) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in a new issue