mirror of
https://github.com/python/cpython.git
synced 2025-08-01 07:33:08 +00:00
[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:
parent
5907cd6829
commit
094394a380
3 changed files with 16 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue