mirror of
https://github.com/python/cpython.git
synced 2026-05-06 04:37:33 -04:00
[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:
committed by
GitHub
parent
4d0ae4cba9
commit
098880de36
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user