mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-29 03:04:38 +08:00
Update test_baseexception.py from cpython 3.11.2
This commit is contained in:
1 parent
4e19be7e43
commit
a7b8768e56
1 file changed
+29
-3
Vendored
+29
-3
@@ -28,8 +28,9 @@ class ExceptionClassTests(unittest.TestCase):
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
inheritance_tree = open(os.path.join(os.path.split(__file__)[0],
|
||||
'exception_hierarchy.txt'))
|
||||
inheritance_tree = open(
|
||||
os.path.join(os.path.split(__file__)[0], 'exception_hierarchy.txt'),
|
||||
encoding="utf-8")
|
||||
try:
|
||||
superclass_name = inheritance_tree.readline().rstrip()
|
||||
try:
|
||||
@@ -43,7 +44,7 @@ class ExceptionClassTests(unittest.TestCase):
|
||||
last_depth = 0
|
||||
for exc_line in inheritance_tree:
|
||||
exc_line = exc_line.rstrip()
|
||||
depth = exc_line.rindex('-')
|
||||
depth = exc_line.rindex('─')
|
||||
exc_name = exc_line[depth+2:] # Slice past space
|
||||
if '(' in exc_name:
|
||||
paren_index = exc_name.index('(')
|
||||
@@ -117,6 +118,31 @@ class ExceptionClassTests(unittest.TestCase):
|
||||
[repr(exc), exc.__class__.__name__ + '()'])
|
||||
self.interface_test_driver(results)
|
||||
|
||||
def test_setstate_refcount_no_crash(self):
|
||||
# gh-97591: Acquire strong reference before calling tp_hash slot
|
||||
# in PyObject_SetAttr.
|
||||
import gc
|
||||
d = {}
|
||||
class HashThisKeyWillClearTheDict(str):
|
||||
def __hash__(self) -> int:
|
||||
d.clear()
|
||||
return super().__hash__()
|
||||
class Value(str):
|
||||
pass
|
||||
exc = Exception()
|
||||
|
||||
d[HashThisKeyWillClearTheDict()] = Value() # refcount of Value() is 1 now
|
||||
|
||||
# Exception.__setstate__ should aquire a strong reference of key and
|
||||
# value in the dict. Otherwise, Value()'s refcount would go below
|
||||
# zero in the tp_hash call in PyObject_SetAttr(), and it would cause
|
||||
# crash in GC.
|
||||
exc.__setstate__(d) # __hash__() is called again here, clearing the dict.
|
||||
|
||||
# This GC would crash if the refcount of Value() goes below zero.
|
||||
gc.collect()
|
||||
|
||||
|
||||
class UsageTests(unittest.TestCase):
|
||||
|
||||
"""Test usage of exceptions"""
|
||||
|
||||
Reference in new issue
Block a user