https://github.com/python/cpython/commit/e56f86fb6cc7cf14c255d88465e9d51f6e977b4c
commit: e56f86fb6cc7cf14c255d88465e9d51f6e977b4c
branch: main
author: Irit Katriel <[email protected]>
committer: iritkatriel <[email protected]>
date: 2026-09-04T17:15:44Z
summary:
gh-143493: fix cleanup on errors in codegen_comprehension (#156374)
files:
M Python/codegen.c
diff --git a/Python/codegen.c b/Python/codegen.c
index e2ef40b4e30490..88e3aa8648fc58 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -5051,6 +5051,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,
@@ -5089,19 +5121,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 {
@@ -5111,31 +5146,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) {
@@ -5150,7 +5164,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) {
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]