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

arigo at codespeak.net arigo at codespeak.net
Wed Apr 27 17:53:43 CEST 2005


Author: arigo
Date: Wed Apr 27 17:53:43 2005
New Revision: 11532

Modified:
   pypy/dist/pypy/objspace/std/test/test_typeobject.py
   pypy/dist/pypy/objspace/std/typeobject.py
Log:
Made the app-level abstract_mro() sufficiently RPythonic.
This prevented new-style classes from inheriting from old-style ones (added a 
test for that).



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	Wed Apr 27 17:53:43 2005
@@ -155,6 +155,15 @@
         assert getattr(B_mro, 'a', None) == None
         assert getattr(B_mro(), 'a', None) == None
 
+    def test_abstract_mro(self):
+        class A1:
+            __metaclass__ = _classobj
+        class A2(A1):
+            pass
+        class A3(A2, object):
+            __metaclass__ = type
+        assert A3.__mro__ == (A3, A2, A1, object)
+
     def test_nodoc(self):
         class NoDoc(object):
             pass

Modified: pypy/dist/pypy/objspace/std/typeobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/typeobject.py	(original)
+++ pypy/dist/pypy/objspace/std/typeobject.py	Wed Apr 27 17:53:43 2005
@@ -282,14 +282,13 @@
 abstract_mro = gateway.applevel("""
     def abstract_mro(klass):
         # abstract/classic mro
-        mro = []
-        def fill_mro(klass):
-            if klass not in mro:
-                mro.append(klass)
-            assert isinstance(klass.__bases__, tuple)
+        mro = [klass]
+        for klass in mro:
+            if not isinstance(klass.__bases__, tuple):
+                raise TypeError, '__bases__ must be a tuple'
             for base in klass.__bases__:
-                fill_mro(base)
-        fill_mro(klass)
+                if base not in mro:
+                    mro.append(base)
         return mro
 """, filename=__file__).interphook("abstract_mro")
 



More information about the Pypy-commit mailing list