https://github.com/python/cpython/commit/8870e267187e2ea14609b24400d7e6180c8188f7
commit: 8870e267187e2ea14609b24400d7e6180c8188f7
branch: 3.15
author: Irit Katriel <[email protected]>
committer: encukou <[email protected]>
date: 2026-10-13T11:51:33+02:00
summary:
[3.15] gh-143493: fix cleanup on errors in codegen_comprehension (GH-156374)
(GH-156962)
files:
M Python/codegen.c
diff --git a/Python/codegen.c b/Python/codegen.c
index cbe8871928ba33..7fb9f1119ec51e 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -4967,6 +4967,34 @@ 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)
+{
+ 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;
+ }
+
+ ADDOP_I(c, loc, op, 0);
+ if (is_inlined) {
+ ADDOP_I(c, loc, SWAP, 2);
+ }
+ return SUCCESS;
+}
+
static int
codegen_comprehension(compiler *c, expr_ty e, int type,
identifier name, asdl_comprehension_seq *generators,
expr_ty elt,
@@ -5005,19 +5033,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 {
@@ -5027,27 +5058,9 @@ 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) <
0) {
goto error_in_scope;
}
-
- ADDOP_I(c, loc, op, 0);
- if (is_inlined) {
- ADDOP_I(c, loc, SWAP, 2);
- }
}
if (codegen_comprehension_generator(c, loc, generators, 0, 0,
elt, val, type, iter_state) < 0) {
@@ -5062,7 +5075,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]