mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
[3.14] gh-132775: Unrevert "Add _PyCode_VerifyStateless()" (gh-133625)
This reverts commit3c73cf5
(gh-133497), which itself reverted the original commitd270bb5
(gh-133221). We reverted the original change due to failing android tests. The checks in _PyCode_CheckNoInternalState() were too strict, so we've relaxed them.
This commit is contained in:
parent
54c3aa1597
commit
c39bc81b70
8 changed files with 359 additions and 38 deletions
|
@ -220,6 +220,7 @@ try:
|
|||
import _testinternalcapi
|
||||
except ModuleNotFoundError:
|
||||
_testinternalcapi = None
|
||||
import test._code_definitions as defs
|
||||
|
||||
COPY_FREE_VARS = opmap['COPY_FREE_VARS']
|
||||
|
||||
|
@ -671,7 +672,6 @@ class CodeTest(unittest.TestCase):
|
|||
VARARGS = CO_FAST_LOCAL | CO_FAST_ARG_VAR | CO_FAST_ARG_POS
|
||||
VARKWARGS = CO_FAST_LOCAL | CO_FAST_ARG_VAR | CO_FAST_ARG_KW
|
||||
|
||||
import test._code_definitions as defs
|
||||
funcs = {
|
||||
defs.spam_minimal: {},
|
||||
defs.spam_with_builtins: {
|
||||
|
@ -897,7 +897,6 @@ class CodeTest(unittest.TestCase):
|
|||
},
|
||||
}
|
||||
|
||||
import test._code_definitions as defs
|
||||
funcs = {
|
||||
defs.spam_minimal: new_var_counts(),
|
||||
defs.spam_with_builtins: new_var_counts(
|
||||
|
@ -1025,42 +1024,35 @@ class CodeTest(unittest.TestCase):
|
|||
counts = _testinternalcapi.get_code_var_counts(func.__code__)
|
||||
self.assertEqual(counts, expected)
|
||||
|
||||
def func_with_globals_and_builtins():
|
||||
mod1 = _testinternalcapi
|
||||
mod2 = dis
|
||||
mods = (mod1, mod2)
|
||||
checks = tuple(callable(m) for m in mods)
|
||||
return callable(mod2), tuple(mods), list(mods), checks
|
||||
|
||||
func = func_with_globals_and_builtins
|
||||
func = defs.spam_with_globals_and_builtins
|
||||
with self.subTest(f'{func} code'):
|
||||
expected = new_var_counts(
|
||||
purelocals=4,
|
||||
globalvars=5,
|
||||
purelocals=5,
|
||||
globalvars=6,
|
||||
)
|
||||
counts = _testinternalcapi.get_code_var_counts(func.__code__)
|
||||
self.assertEqual(counts, expected)
|
||||
|
||||
with self.subTest(f'{func} with own globals and builtins'):
|
||||
expected = new_var_counts(
|
||||
purelocals=4,
|
||||
globalvars=(2, 3),
|
||||
purelocals=5,
|
||||
globalvars=(2, 4),
|
||||
)
|
||||
counts = _testinternalcapi.get_code_var_counts(func)
|
||||
self.assertEqual(counts, expected)
|
||||
|
||||
with self.subTest(f'{func} without globals'):
|
||||
expected = new_var_counts(
|
||||
purelocals=4,
|
||||
globalvars=(0, 3, 2),
|
||||
purelocals=5,
|
||||
globalvars=(0, 4, 2),
|
||||
)
|
||||
counts = _testinternalcapi.get_code_var_counts(func, globalsns={})
|
||||
self.assertEqual(counts, expected)
|
||||
|
||||
with self.subTest(f'{func} without both'):
|
||||
expected = new_var_counts(
|
||||
purelocals=4,
|
||||
globalvars=5,
|
||||
purelocals=5,
|
||||
globalvars=6,
|
||||
)
|
||||
counts = _testinternalcapi.get_code_var_counts(func, globalsns={},
|
||||
builtinsns={})
|
||||
|
@ -1068,12 +1060,34 @@ class CodeTest(unittest.TestCase):
|
|||
|
||||
with self.subTest(f'{func} without builtins'):
|
||||
expected = new_var_counts(
|
||||
purelocals=4,
|
||||
globalvars=(2, 0, 3),
|
||||
purelocals=5,
|
||||
globalvars=(2, 0, 4),
|
||||
)
|
||||
counts = _testinternalcapi.get_code_var_counts(func, builtinsns={})
|
||||
self.assertEqual(counts, expected)
|
||||
|
||||
@unittest.skipIf(_testinternalcapi is None, "missing _testinternalcapi")
|
||||
def test_stateless(self):
|
||||
self.maxDiff = None
|
||||
|
||||
for func in defs.STATELESS_CODE:
|
||||
with self.subTest((func, '(code)')):
|
||||
_testinternalcapi.verify_stateless_code(func.__code__)
|
||||
for func in defs.STATELESS_FUNCTIONS:
|
||||
with self.subTest((func, '(func)')):
|
||||
_testinternalcapi.verify_stateless_code(func)
|
||||
|
||||
for func in defs.FUNCTIONS:
|
||||
if func not in defs.STATELESS_CODE:
|
||||
with self.subTest((func, '(code)')):
|
||||
with self.assertRaises(Exception):
|
||||
_testinternalcapi.verify_stateless_code(func.__code__)
|
||||
|
||||
if func not in defs.STATELESS_FUNCTIONS:
|
||||
with self.subTest((func, '(func)')):
|
||||
with self.assertRaises(Exception):
|
||||
_testinternalcapi.verify_stateless_code(func)
|
||||
|
||||
|
||||
def isinterned(s):
|
||||
return s is sys.intern(('_' + s + '_')[1:-1])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue