Author: Brian Kearns <bdkea...@gmail.com> Branch: Changeset: r68420:a9f62405eb7d Date: 2013-12-13 15:40 -0500 http://bitbucket.org/pypy/pypy/changeset/a9f62405eb7d/
Log: also fix longtype: try __long__ before str/unicode diff --git a/pypy/objspace/std/longtype.py b/pypy/objspace/std/longtype.py --- a/pypy/objspace/std/longtype.py +++ b/pypy/objspace/std/longtype.py @@ -27,6 +27,18 @@ return w_value elif type(w_value) is W_LongObject: return newbigint(space, w_longtype, w_value.num) + elif (space.lookup(w_value, '__long__') is not None or + space.lookup(w_value, '__int__') is not None): + w_obj = space.long(w_value) + return newbigint(space, w_longtype, space.bigint_w(w_obj)) + elif space.lookup(w_value, '__trunc__') is not None: + w_obj = space.trunc(w_value) + # :-( blame CPython 2.7 + if space.lookup(w_obj, '__long__') is not None: + w_obj = space.long(w_obj) + else: + w_obj = space.int(w_obj) + return newbigint(space, w_longtype, space.bigint_w(w_obj)) elif space.isinstance_w(w_value, space.w_str): return string_to_w_long(space, w_longtype, space.str_w(w_value)) elif space.isinstance_w(w_value, space.w_unicode): @@ -34,24 +46,9 @@ return string_to_w_long(space, w_longtype, unicode_to_decimal_w(space, w_value)) else: - # otherwise, use the __long__() or the __trunc__ methods - w_obj = w_value - if (space.lookup(w_obj, '__long__') is not None or - space.lookup(w_obj, '__int__') is not None): - w_obj = space.long(w_obj) - elif space.lookup(w_obj, '__trunc__') is not None: - w_obj = space.trunc(w_obj) - # :-( blame CPython 2.7 - if space.lookup(w_obj, '__long__') is not None: - w_obj = space.long(w_obj) - else: - w_obj = space.int(w_obj) - else: - raise operationerrfmt(space.w_TypeError, - "long() argument must be a string or a number, not '%T'", - w_obj) - bigint = space.bigint_w(w_obj) - return newbigint(space, w_longtype, bigint) + raise operationerrfmt(space.w_TypeError, + "long() argument must be a string or a number, not '%T'", + w_value) else: base = space.int_w(w_base) diff --git a/pypy/objspace/std/test/test_longobject.py b/pypy/objspace/std/test/test_longobject.py --- a/pypy/objspace/std/test/test_longobject.py +++ b/pypy/objspace/std/test/test_longobject.py @@ -291,6 +291,12 @@ return Integral() assert long(TruncReturnsNonLong()) == 42 + def test_long_before_string(self): + class A(str): + def __long__(self): + return 42 + assert long(A('abc')) == 42 + def test_conjugate(self): assert (7L).conjugate() == 7L assert (-7L).conjugate() == -7L _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit