mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
gh-113190: Reenable non-debug interned string cleanup (GH-113601)
This commit is contained in:
parent
b6cb435ac0
commit
3203a74129
5 changed files with 42 additions and 42 deletions
|
|
@ -1,31 +1,27 @@
|
|||
import sys
|
||||
import types
|
||||
import unittest
|
||||
|
||||
# Note: This test file can't import `unittest` since the runtime can't
|
||||
# currently guarantee that it will not leak memory. Doing so will mark
|
||||
# the test as passing but with reference leaks. This can safely import
|
||||
# the `unittest` library once there's a strict guarantee of no leaks
|
||||
# during runtime shutdown.
|
||||
|
||||
# bpo-46417: Test that structseq types used by the sys module are still
|
||||
# valid when Py_Finalize()/Py_Initialize() are called multiple times.
|
||||
class TestStructSeq:
|
||||
class TestStructSeq(unittest.TestCase):
|
||||
# test PyTypeObject members
|
||||
def _check_structseq(self, obj_type):
|
||||
def check_structseq(self, obj_type):
|
||||
# ob_refcnt
|
||||
assert sys.getrefcount(obj_type) > 1
|
||||
self.assertGreaterEqual(sys.getrefcount(obj_type), 1)
|
||||
# tp_base
|
||||
assert issubclass(obj_type, tuple)
|
||||
self.assertTrue(issubclass(obj_type, tuple))
|
||||
# tp_bases
|
||||
assert obj_type.__bases__ == (tuple,)
|
||||
self.assertEqual(obj_type.__bases__, (tuple,))
|
||||
# tp_dict
|
||||
assert isinstance(obj_type.__dict__, types.MappingProxyType)
|
||||
self.assertIsInstance(obj_type.__dict__, types.MappingProxyType)
|
||||
# tp_mro
|
||||
assert obj_type.__mro__ == (obj_type, tuple, object)
|
||||
self.assertEqual(obj_type.__mro__, (obj_type, tuple, object))
|
||||
# tp_name
|
||||
assert isinstance(type.__name__, str)
|
||||
self.assertIsInstance(type.__name__, str)
|
||||
# tp_subclasses
|
||||
assert obj_type.__subclasses__() == []
|
||||
self.assertEqual(obj_type.__subclasses__(), [])
|
||||
|
||||
def test_sys_attrs(self):
|
||||
for attr_name in (
|
||||
|
|
@ -36,23 +32,23 @@ class TestStructSeq:
|
|||
'thread_info', # ThreadInfoType
|
||||
'version_info', # VersionInfoType
|
||||
):
|
||||
attr = getattr(sys, attr_name)
|
||||
self._check_structseq(type(attr))
|
||||
with self.subTest(attr=attr_name):
|
||||
attr = getattr(sys, attr_name)
|
||||
self.check_structseq(type(attr))
|
||||
|
||||
def test_sys_funcs(self):
|
||||
func_names = ['get_asyncgen_hooks'] # AsyncGenHooksType
|
||||
if hasattr(sys, 'getwindowsversion'):
|
||||
func_names.append('getwindowsversion') # WindowsVersionType
|
||||
for func_name in func_names:
|
||||
func = getattr(sys, func_name)
|
||||
obj = func()
|
||||
self._check_structseq(type(obj))
|
||||
with self.subTest(func=func_name):
|
||||
func = getattr(sys, func_name)
|
||||
obj = func()
|
||||
self.check_structseq(type(obj))
|
||||
|
||||
|
||||
try:
|
||||
tests = TestStructSeq()
|
||||
tests.test_sys_attrs()
|
||||
tests.test_sys_funcs()
|
||||
unittest.main()
|
||||
except SystemExit as exc:
|
||||
if exc.args[0] != 0:
|
||||
raise
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue