[pypy-svn] r7314 - in pypy/trunk/src/pypy/objspace/std: . test

bob at codespeak.net bob at codespeak.net
Wed Nov 17 12:52:15 CET 2004


Author: bob
Date: Wed Nov 17 12:52:15 2004
New Revision: 7314

Modified:
   pypy/trunk/src/pypy/objspace/std/test/test_typeobject.py
   pypy/trunk/src/pypy/objspace/std/typeobject.py
Log:
hackish mro support that seems to work anyway
should look at CPython implementation for more ideas



Modified: pypy/trunk/src/pypy/objspace/std/test/test_typeobject.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/test/test_typeobject.py	(original)
+++ pypy/trunk/src/pypy/objspace/std/test/test_typeobject.py	Wed Nov 17 12:52:15 2004
@@ -98,23 +98,48 @@
         else:
             raise AssertionError, "this multiple inheritance should fail"
 
+    def skip_test_metaclass(self):
+        class OuterMetaClass(type):
+            pass
+
+        class HasOuterMetaclass(object):
+            __metaclass__ = OuterMetaClass
+
+        self.assertEquals(type(HasOuterMetaclass), OuterMetaClass)
+        self.assertEquals(type(HasOuterMetaclass), HasOuterMetaclass.__metaclass__)
+
+        class HasInnerMetaclass(object):
+            class __metaclass__(type):
+                pass
+
+        self.assertEquals(type(HasInnerMetaclass), HasInnerMetaclass.__metaclass__)
+
+        class __metaclass__(type):
+            pass
+
+        class HasImplicitMetaclass:
+            pass
+
+        self.assertEquals(type(HasImplicitMetaclass), __metaclass__)
+
     def test_mro(self):
-        class A(object):
+        class A_mro(object):
             a = 1
 
-        class B(A):
+        class B_mro(A_mro):
             b = 1
             class __metaclass__(type):
                 def mro(self):
                     return [self, object]
 
-        self.assertEquals(B.__bases__, (A,))
-        self.assertEquals(B.__mro__, (B, object))
-        self.assertEquals(B.mro(), [B, object])
-        self.assertEquals(B.b, 1)
-        self.assertEquals(B().b, 1)
-        self.assertEquals(getattr(B, 'a', None), None)
-        self.assertEquals(getattr(B(), 'a', None), None)
+        #self.assertEquals(type(B_mro), B_mro.__metaclass__)
+        self.assertEquals(B_mro.__bases__, (A_mro,))
+        self.assertEquals(B_mro.__mro__, (B_mro, object))
+        self.assertEquals(B_mro.mro(), [B_mro, object])
+        self.assertEquals(B_mro.b, 1)
+        self.assertEquals(B_mro().b, 1)
+        self.assertEquals(getattr(B_mro, 'a', None), None)
+        self.assertEquals(getattr(B_mro(), 'a', None), None)
 
 
 if __name__ == '__main__':

Modified: pypy/trunk/src/pypy/objspace/std/typeobject.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/typeobject.py	(original)
+++ pypy/trunk/src/pypy/objspace/std/typeobject.py	Wed Nov 17 12:52:15 2004
@@ -15,7 +15,9 @@
         w_self.bases_w = bases_w
         w_self.dict_w = dict_w
         w_self.ensure_static__new__()
-        w_self.mro_w = compute_C3_mro(w_self)   # XXX call type(w_self).mro()
+
+        #compute_C3_mro(w_self)   # XXX call type(w_self).mro()
+        w_self.mro_w = compute_C3_mro(w_self)
         if overridetypedef is not None:
             w_self.instancetypedef = overridetypedef
         else:
@@ -31,6 +33,14 @@
             w_self.instancetypedef = instancetypedef
         if forcedict and not w_self.lookup('__dict__'):
             w_self.dict_w['__dict__'] = space.wrap(default_dict_descr)
+        if overridetypedef is None:
+            w_type = space.type(w_self)
+            if not space.is_true(space.is_(w_type, space.w_type)):
+                mro_func = w_type.lookup('mro')
+                mro_func_args = Arguments(space, [w_self])
+                w_mro = space.call_args(mro_func, mro_func_args)
+                w_self.mro_w = space.unpackiterable(w_mro)
+
 
     def ensure_static__new__(w_self):
         # special-case __new__, as in CPython:



More information about the Pypy-commit mailing list