Skip to content

Commit 386cd86

Browse files
authored
Preserve FunctionType qualified names when overriding names (#9032)
Extract the independent Python 3.14-compatible constructor fix from #8954. An explicit name replaces __name__ while __qualname__ remains the code qualified name. Add a focused regression to the existing types snippet. Assisted-by: OpenAI Codex:model identifier unavailable
1 parent 1c7c801 commit 386cd86

2 files changed

Lines changed: 16 additions & 3 deletions

File tree

‎crates/vm/src/builtins/function.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,9 +1321,7 @@ impl Constructor for PyFunction {
13211321
let mut func = Self::new(args.code.clone(), args.globals.clone(), vm)?;
13221322
// Set function name if provided
13231323
if let Some(name) = args.name.into_option() {
1324-
*func.name.lock() = name.clone();
1325-
// Also update qualname to match the name
1326-
*func.qualname.lock() = name;
1324+
*func.name.lock() = name;
13271325
}
13281326
// Now set additional attributes directly
13291327
if let Some(closure_tuple) = closure {

‎extra_tests/snippets/stdlib_types.py‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,18 @@ def _run_missing_type_params_regression():
6666
deep_alias = list[deep_alias]
6767
with assert_raises(RecursionError):
6868
hash(deep_alias)
69+
70+
71+
# FunctionType preserves the code qualified name when a name is supplied.
72+
def outer():
73+
def nested():
74+
pass
75+
76+
return nested
77+
78+
79+
original = outer()
80+
for name in ("renamed", ""):
81+
function = types.FunctionType(original.__code__, globals(), name)
82+
assert function.__name__ == name
83+
assert function.__qualname__ == "outer.<locals>.nested"

0 commit comments

Comments
 (0)