Author: Antonio Cuni <[email protected]>
Branch: ffistruct
Changeset: r49007:ceb799c62245
Date: 2011-11-09 13:39 +0100
http://bitbucket.org/pypy/pypy/changeset/ceb799c62245/
Log: add a new space method to truncate longlongs, similar to
space.truncatedint
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1298,6 +1298,17 @@
from pypy.rlib.rarithmetic import intmask
return intmask(self.bigint_w(w_obj).uintmask())
+ def truncatedlonglong_w(self, w_obj):
+ # Like space.gateway_r_longlong_w(), but return the integer truncated
+ # instead of raising OverflowError.
+ try:
+ return self.r_longlong_w(w_obj)
+ except OperationError, e:
+ if not e.match(self, self.w_OverflowError):
+ raise
+ from pypy.rlib.rarithmetic import longlongmask
+ return longlongmask(self.bigint_w(w_obj).ulonglongmask())
+
def c_filedescriptor_w(self, w_fd):
# This is only used sometimes in CPython, e.g. for os.fsync() but
# not os.close(). It's likely designed for 'select'. It's irregular
diff --git a/pypy/interpreter/test/test_objspace.py
b/pypy/interpreter/test/test_objspace.py
--- a/pypy/interpreter/test/test_objspace.py
+++ b/pypy/interpreter/test/test_objspace.py
@@ -213,6 +213,29 @@
w_obj = space.wrap(-12)
space.raises_w(space.w_ValueError, space.r_ulonglong_w, w_obj)
+ def test_truncatedlonglong_w(self):
+ space = self.space
+ w_value = space.wrap(12)
+ res = space.truncatedlonglong_w(w_value)
+ assert res == 12
+ assert type(res) is r_longlong
+ #
+ w_value = space.wrap(r_ulonglong(9223372036854775808))
+ res = space.truncatedlonglong_w(w_value)
+ assert res == -9223372036854775808
+ assert type(res) is r_longlong
+ #
+ w_value = space.wrap(r_ulonglong(18446744073709551615))
+ res = space.truncatedlonglong_w(w_value)
+ assert res == -1
+ assert type(res) is r_longlong
+ #
+ w_value = space.wrap(r_ulonglong(18446744073709551616))
+ res = space.truncatedlonglong_w(w_value)
+ assert res == 0
+ assert type(res) is r_longlong
+
+
def test_call_obj_args(self):
from pypy.interpreter.argument import Arguments
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit