From 41b06cc20304e4d5a3dbafa0f0498679beb19b9d Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Tue, 25 Aug 2026 17:22:23 +0100 Subject: [PATCH 1/2] fix cleanup on errors in compiler --- Python/codegen.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Python/codegen.c b/Python/codegen.c index bedf3b17c52ce44..f0d1e35dd5036a6 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -5073,19 +5073,22 @@ codegen_comprehension(compiler *c, expr_ty e, int type, if (type == COMP_GENEXP) { /* Insert GET_ITER before RETURN_GENERATOR. https://docs.python.org/3/reference/expressions.html#generator-expressions */ - RETURN_IF_ERROR( - _PyInstructionSequence_InsertInstruction( + if(_PyInstructionSequence_InsertInstruction( INSTR_SEQUENCE(c), 0, - RESUME, RESUME_AT_GEN_EXPR_START, NO_LOCATION)); - RETURN_IF_ERROR( - _PyInstructionSequence_InsertInstruction( + RESUME, RESUME_AT_GEN_EXPR_START, NO_LOCATION) < 0) { + goto error_in_scope; + } + if(_PyInstructionSequence_InsertInstruction( INSTR_SEQUENCE(c), 1, - LOAD_FAST, 0, LOC(outermost->iter))); - RETURN_IF_ERROR( - _PyInstructionSequence_InsertInstruction( + LOAD_FAST, 0, LOC(outermost->iter)) < 0) { + goto error_in_scope; + } + if(_PyInstructionSequence_InsertInstruction( INSTR_SEQUENCE(c), 2, outermost->is_async ? GET_AITER : GET_ITER, - 0, LOC(outermost->iter))); + 0, LOC(outermost->iter)) < 0) { + goto error_in_scope; + } iter_state = ITERATOR_ON_STACK; } else { From 9f47ab67ba94ecc03439aec8284aa17fb8b102f5 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Thu, 27 Aug 2026 23:47:08 +0100 Subject: [PATCH 2/2] fix more stuff --- Python/codegen.c | 59 ++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/Python/codegen.c b/Python/codegen.c index f0d1e35dd5036a6..61e66e86874c622 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -5035,6 +5035,38 @@ pop_inlined_comprehension_state(compiler *c, location loc, return SUCCESS; } +static int +codegen_comprehension_init_container(compiler *c, location loc, int type, + int is_inlined, bool avoid_creation) +{ + int op; + switch (type) { + case COMP_LISTCOMP: + op = BUILD_LIST; + break; + case COMP_SETCOMP: + op = BUILD_SET; + break; + case COMP_DICTCOMP: + op = BUILD_MAP; + break; + default: + PyErr_Format(PyExc_SystemError, + "unknown comprehension type %d", type); + return ERROR; + } + + if (!avoid_creation) { + ADDOP_I(c, loc, op, 0); + if (is_inlined) { + ADDOP_I(c, loc, SWAP, 2); + } + } else { + ADDOP_I(c, loc, COPY, 1); + } + return SUCCESS; +} + static int codegen_comprehension(compiler *c, expr_ty e, int type, identifier name, asdl_comprehension_seq *generators, expr_ty elt, @@ -5098,31 +5130,10 @@ codegen_comprehension(compiler *c, expr_ty e, int type, Py_CLEAR(entry); if (type != COMP_GENEXP) { - int op; - switch (type) { - case COMP_LISTCOMP: - op = BUILD_LIST; - break; - case COMP_SETCOMP: - op = BUILD_SET; - break; - case COMP_DICTCOMP: - op = BUILD_MAP; - break; - default: - PyErr_Format(PyExc_SystemError, - "unknown comprehension type %d", type); + if (codegen_comprehension_init_container( + c, loc, type, is_inlined, avoid_creation) < 0) { goto error_in_scope; } - - if (!avoid_creation) { - ADDOP_I(c, loc, op, 0); - if (is_inlined) { - ADDOP_I(c, loc, SWAP, 2); - } - } else { - ADDOP_I(c, loc, COPY, 1); - } } if (codegen_comprehension_generator(c, loc, generators, 0, 0, elt, val, type, iter_state, avoid_creation) < 0) { @@ -5137,7 +5148,7 @@ codegen_comprehension(compiler *c, expr_ty e, int type, } if (type != COMP_GENEXP) { - ADDOP(c, LOC(e), RETURN_VALUE); + ADDOP_IN_SCOPE(c, LOC(e), RETURN_VALUE); } if (type == COMP_GENEXP) { if (codegen_wrap_in_stopiteration_handler(c) < 0) {