[3.14] gh-149122: Fix segfault in compiler when certain builtin functions are passed a coroutine as arg (GH-149138) (#149151)

gh-149122: Fix segfault in compiler when certain builtin functions are passed a coroutine as arg (GH-149138)
(cherry picked from commit 16f292ef4e)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot)
2026-04-29 16:01:45 +02:00
committed by GitHub
parent 4d0ae4cba9
commit 098880de36
3 changed files with 31 additions and 1 deletions
+21
View File
@@ -293,6 +293,27 @@ class BuiltinTest(ComplexesAreIdenticalMixin, unittest.TestCase):
self.assertEqual(overridden_outputs, ['all', 'any', 'tuple'])
def test_builtin_call_async_genexpr_no_crash(self):
async def f_all():
return all(await 2 for _ in [])
async def f_any():
return any(await 2 for _ in [])
async def f_tuple():
return tuple(await 2 for _ in [])
async def f_list():
return list(await 2 for _ in [])
async def f_set():
return set(await 2 for _ in [])
for f in (f_all, f_any, f_tuple, f_list, f_set):
with self.subTest(func=f.__name__):
with self.assertRaises(TypeError):
run_yielding_async_fn(f)
def test_ascii(self):
self.assertEqual(ascii(''), '\'\'')
self.assertEqual(ascii(0), '0')
@@ -0,0 +1,4 @@
Fix a crash in optimized calls to :func:`all`, :func:`any`, :func:`tuple`,
:func:`list`, and :func:`set` with an async generator expression argument
(for example, ``tuple(await x for x in y)``). These calls now correctly raise
``TypeError`` instead of crashing.
+6 -1
View File
@@ -3861,6 +3861,12 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
return 0;
}
expr_ty generator_exp = asdl_seq_GET(args, 0);
PySTEntryObject *generator_entry = _PySymtable_Lookup(SYMTABLE(c), (void *)generator_exp);
if (generator_entry->ste_coroutine) {
return 0;
}
location loc = LOC(func);
int optimized = 0;
@@ -3892,7 +3898,6 @@ maybe_optimize_function_call(compiler *c, expr_ty e, jump_target_label end)
if (const_oparg == CONSTANT_BUILTIN_TUPLE) {
ADDOP_I(c, loc, BUILD_LIST, 0);
}
expr_ty generator_exp = asdl_seq_GET(args, 0);
VISIT(c, expr, generator_exp);
NEW_JUMP_TARGET_LABEL(c, loop);