mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #21435: Segfault in gc with cyclic trash
Changed the iteration logic in finalize_garbage() to tolerate objects vanishing from the list as a side effect of executing a finalizer.
This commit is contained in:
parent
c644e7c39f
commit
5fbc7b12f7
3 changed files with 62 additions and 11 deletions
|
@ -580,6 +580,38 @@ class GCTests(unittest.TestCase):
|
|||
# would be damaged, with an empty __dict__.
|
||||
self.assertEqual(x, None)
|
||||
|
||||
def test_bug21435(self):
|
||||
# This is a poor test - its only virtue is that it happened to
|
||||
# segfault on Tim's Windows box before the patch for 21435 was
|
||||
# applied. That's a nasty bug relying on specific pieces of cyclic
|
||||
# trash appearing in exactly the right order in finalize_garbage()'s
|
||||
# input list.
|
||||
# But there's no reliable way to force that order from Python code,
|
||||
# so over time chances are good this test won't really be testing much
|
||||
# of anything anymore. Still, if it blows up, there's _some_
|
||||
# problem ;-)
|
||||
gc.collect()
|
||||
|
||||
class A:
|
||||
pass
|
||||
|
||||
class B:
|
||||
def __init__(self, x):
|
||||
self.x = x
|
||||
|
||||
def __del__(self):
|
||||
self.attr = None
|
||||
|
||||
def do_work():
|
||||
a = A()
|
||||
b = B(A())
|
||||
|
||||
a.attr = b
|
||||
b.attr = a
|
||||
|
||||
do_work()
|
||||
gc.collect() # this blows up (bad C pointer) when it fails
|
||||
|
||||
@cpython_only
|
||||
def test_garbage_at_shutdown(self):
|
||||
import subprocess
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue