gh-156091: Fix crash compiling deeply nested inlined comprehensions (… · python/cpython@14a93f4

GitHub

@@ -551,6 +551,7 @@ codegen_unwind_fblock(compiler *c, location *ploc,

551551caseCOMPILE_FBLOCK_EXCEPTION_HANDLER:

552552caseCOMPILE_FBLOCK_EXCEPTION_GROUP_HANDLER:

553553caseCOMPILE_FBLOCK_ASYNC_COMPREHENSION_GENERATOR:

554+caseCOMPILE_FBLOCK_INLINED_COMPREHENSION:

554555caseCOMPILE_FBLOCK_STOP_ITERATION:

555556returnSUCCESS;

556557@@ -4976,8 +4977,11 @@ codegen_push_inlined_comprehension_locals(compiler *c, location loc,

49764977NEW_JUMP_TARGET_LABEL(c, cleanup);

49774978state->cleanup=cleanup;

497849794979-// no need to push an fblock for this "virtual" try/finally; there can't

4980-// be return/continue/break inside a comprehension

4980+// Count against CO_MAXBLOCKS: SETUP_FINALLY consumes an except-stack

4981+// slot even though return/continue/break cannot appear here.

4982+RETURN_IF_ERROR(_PyCompile_PushFBlock(

4983+c, loc, COMPILE_FBLOCK_INLINED_COMPREHENSION,

4984+cleanup, NO_LABEL, NULL));

49814985ADDOP_JUMP(c, loc, SETUP_FINALLY, cleanup);

49824986 }

49834987returnSUCCESS;

@@ -5023,6 +5027,8 @@ codegen_pop_inlined_comprehension_locals(compiler *c, location loc,

50235027{

50245028if (state->pushed_locals) {

50255029ADDOP(c, NO_LOCATION, POP_BLOCK);

5030+_PyCompile_PopFBlock(c, COMPILE_FBLOCK_INLINED_COMPREHENSION,

5031+state->cleanup);

5026503250275033NEW_JUMP_TARGET_LABEL(c, end);

50285034ADDOP_JUMP(c, NO_LOCATION, JUMP_NO_INTERRUPT, end);