[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