From 75eff109ba824b6d34c2bb8461b767916cd2c0f5 Mon Sep 17 00:00:00 2001 From: HyeockJinKim Date: Wed, 9 Oct 2019 01:06:44 +0900 Subject: [PATCH 1/2] Fixed to return the mro function Fixed to return the mro function to include its own class Fixes #1490 --- vm/src/obj/objtype.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vm/src/obj/objtype.rs b/vm/src/obj/objtype.rs index 3eb6ac4984..b026b0dd76 100644 --- a/vm/src/obj/objtype.rs +++ b/vm/src/obj/objtype.rs @@ -220,8 +220,9 @@ impl PyClassRef { } fn type_mro(cls: PyClassRef, vm: &VirtualMachine) -> PyObjectRef { - vm.ctx - .new_list(cls.mro.iter().map(|x| x.clone().into_object()).collect()) + let mut mro = vec![cls.clone().into_object()]; + mro.extend(cls.mro.iter().map(|x| x.clone().into_object())); + vm.ctx.new_list(mro) } /* From 594c3bb97eb9920fbd97a961a84a8d8fe2f1db79 Mon Sep 17 00:00:00 2001 From: HyeockJinKim Date: Wed, 9 Oct 2019 01:21:01 +0900 Subject: [PATCH 2/2] Add tests for mro --- tests/snippets/types_snippet.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/snippets/types_snippet.py b/tests/snippets/types_snippet.py index 3500f523fd..230c2eba29 100644 --- a/tests/snippets/types_snippet.py +++ b/tests/snippets/types_snippet.py @@ -61,3 +61,28 @@ class D(B, C): pass assert type in object.__subclasses__() assert cls.__name__ == 'Cls' + +# mro +assert int.mro() == [int, object] +assert bool.mro() == [bool, int, object] +assert object.mro() == [object] + +class A: + pass + +class B(A): + pass + +assert A.mro() == [A, object] +assert B.mro() == [B, A, object] + +class AA: + pass + +class BB(AA): + pass + +class C(B, BB): + pass + +assert C.mro() == [C, B, A, BB, AA, object]