From f1c1470bfd9c467477cd748e9c7bfacd1e3a9c47 Mon Sep 17 00:00:00 2001 From: wheevu <101315525+wheevu@users.noreply.github.com> Date: Sat, 28 Mar 2026 16:11:38 +0700 Subject: [PATCH 1/2] type.__new__: preserve caller namespace when reading __qualname__ --- Lib/test/test_descr.py | 1 - crates/vm/src/builtins/type.rs | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 8a31d8ea092..ab2290c96b8 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4987,7 +4987,6 @@ class Inside: self.assertEqual(Y.__qualname__, 'Y') self.assertEqual(Y.Inside.__qualname__, 'Y.Inside') - @unittest.expectedFailure # TODO: RUSTPYTHON def test_qualname_dict(self): ns = {'__qualname__': 'some.name'} tp = type('Foo', (), ns) diff --git a/crates/vm/src/builtins/type.rs b/crates/vm/src/builtins/type.rs index 5f351afca31..e2432f7b3d2 100644 --- a/crates/vm/src/builtins/type.rs +++ b/crates/vm/src/builtins/type.rs @@ -1867,15 +1867,15 @@ impl Constructor for PyType { (metatype, base.to_owned(), bases, base_is_type) }; - let qualname = dict - .pop_item(identifier!(vm, __qualname__).as_object(), vm)? + let mut attributes = dict.to_attributes(vm); + let qualname = attributes + .shift_remove(identifier!(vm, __qualname__)) .map(|obj| downcast_qualname(obj, vm)) .transpose()? .unwrap_or_else(|| { // If __qualname__ is not provided, we can use the name as default name.clone().into_wtf8() }); - let mut attributes = dict.to_attributes(vm); // Check __doc__ for surrogates - raises UnicodeEncodeError during type creation if let Some(doc) = attributes.get(identifier!(vm, __doc__)) From 5bcc7b769c304efca6f33eefddda68a2e7880169 Mon Sep 17 00:00:00 2001 From: wheevu <101315525+wheevu@users.noreply.github.com> Date: Sat, 28 Mar 2026 17:01:15 +0700 Subject: [PATCH 2/2] type.__new__: preserve caller namespace when reading __qualname__ --- crates/vm/src/builtins/type.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/vm/src/builtins/type.rs b/crates/vm/src/builtins/type.rs index e2432f7b3d2..64801a1de5c 100644 --- a/crates/vm/src/builtins/type.rs +++ b/crates/vm/src/builtins/type.rs @@ -1867,9 +1867,8 @@ impl Constructor for PyType { (metatype, base.to_owned(), bases, base_is_type) }; - let mut attributes = dict.to_attributes(vm); - let qualname = attributes - .shift_remove(identifier!(vm, __qualname__)) + let qualname = dict + .get_item_opt(identifier!(vm, __qualname__), vm)? .map(|obj| downcast_qualname(obj, vm)) .transpose()? .unwrap_or_else(|| { @@ -1877,6 +1876,9 @@ impl Constructor for PyType { name.clone().into_wtf8() }); + let mut attributes = dict.to_attributes(vm); + attributes.shift_remove(identifier!(vm, __qualname__)); + // Check __doc__ for surrogates - raises UnicodeEncodeError during type creation if let Some(doc) = attributes.get(identifier!(vm, __doc__)) && let Some(doc_str) = doc.downcast_ref::()