Author: Maciej Fijalkowski <fij...@gmail.com> Branch: Changeset: r62755:a832d5973ed3 Date: 2013-03-25 13:56 -0700 http://bitbucket.org/pypy/pypy/changeset/a832d5973ed3/
Log: fix longs diff --git a/pypy/objspace/std/longobject.py b/pypy/objspace/std/longobject.py --- a/pypy/objspace/std/longobject.py +++ b/pypy/objspace/std/longobject.py @@ -6,35 +6,16 @@ from pypy.objspace.std.multimethod import FailedToImplementArgs from pypy.objspace.std.intobject import W_IntObject from pypy.objspace.std.noneobject import W_NoneObject -from rpython.rlib.rbigint import rbigint, SHIFT - -class W_AbstractLongObject(W_Object): - __slots__ = () - - def is_w(self, space, w_other): - if not isinstance(w_other, W_AbstractLongObject): - return False - if self.user_overridden_class or w_other.user_overridden_class: - return self is w_other - return space.bigint_w(self).eq(space.bigint_w(w_other)) - - def immutable_unique_id(self, space): - if self.user_overridden_class: - return None - from pypy.objspace.std.model import IDTAG_LONG as tag - b = space.bigint_w(self) - b = b.lshift(3).or_(rbigint.fromint(tag)) - return space.newlong_from_rbigint(b) - - def unwrap(w_self, space): #YYYYYY - return w_self.longval() +from rpython.rlib.rbigint import rbigint +from pypy.objspace.std.longtype import long_typedef, W_AbstractLongObject class W_LongObject(W_AbstractLongObject): """This is a wrapper of rbigint.""" - from pypy.objspace.std.longtype import long_typedef as typedef _immutable_fields_ = ['num'] + typedef = long_typedef + def __init__(w_self, l): w_self.num = l # instance of rbigint @@ -88,6 +69,9 @@ return self.num.tofloat() def int(self, space): + if (type(self) is not W_LongObject and + space.is_overloaded(self, space.w_long, '__int__')): + return W_Object.int(self, space) try: return space.newint(self.num.toint()) except OverflowError: 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 @@ -1,9 +1,11 @@ from pypy.interpreter.error import OperationError from pypy.interpreter import typedef -from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault -from pypy.objspace.std.register_all import register_all -from pypy.objspace.std.stdtypedef import StdTypeDef, SMM +from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault,\ + interpindirect2app +from pypy.objspace.std.model import W_Object +from pypy.objspace.std.stdtypedef import StdTypeDef from pypy.objspace.std.strutil import string_to_bigint, ParseStringError +from rpython.rlib.rbigint import rbigint def descr_conjugate(space, w_int): return space.long(w_int) @@ -12,7 +14,6 @@ @unwrap_spec(w_x = WrappedDefault(0)) def descr__new__(space, w_longtype, w_x, w_base=None): from pypy.objspace.std.longobject import W_LongObject - from rpython.rlib.rbigint import rbigint if space.config.objspace.std.withsmalllong: from pypy.objspace.std.smalllongobject import W_SmallLongObject else: @@ -56,7 +57,7 @@ else: try: s = space.str_w(w_value) - except OperationError, e: + except OperationError: raise OperationError(space.w_TypeError, space.wrap("long() can't convert non-string " "with explicit base")) @@ -114,6 +115,30 @@ # ____________________________________________________________ +class W_AbstractLongObject(W_Object): + __slots__ = () + + def is_w(self, space, w_other): + if not isinstance(w_other, W_AbstractLongObject): + return False + if self.user_overridden_class or w_other.user_overridden_class: + return self is w_other + return space.bigint_w(self).eq(space.bigint_w(w_other)) + + def immutable_unique_id(self, space): + if self.user_overridden_class: + return None + from pypy.objspace.std.model import IDTAG_LONG as tag + b = space.bigint_w(self) + b = b.lshift(3).or_(rbigint.fromint(tag)) + return space.newlong_from_rbigint(b) + + def unwrap(w_self, space): #YYYYYY + return w_self.longval() + + def int(self, space): + raise NotImplementedError + long_typedef = StdTypeDef("long", __doc__ = '''long(x[, base]) -> integer @@ -129,5 +154,6 @@ real = typedef.GetSetProperty(descr_get_real), imag = typedef.GetSetProperty(descr_get_imag), bit_length = interp2app(bit_length), + __int__ = interpindirect2app(W_AbstractLongObject.int), ) long_typedef.registermethods(globals()) 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 @@ -231,13 +231,13 @@ def test_math_log(self): import math - raises(ValueError, math.log, 0L) - raises(ValueError, math.log, -1L) - raises(ValueError, math.log, -2L) + raises(ValueError, math.log, 0L) + raises(ValueError, math.log, -1L) + raises(ValueError, math.log, -2L) raises(ValueError, math.log, -(1L << 10000)) - #raises(ValueError, math.log, 0) - raises(ValueError, math.log, -1) - raises(ValueError, math.log, -2) + #raises(ValueError, math.log, 0) + raises(ValueError, math.log, -1) + raises(ValueError, math.log, -2) def test_long(self): import sys @@ -327,3 +327,11 @@ class A(long): pass b = A(5).real assert type(b) is long + + def test__int__(self): + class A(long): + def __int__(self): + return 42 + + assert int(long(3)) == long(3) + assert int(A(13)) == 42 _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit