Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r87837:6bff38772609 Date: 2016-10-17 14:27 +0200 http://bitbucket.org/pypy/pypy/changeset/6bff38772609/
Log: ignore __index__() on subclasses of 'int' or 'long' diff --git a/pypy/module/operator/test/test_operator.py b/pypy/module/operator/test/test_operator.py --- a/pypy/module/operator/test/test_operator.py +++ b/pypy/module/operator/test/test_operator.py @@ -251,6 +251,13 @@ exc = raises(TypeError, operator.index, "abc") assert str(exc.value) == "'str' object cannot be interpreted as an index" + def test_index_int_subclass(self): + import operator + class myint(int): + def __index__(self): + return 13289 + assert operator.index(myint(7)) == 7 + def test_compare_digest(self): import operator diff --git a/pypy/objspace/descroperation.py b/pypy/objspace/descroperation.py --- a/pypy/objspace/descroperation.py +++ b/pypy/objspace/descroperation.py @@ -522,6 +522,23 @@ def isinstance(space, w_inst, w_type): return space.wrap(space.isinstance_w(w_inst, w_type)) + def index(space, w_obj): + if (space.isinstance_w(w_obj, space.w_int) or + space.isinstance_w(w_obj, space.w_long)): + return w_obj + w_impl = space.lookup(w_obj, '__index__') + if w_impl is None: + raise oefmt(space.w_TypeError, + "'%T' object cannot be interpreted as an index", + w_obj) + w_result = space.get_and_call_function(w_impl, w_obj) + + if (space.isinstance_w(w_result, space.w_int) or + space.isinstance_w(w_result, space.w_long)): + return w_result + raise oefmt(space.w_TypeError, + "__index__ returned non-(int,long) (type '%T')", w_result) + # helpers @@ -797,17 +814,13 @@ # more of the above manually-coded operations as well) for targetname, specialname, checkerspec in [ - ('index', '__index__', ("space.w_int", "space.w_long")), ('long', '__long__', ("space.w_int", "space.w_long")), ('float', '__float__', ("space.w_float",))]: l = ["space.isinstance_w(w_result, %s)" % x for x in checkerspec] checker = " or ".join(l) - if targetname == 'index': - msg = "'%%T' object cannot be interpreted as an index" - else: - msg = "unsupported operand type for %(targetname)s(): '%%T'" + msg = "unsupported operand type for %(targetname)s(): '%%T'" msg = msg % locals() source = """if 1: def %(targetname)s(space, w_obj): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit