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")) }