Author: Ronan Lamy <ronan.l...@gmail.com> Branch: anntype2 Changeset: r80960:bea678d5d487 Date: 2015-11-25 16:39 +0000 http://bitbucket.org/pypy/pypy/changeset/bea678d5d487/
Log: Create BuiltinTypeDesc and simplify our_issubclass() diff --git a/rpython/annotator/classdesc.py b/rpython/annotator/classdesc.py --- a/rpython/annotator/classdesc.py +++ b/rpython/annotator/classdesc.py @@ -471,6 +471,19 @@ def is_mixin(cls): return cls.__dict__.get('_mixin_', False) +def is_primitive_type(cls): + from rpython.rlib.rarithmetic import base_int + return cls.__module__ == '__builtin__' or issubclass(cls, base_int) + + +class BuiltinTypeDesc(object): + """Represents a primitive or builtin type object""" + def __init__(self, cls): + self.pyobj = cls + + def issubclass(self, other): + return issubclass(self.pyobj, other.pyobj) + class ClassDesc(Desc): knowntype = type diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py --- a/rpython/annotator/unaryop.py +++ b/rpython/annotator/unaryop.py @@ -19,7 +19,7 @@ from rpython.annotator.binaryop import _clone ## XXX where to put this? from rpython.annotator.binaryop import _dict_can_only_throw_keyerror from rpython.annotator.binaryop import _dict_can_only_throw_nothing -from rpython.annotator.classdesc import ClassDesc +from rpython.annotator.classdesc import ClassDesc, is_primitive_type, BuiltinTypeDesc from rpython.annotator.model import AnnotatorError from rpython.annotator.argument import simple_args, complex_args @@ -34,31 +34,14 @@ def our_issubclass(bk, cls1, cls2): - if cls2 is object: - return True - def classify(cls): - from rpython.rlib.rarithmetic import base_int + def toclassdesc(cls): if isinstance(cls, ClassDesc): - return 'desc' - if cls.__module__ == '__builtin__' or issubclass(cls, base_int): - return 'builtin' + return cls + elif is_primitive_type(cls): + return BuiltinTypeDesc(cls) else: - return 'cls' - kind1 = classify(cls1) - kind2 = classify(cls2) - if kind1 != 'desc' and kind2 != 'desc': - return issubclass(cls1, cls2) - if kind1 == 'builtin' and kind2 == 'desc': - return False - elif kind1 == 'desc' and kind2 == 'builtin': - return issubclass(object, cls2) - else: - def toclassdesc(kind, cls): - if kind != 'desc': - return bk.getdesc(cls) - else: - return cls - return toclassdesc(kind1, cls1).issubclass(toclassdesc(kind2, cls2)) + return bk.getdesc(cls) + return toclassdesc(cls1).issubclass(toclassdesc(cls2)) def s_isinstance(annotator, s_obj, s_type, variables): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit