https://github.com/python/cpython/commit/094394a380540eed41842c90a1b489d1382f8866
commit: 094394a380540eed41842c90a1b489d1382f8866
branch: 3.13
author: Tian Gao <[email protected]>
committer: gaogaotiantian <[email protected]>
date: 2025-02-19T17:40:03Z
summary:
[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 ccf17323c218a2fdcf7f4845d3eaa74ebddefa44)
files:
A Misc/NEWS.d/next/Core and
Builtins/2025-02-17-18-59-33.gh-issue-128396.iVtoYY.rst
M Lib/test/test_frame.py
M Objects/frameobject.c
diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py
index 26100fe6e8421a..2f802179cb3f58 100644
--- a/Lib/test/test_frame.py
+++ b/Lib/test/test_frame.py
@@ -298,6 +298,12 @@ def f():
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
diff --git a/Misc/NEWS.d/next/Core and
Builtins/2025-02-17-18-59-33.gh-issue-128396.iVtoYY.rst b/Misc/NEWS.d/next/Core
and Builtins/2025-02-17-18-59-33.gh-issue-128396.iVtoYY.rst
new file mode 100644
index 00000000000000..4382b77f35a86c
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and
Builtins/2025-02-17-18-59-33.gh-issue-128396.iVtoYY.rst
@@ -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.
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 8c596ede70ca3d..d947f655d573ba 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -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) {
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]