From 386cd86aef678a1af180bde89ea389e4f4de92a0 Mon Sep 17 00:00:00 2001 From: youknowdot Date: Sat, 10 Oct 2026 03:41:23 -0700 Subject: [PATCH] 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 --- crates/vm/src/builtins/function.rs | 4 +--- extra_tests/snippets/stdlib_types.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/crates/vm/src/builtins/function.rs b/crates/vm/src/builtins/function.rs index c6c4aaf2b..b0bd5a010 100644 --- a/crates/vm/src/builtins/function.rs +++ b/crates/vm/src/builtins/function.rs @@ -1321,9 +1321,7 @@ impl Constructor for PyFunction { let mut func = Self::new(args.code.clone(), args.globals.clone(), vm)?; // Set function name if provided if let Some(name) = args.name.into_option() { - *func.name.lock() = name.clone(); - // Also update qualname to match the name - *func.qualname.lock() = name; + *func.name.lock() = name; } // Now set additional attributes directly if let Some(closure_tuple) = closure { diff --git a/extra_tests/snippets/stdlib_types.py b/extra_tests/snippets/stdlib_types.py index bffc9f824..892daeb4b 100644 --- a/extra_tests/snippets/stdlib_types.py +++ b/extra_tests/snippets/stdlib_types.py @@ -66,3 +66,18 @@ if sys.implementation.name == "rustpython": deep_alias = list[deep_alias] with assert_raises(RecursionError): hash(deep_alias) + + +# FunctionType preserves the code qualified name when a name is supplied. +def outer(): + def nested(): + pass + + return nested + + +original = outer() +for name in ("renamed", ""): + function = types.FunctionType(original.__code__, globals(), name) + assert function.__name__ == name + assert function.__qualname__ == "outer..nested"