[pypy-svn] r49625 - in pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Tue Dec 11 13:09:27 CET 2007


Author: cfbolz
Date: Tue Dec 11 13:09:27 2007
New Revision: 49625

Modified:
   pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
   pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
Log:
this actually needs to be a __getattribute__, not a __getattr__


Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py	(original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py	Tue Dec 11 13:09:27 2007
@@ -95,7 +95,19 @@
                     return w_result
             return None
 
-    def descr_getattr(self, space, w_attr):
+    def descr_getattribute(self, space, w_attr):
+        try:
+            name = space.str_w(w_attr)
+        except OperationError, e:
+            if not e.match(space, space.w_TypeError):
+                raise
+        else:
+            if name == "__dict__":
+                return self.w_dict
+            elif name == "__name__":
+                return self.w_name
+            elif name == "__bases__":
+                return self.w_bases
         w_value = self.lookup(space, w_attr)
         if w_value is None:
             raise OperationError(
@@ -133,7 +145,7 @@
                                W_ClassObject.fset_bases),
     __call__ = interp2app(W_ClassObject.descr_call,
                           unwrap_spec=['self', ObjSpace, Arguments]),
-    __getattr__ = interp2app(W_ClassObject.descr_getattr,
+    __getattribute__ = interp2app(W_ClassObject.descr_getattribute,
                              unwrap_spec=['self', ObjSpace, W_Root]),
 )
 W_ClassObject.typedef.acceptable_as_base_class = False

Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py	(original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py	Tue Dec 11 13:09:27 2007
@@ -82,3 +82,16 @@
         assert B.af(b) == 3
         assert B.bf(b) == 2
         assert B.cf(b) == 4
+
+    def test_inheritance_unbound_method(self):
+        class A:
+            __metaclass__ = nclassobj
+            def f(self):
+                return 1
+        raises(TypeError, A.f, 1)
+        assert A.f(A()) == 1
+        class B(A):
+            pass
+        raises(TypeError, B.f, 1)
+        raises(TypeError, B.f, A())
+        assert B.f(B()) == 1



More information about the Pypy-commit mailing list