Author: Amaury Forgeot d'Arc <amaur...@gmail.com>
Branch: merge-2.7.2
Changeset: r51645:24cea2c24401
Date: 2012-01-22 14:33 +0100
http://bitbucket.org/pypy/pypy/changeset/24cea2c24401/

Log:    Respect __subclasscheck__ when rebinding a method to a more specific
        class. This change is needed to make OrderedDict() work at all, but
        it may have unexpected performance impact.

diff --git a/pypy/interpreter/function.py b/pypy/interpreter/function.py
--- a/pypy/interpreter/function.py
+++ b/pypy/interpreter/function.py
@@ -497,7 +497,8 @@
             # only allow binding to a more specific class than before
             if (w_cls is not None and
                 not space.is_w(w_cls, space.w_None) and
-                not space.abstract_issubclass_w(w_cls, self.w_class)):
+                not space.is_true(
+                    space.issubtype_allow_override(w_cls, self.w_class))):
                 return space.wrap(self)    # subclass test failed
             else:
                 return descr_function_get(space, self.w_function, w_obj, w_cls)
diff --git a/pypy/objspace/test/test_descroperation.py 
b/pypy/objspace/test/test_descroperation.py
--- a/pypy/objspace/test/test_descroperation.py
+++ b/pypy/objspace/test/test_descroperation.py
@@ -641,6 +641,19 @@
         assert issubclass(B, B)
         assert issubclass(23, B)
 
+    def test_issubclass_and_method(self):
+        class Meta(type):
+            def __subclasscheck__(cls, sub):
+                if sub is Dict:
+                    return True
+        class A:
+            __metaclass__ = Meta
+            def method(self):
+                return 42
+        class Dict:
+            method = A.method
+        assert Dict().method() == 42
+
     def test_truth_of_long(self):
         class X(object):
             def __len__(self): return 1L
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to