[3.13] gh-128396: Fix a crash when inline comprehension has the same … (#130311)

[3.13] gh-128396: Fix a crash when inline comprehension has the same local variable as the outside scope (GH-130235)
(cherry picked from commit ccf17323c2)
This commit is contained in:
Tian Gao 2025-02-19 12:40:03 -05:00 committed by GitHub
parent 5907cd6829
commit 094394a380
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 16 additions and 2 deletions

View file

@ -298,6 +298,12 @@ class TestFrameLocals(unittest.TestCase):
self.assertEqual(x, 2)
self.assertEqual(y, 3)
def test_closure_with_inline_comprehension(self):
lambda: k
k = 1
lst = [locals() for k in [0]]
self.assertEqual(lst[0]['k'], 0)
def test_as_dict(self):
x = 1
y = 2

View file

@ -0,0 +1 @@
Fix a crash that occurs when calling :func:`locals` inside an inline comprehension that uses the same local variable as the outer frame scope where the variable is a free or cell var.

View file

@ -35,8 +35,15 @@ framelocalsproxy_getval(_PyInterpreterFrame *frame, PyCodeObject *co, int i)
if (kind == CO_FAST_FREE || kind & CO_FAST_CELL) {
// The cell was set when the frame was created from
// the function's closure.
assert(PyCell_Check(value));
cell = value;
// GH-128396: With PEP 709, it's possible to have a fast variable in
// an inlined comprehension that has the same name as the cell variable
// in the frame, where the `kind` obtained from frame can not guarantee
// that the variable is a cell.
// If the variable is not a cell, we are okay with it and we can simply
// return the value.
if (PyCell_Check(value)) {
cell = value;
}
}
if (cell != NULL) {