[pypy-commit] pypy anntype2: Create BuiltinTypeDesc and simplify our_issubclass()
rlamy
noreply at buildbot.pypy.org
Wed Nov 25 11:40:13 EST 2015
Author: Ronan Lamy <ronan.lamy at 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):
More information about the pypy-commit
mailing list