Author: Armin Rigo <[email protected]>
Branch: issue2343
Changeset: r85694:d581b89514a5
Date: 2016-07-14 15:55 +0200
http://bitbucket.org/pypy/pypy/changeset/d581b89514a5/
Log: in-progress, trying to copy the logic of CPython and finding messes
in our different logic
diff --git a/pypy/module/__builtin__/abstractinst.py
b/pypy/module/__builtin__/abstractinst.py
--- a/pypy/module/__builtin__/abstractinst.py
+++ b/pypy/module/__builtin__/abstractinst.py
@@ -109,6 +109,41 @@
return _issubclass_recurse(space, w_abstractclass, w_klass_or_tuple)
+def recursive_isinstance_type_w(space, w_inst, w_type):
+ # subfunctionality of recursive_isinstance(): assumes that w_type is
+ # a type object.
+ if space.isinstance_w(w_inst, w_type):
+ return True
+ try:
+ w_abstractclass = space.getattr(w_inst, space.wrap('__class__'))
+ except OperationError as e:
+ if e.async(space): # ignore most exceptions
+ raise
+ else:
+ if w_abstractclass is not space.type(w_inst):
+ if space.isinstance_w(w_abstractclass, space.w_type):
+ return space.issubtype_w(w_abstractclass, w_type)
+ return False
+
+
+def recursive_issubclass_w(space, w_derived, w_cls):
+ # From CPython's function of the same name, which as far as I can tell
+ # is not recursive.
+ if (space.isinstance_w(w_cls, space.w_type) and
+ space.isinstance_w(w_derived, space.w_type)):
+ return space.issubtype_w(w_derived, w_cls)
+ #
+ if (isinstance(w_derived, W_ClassObject) and
+ isinstance(w_cls, W_ClassObject)):
+ return w_derived.is_subclass_of(w_cls)
+ #
+ check_class(space, w_derived, "issubclass() arg 1 must be a class")
+ check_class(space, w_cls, "issubclass() arg 2 must be a class"
+ " or tuple of classes")
+ XXXX
+ return abstract_issubclass_w(space, w_derived, w_cls)
+
+
@jit.unroll_safe
def _issubclass_recurse(space, w_derived, w_top):
"""Internal helper for abstract cases. Here, w_top cannot be a tuple."""
diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py
--- a/pypy/objspace/std/typeobject.py
+++ b/pypy/objspace/std/typeobject.py
@@ -6,6 +6,7 @@
from pypy.interpreter.typedef import weakref_descr, GetSetProperty,\
descr_get_dict, dict_descr, Member, TypeDef
from pypy.interpreter.astcompiler.misc import mangle
+from pypy.module.__builtin__ import abstractinst
from rpython.rlib.jit import (promote, elidable_promote, we_are_jitted,
elidable, dont_look_inside, unroll_safe)
@@ -899,13 +900,15 @@
# ____________________________________________________________
[email protected]_spec(w_obj=W_TypeObject, w_sub=W_TypeObject)
[email protected]_spec(w_obj=W_TypeObject)
def type_issubtype(w_obj, space, w_sub):
- return space.newbool(w_sub.issubtype(w_obj))
+ return space.newbool(
+ abstractinst.recursive_issubclass_w(space, w_sub, w_obj))
@gateway.unwrap_spec(w_obj=W_TypeObject)
def type_isinstance(w_obj, space, w_inst):
- return space.newbool(space.type(w_inst).issubtype(w_obj))
+ return space.newbool(
+ abstractinst.recursive_isinstance_type_w(space, w_inst, w_obj))
W_TypeObject.typedef = TypeDef("type",
__new__ = gateway.interp2app(descr__new__),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit