From 49ffaea3359cd2354cdd6904397659263fc064df Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Mon, 17 Feb 2025 13:42:02 -0500 Subject: [PATCH 1/4] Fix a crash when inline comprehension has the same local variable as outside scope --- Objects/frameobject.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 8ebcc1a4b5e892..dbeee50fcff090 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) { From 5b6afbbd0e621628e9a52228a49950bab325f77a Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Mon, 17 Feb 2025 13:44:58 -0500 Subject: [PATCH 2/4] Add regression test --- Lib/test/test_frame.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py index 4d086064023488..a6e11f1a5342b6 100644 --- a/Lib/test/test_frame.py +++ b/Lib/test/test_frame.py @@ -346,6 +346,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 From 4758bd1dd16de07ff03dace436b4396ac761a057 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 18:59:35 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025-02-17-18-59-33.gh-issue-128396.iVtoYY.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-02-17-18-59-33.gh-issue-128396.iVtoYY.rst 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..ff9fc340c7abd1 --- /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. From 13142cc1e0b367d4a420d819297a269807bd9dd2 Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Mon, 17 Feb 2025 14:01:07 -0500 Subject: [PATCH 4/4] Fix lint --- .../2025-02-17-18-59-33.gh-issue-128396.iVtoYY.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index ff9fc340c7abd1..4382b77f35a86c 100644 --- 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 @@ -1 +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. +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.