https://github.com/python/cpython/commit/6295a17865201a207450813afe17e0b22b74c485
commit: 6295a17865201a207450813afe17e0b22b74c485
branch: 3.15
author: Miss Islington (bot) <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-10-10T13:58:08+03:00
summary:

[3.15] gh-156459: Fix cleanup on error in compiler_set_qualname (GH-156462) 
(GH-156574)

(cherry picked from commit 8b082aa405101ab806433cd4d7305b19397271cf)

Co-authored-by: Irit Katriel <[email protected]>

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 8f3effff589666f..4597ae2763ad77a 100644
--- a/Include/internal/pycore_compile.h
+++ b/Include/internal/pycore_compile.h
@@ -138,6 +138,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 5b46bac84c0075e..b2150065ceaaeb1 100644
--- a/Python/codegen.c
+++ b/Python/codegen.c
@@ -684,6 +684,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]

Reply via email to