From c77b966f8a3972f4ec7881340786e154eafea205 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:22:25 +0100 Subject: [PATCH] gh-156459: Fix cleanup on error in compiler_set_qualname (GH-156462) (cherry picked from commit 8b082aa405101ab806433cd4d7305b19397271cf) Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> --- Include/internal/pycore_compile.h | 1 + .../2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst | 3 +++ Python/codegen.c | 1 + Python/compile.c | 11 ++++++----- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h index ed776bbb73a0ee9..5a209be9045f7ce 100644 --- a/Include/internal/pycore_compile.h +++ b/Include/internal/pycore_compile.h @@ -132,6 +132,7 @@ int _PyCompile_EnterScope(struct _PyCompiler *c, identifier name, int scope_type void *key, int lineno, PyObject *private, _PyCompile_CodeUnitMetadata *umd); void _PyCompile_ExitScope(struct _PyCompiler *c); +int _PyCompile_SetQualname(struct _PyCompiler *c); Py_ssize_t _PyCompile_AddConst(struct _PyCompiler *c, PyObject *o); _PyInstructionSequence *_PyCompile_InstrSequence(struct _PyCompiler *c); int _PyCompile_StartAnnotationSetup(struct _PyCompiler *c); diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst new file mode 100644 index 000000000000000..2de2e0e72273c6c --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst @@ -0,0 +1,3 @@ +Fix cleanup on error in ``compiler_set_qualname``. Previously it was called in +``_PyCompile_EnterScope``, after the scope had been entered, and this was not +reversed in case of an error. diff --git a/Python/codegen.c b/Python/codegen.c index 9649bad4b3dd09a..d95d66da1a3f195 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -655,6 +655,7 @@ codegen_enter_scope(compiler *c, identifier name, int scope_type, { RETURN_IF_ERROR( _PyCompile_EnterScope(c, name, scope_type, key, lineno, private, umd)); + RETURN_IF_ERROR_IN_SCOPE(c, _PyCompile_SetQualname(c)); location loc = LOCATION(lineno, lineno, 0, 0); if (scope_type == COMPILE_SCOPE_MODULE) { loc.lineno = 0; diff --git a/Python/compile.c b/Python/compile.c index 6c5ef5329ffc3aa..3ce3bb9dcc879ff 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -226,13 +226,17 @@ _PyCompile_MaybeAddStaticAttributeToClass(compiler *c, expr_ty e) return SUCCESS; } -static int -compiler_set_qualname(compiler *c) +int +_PyCompile_SetQualname(compiler *c) { Py_ssize_t stack_size; struct compiler_unit *u = c->u; PyObject *name, *base; + if (u->u_scope_type == COMPILE_SCOPE_MODULE) { + return SUCCESS; + } + base = NULL; stack_size = PyList_GET_SIZE(c->c_stack); assert(stack_size >= 1); @@ -704,9 +708,6 @@ _PyCompile_EnterScope(compiler *c, identifier name, int scope_type, u->u_private = Py_XNewRef(private); c->u = u; - if (scope_type != COMPILE_SCOPE_MODULE) { - RETURN_IF_ERROR(compiler_set_qualname(c)); - } return SUCCESS; }