mirror of
https://github.com/python/cpython.git
synced 2025-11-24 20:30:18 +00:00
* gh-138349: Fix crash when combining module-level annotation and listcomp (#138363)
(cherry picked from commit 7a6fd4a45d)
---------
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
parent
38cd031111
commit
3643a26a01
5 changed files with 48 additions and 6 deletions
|
|
@ -279,6 +279,7 @@ Known values:
|
|||
Python 3.14b1 3624 (Don't optimize LOAD_FAST when local is killed by DELETE_FAST)
|
||||
Python 3.14b3 3625 (Fix handling of opcodes that may leave operands on the stack when optimizing LOAD_FAST)
|
||||
Python 3.14rc2 3626 (Fix missing exception handlers in logical expression)
|
||||
Python 3.14rc3 3627 (Fix miscompilation of some module-level annotations)
|
||||
|
||||
Python 3.15 will start with 3650
|
||||
|
||||
|
|
@ -291,7 +292,7 @@ PC/launcher.c must also be updated.
|
|||
|
||||
*/
|
||||
|
||||
#define PYC_MAGIC_NUMBER 3626
|
||||
#define PYC_MAGIC_NUMBER 3627
|
||||
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
|
||||
(little-endian) and then appending b'\r\n'. */
|
||||
#define PYC_MAGIC_NUMBER_TOKEN \
|
||||
|
|
|
|||
|
|
@ -635,7 +635,7 @@ class MagicNumberTests(unittest.TestCase):
|
|||
# stakeholders such as OS package maintainers must be notified
|
||||
# in advance. Such exceptional releases will then require an
|
||||
# adjustment to this test case.
|
||||
EXPECTED_MAGIC_NUMBER = 3626
|
||||
EXPECTED_MAGIC_NUMBER = 3627
|
||||
actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little')
|
||||
|
||||
msg = (
|
||||
|
|
|
|||
|
|
@ -835,3 +835,40 @@ class RegressionTests(unittest.TestCase):
|
|||
genexp = annos["unique_name_2"][0]
|
||||
lamb = list(genexp)[0]
|
||||
self.assertEqual(lamb(), 42)
|
||||
|
||||
# gh-138349
|
||||
def test_module_level_annotation_plus_listcomp(self):
|
||||
cases = [
|
||||
"""
|
||||
def report_error():
|
||||
pass
|
||||
try:
|
||||
[0 for name_2 in unique_name_0 if (lambda: name_2)]
|
||||
except:
|
||||
pass
|
||||
annotated_name: 0
|
||||
""",
|
||||
"""
|
||||
class Generic:
|
||||
pass
|
||||
try:
|
||||
[0 for name_2 in unique_name_0 if (0 for unique_name_1 in unique_name_2 for unique_name_3 in name_2)]
|
||||
except:
|
||||
pass
|
||||
annotated_name: 0
|
||||
""",
|
||||
"""
|
||||
class Generic:
|
||||
pass
|
||||
annotated_name: 0
|
||||
try:
|
||||
[0 for name_2 in [[0]] for unique_name_1 in unique_name_2 if (lambda: name_2)]
|
||||
except:
|
||||
pass
|
||||
""",
|
||||
]
|
||||
for code in cases:
|
||||
with self.subTest(code=code):
|
||||
mod = build_module(code)
|
||||
annos = mod.__annotations__
|
||||
self.assertEqual(annos, {"annotated_name": 0})
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Fix crash in certain cases where a module contains both a module-level
|
||||
annotation and a comprehension.
|
||||
|
|
@ -5500,10 +5500,12 @@ codegen_annassign(compiler *c, stmt_ty s)
|
|||
RETURN_IF_ERROR(_PyCompile_AddDeferredAnnotation(
|
||||
c, s, &conditional_annotation_index));
|
||||
if (conditional_annotation_index != NULL) {
|
||||
ADDOP_NAME(
|
||||
c, loc,
|
||||
SCOPE_TYPE(c) == COMPILE_SCOPE_CLASS ? LOAD_DEREF : LOAD_NAME,
|
||||
&_Py_ID(__conditional_annotations__), cellvars);
|
||||
if (SCOPE_TYPE(c) == COMPILE_SCOPE_CLASS) {
|
||||
ADDOP_NAME(c, loc, LOAD_DEREF, &_Py_ID(__conditional_annotations__), cellvars);
|
||||
}
|
||||
else {
|
||||
ADDOP_NAME(c, loc, LOAD_NAME, &_Py_ID(__conditional_annotations__), names);
|
||||
}
|
||||
ADDOP_LOAD_CONST_NEW(c, loc, conditional_annotation_index);
|
||||
ADDOP_I(c, loc, SET_ADD, 1);
|
||||
ADDOP(c, loc, POP_TOP);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue