summaryrefslogtreecommitdiffstats
path: root/Objects/frameobject.c
diff options
context:
space:
mode:
authorTian Gao <gaogaotiantian@hotmail.com>2025-02-19 17:11:17 (GMT)
committerGitHub <noreply@github.com>2025-02-19 17:11:17 (GMT)
commitccf17323c218a2fdcf7f4845d3eaa74ebddefa44 (patch)
tree7ac99611ee4ba2458137cdf659411bc3d42853bc /Objects/frameobject.c
parent5f00501a940a0fb97870e70066fb301909320388 (diff)
downloadcpython-ccf17323c218a2fdcf7f4845d3eaa74ebddefa44.zip
cpython-ccf17323c218a2fdcf7f4845d3eaa74ebddefa44.tar.gz
cpython-ccf17323c218a2fdcf7f4845d3eaa74ebddefa44.tar.bz2
gh-128396: Fix a crash when inline comprehension has the same local variable as the outside scope (#130235)
Diffstat (limited to 'Objects/frameobject.c')
-rw-r--r--Objects/frameobject.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 8ebcc1a..dbeee50 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -45,8 +45,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) {