Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: 
Changeset: r74318:ffce4c795283
Date: 2014-10-31 21:39 +0000
http://bitbucket.org/pypy/pypy/changeset/ffce4c795283/

Log:    Extract is_mixin() function

diff --git a/rpython/annotator/description.py b/rpython/annotator/description.py
--- a/rpython/annotator/description.py
+++ b/rpython/annotator/description.py
@@ -388,6 +388,9 @@
 
             return s_sigs
 
+def is_mixin(cls):
+    return cls.__dict__.get('_mixin_', False)
+
 NODEFAULT = object()
 
 class ClassDesc(Desc):
@@ -414,14 +417,13 @@
         self.specialize = specialize
         self._classdefs = {}
 
-        assert cls.__module__ != '__builtin__'
-        base = object
-        baselist = list(cls.__bases__)
-
-        if cls.__dict__.get('_mixin_', False):
+        if is_mixin(cls):
             raise AnnotatorError("cannot use directly the class %r because "
                                  "it is a _mixin_" % (cls,))
 
+        assert cls.__module__ != '__builtin__'
+        baselist = list(cls.__bases__)
+
         # special case: skip BaseException, and pretend
         # that all exceptions ultimately inherit from Exception instead
         # of BaseException (XXX hack)
@@ -432,10 +434,11 @@
 
         mixins_before = []
         mixins_after = []
+        base = object
         for b1 in baselist:
             if b1 is object:
                 continue
-            if b1.__dict__.get('_mixin_', False):
+            if is_mixin(b1):
                 if base is object:
                     mixins_before.append(b1)
                 else:
@@ -539,7 +542,7 @@
         add(check_not_in)
         #
         for base in reversed(mro):
-            assert base.__dict__.get("_mixin_", False), (
+            assert is_mixin(base), (
                 "Mixin class %r has non mixin base class %r" % (mixins, base))
             for name, value in base.__dict__.items():
                 if name in skip:
diff --git a/rpython/annotator/test/test_description.py 
b/rpython/annotator/test/test_description.py
--- a/rpython/annotator/test/test_description.py
+++ b/rpython/annotator/test/test_description.py
@@ -1,4 +1,4 @@
-from rpython.annotator.description import ClassDesc
+from rpython.annotator.description import ClassDesc, is_mixin
 
 class FakeBookkeeper:
     def __init__(self):
@@ -20,3 +20,13 @@
     dC = bk.getdesc(C)
     dD = bk.getdesc(D)
     assert ClassDesc.getcommonbase([dC, dD]) is dA
+
+def test_is_mixin():
+    class Mixin1(object):
+        _mixin_ = True
+
+    class A(Mixin1):
+        pass
+
+    assert is_mixin(Mixin1)
+    assert not is_mixin(A)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to