https://github.com/python/cpython/commit/8b082aa405101ab806433cd4d7305b19397271cf
commit: 8b082aa405101ab806433cd4d7305b19397271cf
branch: main
author: Irit Katriel <[email protected]>
committer: iritkatriel <[email protected]>
date: 2026-08-29T12:22:25Z
summary:
gh-156459: Fix cleanup on error in compiler_set_qualname (#156462)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2026-08-27-13-26-50.gh-issue-156459.Z8Zqik.rst
M Include/internal/pycore_compile.h
M Python/codegen.c
M Python/compile.c
diff --git a/Include/internal/pycore_compile.h
b/Include/internal/pycore_compile.h
index 911cc1f10f15131..7e248429af8eb8a 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 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 7eb96f08c84d7f2..f4cdb17799d3f77 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -687,6 +687,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 2717037a988ec7f..f3852041bce69ca 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;
}
_______________________________________________
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]