]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-135450: Remove assertion in `_PyCode_CheckNoExternalState` (gh-135466)
authorPeter Bierma <zintensitydev@gmail.com>
Wed, 18 Jun 2025 23:31:23 +0000 (19:31 -0400)
committerGitHub <noreply@github.com>
Wed, 18 Jun 2025 23:31:23 +0000 (17:31 -0600)
The assertion reflected a misunderstanding of situations where "hidden" variables might exist,
namely generator expressions and comprehensions.

Lib/test/test_interpreters/test_api.py
Objects/codeobject.c

index 612e8240603f03a8ed428f870864f863633ac3cd..0ee4582b5d1568f553ca2101156a21d87efa4239 100644 (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.
 
index 34b50ef97d544b18f5b29b18e0017cd3a51c75da..3f53d4cfeb20acb90d0b77a005c68be0591b85b1 100644 (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";
     }