gh-135450: Remove assertion in _PyCode_CheckNoExternalState (gh-135466)

The assertion reflected a misunderstanding of situations where "hidden" variables might exist,
namely generator expressions and comprehensions.
This commit is contained in:
Peter Bierma 2025-06-18 19:31:23 -04:00 committed by GitHub
parent e9b647dd30
commit 15f2bac02c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 16 additions and 1 deletions

View file

@ -944,6 +944,22 @@ class TestInterpreterExec(TestBase):
with self.assertRaisesRegex(InterpreterError, 'unrecognized'):
interp.exec('raise Exception("it worked!")')
def test_list_comprehension(self):
# gh-135450: List comprehensions caused an assertion failure
# in _PyCode_CheckNoExternalState()
import string
r_interp, w_interp = self.pipe()
interp = interpreters.create()
interp.exec(f"""if True:
import os
comp = [str(i) for i in range(10)]
os.write({w_interp}, ''.join(comp).encode())
""")
self.assertEqual(os.read(r_interp, 10).decode(), string.digits)
interp.close()
# test__interpreters covers the remaining
# Interpreter.exec() behavior.

View file

@ -1999,7 +1999,6 @@ _PyCode_CheckNoExternalState(PyCodeObject *co, _PyCode_var_counts_t *counts,
const char **p_errmsg)
{
const char *errmsg = NULL;
assert(counts->locals.hidden.total == 0);
if (counts->numfree > 0) { // It's a closure.
errmsg = "closures not supported";
}