From 4890f09c576fc2bb0654c67eecc1ca52a0353c06 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 30 Jul 2021 19:09:48 +0300 Subject: [PATCH] Fixes `type.__module__` issue, refs #2310 (#2763) * Fixes `type.__module__` issue, refs #2310 --- extra_tests/snippets/builtin_type.py | 46 ++++++++++++++++++++++++++++ vm/src/builtins/pytype.rs | 16 ++++++++++ 2 files changed, 62 insertions(+) create mode 100644 extra_tests/snippets/builtin_type.py diff --git a/extra_tests/snippets/builtin_type.py b/extra_tests/snippets/builtin_type.py new file mode 100644 index 000000000..1831d2355 --- /dev/null +++ b/extra_tests/snippets/builtin_type.py @@ -0,0 +1,46 @@ +assert type.__module__ == 'builtins' +assert type.__qualname__ == 'type' +assert type.__name__ == 'type' +assert isinstance(type.__doc__, str) +assert object.__qualname__ == 'object' +assert int.__qualname__ == 'int' + + +class A(type): + pass + + +class B(type): + __module__ = 'b' + __qualname__ = 'BB' + + +class C: + pass + + +class D: + __module__ = 'd' + __qualname__ = 'DD' + + +assert A.__module__ == '__main__' +assert A.__qualname__ == 'A' +assert B.__module__ == 'b' +assert B.__qualname__ == 'BB' +assert C.__module__ == '__main__' +assert C.__qualname__ == 'C' +assert D.__module__ == 'd' +assert D.__qualname__ == 'DD' + + +# Regression to +# https://github.com/RustPython/RustPython/issues/2310 +import builtins +assert builtins.iter.__class__.__module__ == 'builtins' +assert builtins.iter.__class__.__qualname__ == 'builtin_function_or_method' + +assert iter.__class__.__module__ == 'builtins' +assert iter.__class__.__qualname__ == 'builtin_function_or_method' +assert type(iter).__module__ == 'builtins' +assert type(iter).__qualname__ == 'builtin_function_or_method' diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index bfaccec32..9236e572c 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -306,6 +306,14 @@ impl PyType { .read() .get("__qualname__") .cloned() + // We need to exclude this method from going into recursion: + .and_then(|found| { + if found.isinstance(&vm.ctx.types.getset_type) { + None + } else { + Some(found) + } + }) .unwrap_or_else(|| vm.ctx.new_str(self.name.clone())) } @@ -316,6 +324,14 @@ impl PyType { .read() .get("__module__") .cloned() + // We need to exclude this method from going into recursion: + .and_then(|found| { + if found.isinstance(&vm.ctx.types.getset_type) { + None + } else { + Some(found) + } + }) .unwrap_or_else(|| vm.ctx.new_str("builtins")) }