From 6e83108fa821d125e5dc7254a8716334455c89cc Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Fri, 28 Aug 2026 15:14:57 +0100 Subject: [PATCH 1/2] [3.15] gh-156466: fix cleanup on error in codegen_leave_annotations_scope --- Python/codegen.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Python/codegen.c b/Python/codegen.c index 529c1733598e381..46b30aa28bf7403 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -733,10 +733,11 @@ codegen_setup_annotations_scope(compiler *c, location loc, } static int -codegen_leave_annotations_scope(compiler *c, location loc) +codegen_finish_annotations_scope(compiler *c, location loc) { ADDOP_IN_SCOPE(c, loc, RETURN_VALUE); PyCodeObject *co = _PyCompile_OptimizeAndAssemble(c, 1); + _PyCompile_ExitScope(c); if (co == NULL) { return ERROR; } @@ -770,7 +771,6 @@ codegen_leave_annotations_scope(compiler *c, location loc) } Py_SETREF(co->co_localsplusnames, new_names); - _PyCompile_ExitScope(c); int ret = codegen_make_closure(c, loc, co, 0); Py_DECREF(co); RETURN_IF_ERROR(ret); @@ -873,7 +873,7 @@ codegen_process_deferred_annotations(compiler *c, location loc) Py_DECREF(deferred_anno); Py_DECREF(conditional_annotation_indices); - RETURN_IF_ERROR(codegen_leave_annotations_scope(c, loc)); + RETURN_IF_ERROR(codegen_finish_annotations_scope(c, loc)); RETURN_IF_ERROR(codegen_nameop( c, loc, ste->ste_type == ClassBlock ? &_Py_ID(__annotate_func__) : &_Py_ID(__annotate__), @@ -1179,7 +1179,7 @@ codegen_function_annotations(compiler *c, location loc, c, codegen_annotations_in_scope(c, loc, args, returns, &annotations_len) ); ADDOP_I(c, loc, BUILD_MAP, annotations_len); - RETURN_IF_ERROR(codegen_leave_annotations_scope(c, loc)); + RETURN_IF_ERROR(codegen_finish_annotations_scope(c, loc)); return MAKE_FUNCTION_ANNOTATE; } else { From fa93b90a1c0b5b9fa0f4a820916efecd7e7ac1cb Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Fri, 28 Aug 2026 21:21:45 +0100 Subject: [PATCH 2/2] Apply suggestion from @iritkatriel --- Python/codegen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/codegen.c b/Python/codegen.c index 46b30aa28bf7403..7c966c14afbb986 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -1178,7 +1178,7 @@ codegen_function_annotations(compiler *c, location loc, RETURN_IF_ERROR_IN_SCOPE( c, codegen_annotations_in_scope(c, loc, args, returns, &annotations_len) ); - ADDOP_I(c, loc, BUILD_MAP, annotations_len); + ADDOP_I_IN_SCOPE(c, loc, BUILD_MAP, annotations_len); RETURN_IF_ERROR(codegen_finish_annotations_scope(c, loc)); return MAKE_FUNCTION_ANNOTATE; }