[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