[pypy-commit] pypy default: ignore __index__() on subclasses of 'int' or 'long'
arigo
pypy.commits at gmail.com
Mon Oct 17 08:27:43 EDT 2016
Author: Armin Rigo <arigo at 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):
More information about the pypy-commit
mailing list