mirror of
https://github.com/python/cpython.git
synced 2025-11-07 17:12:03 +00:00
GH-135552: Make the GC clear weakrefs later (GH-136189)
Fix a bug caused by the garbage collector clearing weakrefs too early. The weakrefs in the ``tp_subclasses`` dictionary are needed in order to correctly invalidate type caches (for example, by calling ``PyType_Modified()``). Clearing weakrefs before calling finalizers causes the caches to not be correctly invalidated. That can cause crashes since the caches can refer to invalid objects. Defer the clearing of weakrefs without callbacks until after finalizers are executed.
This commit is contained in:
parent
deb385a143
commit
350c58ba4e
9 changed files with 317 additions and 140 deletions
|
|
@ -808,7 +808,12 @@ def test_closefd_attr(self):
|
|||
def test_garbage_collection(self):
|
||||
# FileIO objects are collected, and collecting them flushes
|
||||
# all data to disk.
|
||||
with warnings_helper.check_warnings(('', ResourceWarning)):
|
||||
#
|
||||
# Note that using warnings_helper.check_warnings() will keep the
|
||||
# file alive due to the `source` argument to warn(). So, use
|
||||
# catch_warnings() instead.
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", ResourceWarning)
|
||||
f = self.FileIO(os_helper.TESTFN, "wb")
|
||||
f.write(b"abcxxx")
|
||||
f.f = f
|
||||
|
|
@ -1809,7 +1814,11 @@ def test_garbage_collection(self):
|
|||
# C BufferedReader objects are collected.
|
||||
# The Python version has __del__, so it ends into gc.garbage instead
|
||||
self.addCleanup(os_helper.unlink, os_helper.TESTFN)
|
||||
with warnings_helper.check_warnings(('', ResourceWarning)):
|
||||
# Note that using warnings_helper.check_warnings() will keep the
|
||||
# file alive due to the `source` argument to warn(). So, use
|
||||
# catch_warnings() instead.
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", ResourceWarning)
|
||||
rawio = self.FileIO(os_helper.TESTFN, "w+b")
|
||||
f = self.tp(rawio)
|
||||
f.f = f
|
||||
|
|
@ -2158,7 +2167,11 @@ def test_garbage_collection(self):
|
|||
# all data to disk.
|
||||
# The Python version has __del__, so it ends into gc.garbage instead
|
||||
self.addCleanup(os_helper.unlink, os_helper.TESTFN)
|
||||
with warnings_helper.check_warnings(('', ResourceWarning)):
|
||||
# Note that using warnings_helper.check_warnings() will keep the
|
||||
# file alive due to the `source` argument to warn(). So, use
|
||||
# catch_warnings() instead.
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", ResourceWarning)
|
||||
rawio = self.FileIO(os_helper.TESTFN, "w+b")
|
||||
f = self.tp(rawio)
|
||||
f.write(b"123xxx")
|
||||
|
|
@ -4080,7 +4093,8 @@ def test_garbage_collection(self):
|
|||
# C TextIOWrapper objects are collected, and collecting them flushes
|
||||
# all data to disk.
|
||||
# The Python version has __del__, so it ends in gc.garbage instead.
|
||||
with warnings_helper.check_warnings(('', ResourceWarning)):
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", ResourceWarning)
|
||||
rawio = self.FileIO(os_helper.TESTFN, "wb")
|
||||
b = self.BufferedWriter(rawio)
|
||||
t = self.TextIOWrapper(b, encoding="ascii")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue