[pypy-svn] r57079 - in pypy/branch/isinstance-refactor/pypy/module/__builtin__: . test

arigo at codespeak.net arigo at codespeak.net
Thu Aug 7 19:14:04 CEST 2008


Author: arigo
Date: Thu Aug  7 19:13:58 2008
New Revision: 57079

Modified:
   pypy/branch/isinstance-refactor/pypy/module/__builtin__/interp_classobj.py
   pypy/branch/isinstance-refactor/pypy/module/__builtin__/test/test_classobj.py
Log:
Logic for subclass detection in old-style classes.


Modified: pypy/branch/isinstance-refactor/pypy/module/__builtin__/interp_classobj.py
==============================================================================
--- pypy/branch/isinstance-refactor/pypy/module/__builtin__/interp_classobj.py	(original)
+++ pypy/branch/isinstance-refactor/pypy/module/__builtin__/interp_classobj.py	Thu Aug  7 19:13:58 2008
@@ -85,6 +85,16 @@
                                      space.wrap("__bases__ items must be classes"))
         self.bases_w = bases_w
 
+    def is_subclass_of(self, other):
+        assert isinstance(other, W_ClassObject)
+        if self is other:
+            return True
+        for base in self.bases_w:
+            assert isinstance(base, W_ClassObject)
+            if base.is_subclass_of(other):
+                return True
+        return False
+
     def lookup(self, space, w_attr):
         # returns w_value or interplevel None
         w_result = space.finditem(self.w_dict, w_attr)

Modified: pypy/branch/isinstance-refactor/pypy/module/__builtin__/test/test_classobj.py
==============================================================================
--- pypy/branch/isinstance-refactor/pypy/module/__builtin__/test/test_classobj.py	(original)
+++ pypy/branch/isinstance-refactor/pypy/module/__builtin__/test/test_classobj.py	Thu Aug  7 19:13:58 2008
@@ -15,6 +15,35 @@
         assert a.__class__ is A
         assert a.__dict__ == {'b': 2}
 
+    def test_isinstance(self):
+        class A:
+            pass
+        class B(A):
+            pass
+        class C(A):
+            pass
+        assert isinstance(B(), A)
+        assert isinstance(B(), B)
+        assert not isinstance(B(), C)
+        assert not isinstance(A(), B)
+        assert isinstance(B(), (A, C))
+        assert isinstance(B(), (C, (), (C, B)))
+        assert not isinstance(B(), ())
+
+    def test_issubclass(self):
+        class A:
+            pass
+        class B(A):
+            pass
+        class C(A):
+            pass
+        assert issubclass(A, A)
+        assert not issubclass(A, B)
+        assert not issubclass(A, C)
+        assert issubclass(B, A)
+        assert issubclass(B, B)
+        assert not issubclass(B, C)
+
     def test_mutate_class_special(self):
         class A:
             a = 1



More information about the Pypy-commit mailing list