mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +00:00
Issue #12149: Update the method cache after a type's dictionnary gets
cleared by the garbage collector. This fixes a segfault when an instance and its type get caught in a reference cycle, and the instance's deallocator calls one of the methods on the type (e.g. when subclassing IOBase). Diagnosis and patch by Davide Rizzo.
This commit is contained in:
commit
093c8e4bf0
4 changed files with 27 additions and 1 deletions
|
@ -611,7 +611,24 @@ class IOTest(unittest.TestCase):
|
|||
self.assertEqual(rawio.read(2), b"")
|
||||
|
||||
class CIOTest(IOTest):
|
||||
pass
|
||||
|
||||
def test_IOBase_finalize(self):
|
||||
# Issue #12149: segmentation fault on _PyIOBase_finalize when both a
|
||||
# class which inherits IOBase and an object of this class are caught
|
||||
# in a reference cycle and close() is already in the method cache.
|
||||
class MyIO(self.IOBase):
|
||||
def close(self):
|
||||
pass
|
||||
|
||||
# create an instance to populate the method cache
|
||||
MyIO()
|
||||
obj = MyIO()
|
||||
obj.obj = obj
|
||||
wr = weakref.ref(obj)
|
||||
del MyIO
|
||||
del obj
|
||||
support.gc_collect()
|
||||
self.assertTrue(wr() is None, wr)
|
||||
|
||||
class PyIOTest(IOTest):
|
||||
pass
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue