[pypy-svn] r12293 - in pypy/dist/pypy/objspace/std: . test

arigo at codespeak.net arigo at codespeak.net
Sun May 15 16:15:48 CEST 2005


Author: arigo
Date: Sun May 15 16:15:48 2005
New Revision: 12293

Modified:
   pypy/dist/pypy/objspace/std/test/test_typeobject.py
   pypy/dist/pypy/objspace/std/typeobject.py
Log:
Oups, I broke abstract_mro() in r11532.  Fixed and added a test.


Modified: pypy/dist/pypy/objspace/std/test/test_typeobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_typeobject.py	(original)
+++ pypy/dist/pypy/objspace/std/test/test_typeobject.py	Sun May 15 16:15:48 2005
@@ -158,11 +158,16 @@
     def test_abstract_mro(self):
         class A1:
             __metaclass__ = _classobj
-        class A2(A1):
+        class B1(A1):
             pass
-        class A3(A2, object):
+        class C1(A1):
+            pass
+        class D1(B1, C1):
+            pass
+        class E1(D1, object):
             __metaclass__ = type
-        assert A3.__mro__ == (A3, A2, A1, object)
+        # old-style MRO in the classical part of the parent hierarchy
+        assert E1.__mro__ == (E1, D1, B1, A1, C1, object)
 
     def test_nodoc(self):
         class NoDoc(object):

Modified: pypy/dist/pypy/objspace/std/typeobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/typeobject.py	(original)
+++ pypy/dist/pypy/objspace/std/typeobject.py	Sun May 15 16:15:48 2005
@@ -310,13 +310,15 @@
 abstract_mro = gateway.applevel("""
     def abstract_mro(klass):
         # abstract/classic mro
-        mro = [klass]
-        for klass in mro:
-            if not isinstance(klass.__bases__, tuple):
-                raise TypeError, '__bases__ must be a tuple'
-            for base in klass.__bases__:
-                if base not in mro:
-                    mro.append(base)
+        mro = []
+        stack = [klass]
+        while stack:
+            klass = stack.pop()
+            if klass not in mro:
+                mro.append(klass)
+                if not isinstance(klass.__bases__, tuple):
+                    raise TypeError, '__bases__ must be a tuple'
+                stack += klass.__bases__[::-1]
         return mro
 """, filename=__file__).interphook("abstract_mro")
 



More information about the Pypy-commit mailing list