diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h index 911cc1f10f1513..7e248429af8eb8 100644 --- a/Include/internal/pycore_compile.h +++ b/Include/internal/pycore_compile.h @@ -137,6 +137,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 00000000000000..7bf1ab39796098 --- /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 enterred, and this was not +reversed in case of an error. diff --git a/Python/codegen.c b/Python/codegen.c index bedf3b17c52ce4..96555f4c037234 100644 --- a/Python/codegen.c +++ b/Python/codegen.c @@ -683,6 +683,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 fefb2b04b78db8..7bfad525b16915 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -233,13 +233,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); @@ -724,9 +728,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; }