Author: Antonio Cuni <[email protected]>
Branch: int_w-refactor
Changeset: r69466:796466a94c48
Date: 2014-02-26 17:23 +0100
http://bitbucket.org/pypy/pypy/changeset/796466a94c48/
Log: add allow_conversion=True also to space.bigint_w, and improve a test
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -203,7 +203,7 @@
def int_w(self, space, allow_conversion=True):
# note that W_IntObject.int_w has a fast path and W_FloatObject.int_w
- # raises
+ # raises w_TypeError
w_obj = self
if allow_conversion:
w_obj = space.int(self)
@@ -218,7 +218,15 @@
def uint_w(self, space):
self._typed_unwrap_error(space, "integer")
- def bigint_w(self, space):
+ def bigint_w(self, space, allow_conversion=True):
+ # note that W_IntObject and W_LongObject have fast paths,
+ # W_FloatObject.rbigint_w raises w_TypeError raises
+ w_obj = self
+ if allow_conversion:
+ w_obj = space.long(self)
+ return w_obj._bigint_w(space)
+
+ def _bigint_w(self, space):
self._typed_unwrap_error(space, "integer")
def _typed_unwrap_error(self, space, expected):
@@ -1378,8 +1386,12 @@
def uint_w(self, w_obj):
return w_obj.uint_w(self)
- def bigint_w(self, w_obj):
- return w_obj.bigint_w(self)
+ def bigint_w(self, w_obj, allow_conversion=True):
+ """
+ Like int_w, for returns a rlib.rbigint object and call __long__ is
+ allow_conversion is True.
+ """
+ return w_obj.bigint_w(self, allow_conversion)
def float_w(self, w_obj):
return w_obj.float_w(self)
@@ -1425,11 +1437,8 @@
def gateway_float_w(self, w_obj):
return self.float_w(self.float(w_obj))
- def gateway_r_longlong_w(self, w_obj):
- if self.isinstance_w(w_obj, self.w_float):
- raise OperationError(self.w_TypeError,
- self.wrap("integer argument expected, got float"))
- return self.r_longlong_w(self.int(w_obj))
+ gateway_r_longlong_w = r_longlong_w
+ gateway_r_ulonglong_w = r_ulonglong_w
def gateway_r_uint_w(self, w_obj):
if self.isinstance_w(w_obj, self.w_float):
@@ -1437,12 +1446,6 @@
self.wrap("integer argument expected, got float"))
return self.uint_w(self.int(w_obj))
- def gateway_r_ulonglong_w(self, w_obj):
- if self.isinstance_w(w_obj, self.w_float):
- raise OperationError(self.w_TypeError,
- self.wrap("integer argument expected, got float"))
- return self.r_ulonglong_w(self.int(w_obj))
-
def gateway_nonnegint_w(self, w_obj):
# Like space.gateway_int_w(), but raises an app-level ValueError if
# the integer is negative. Here for gateway.py.
diff --git a/pypy/interpreter/test/test_gateway.py
b/pypy/interpreter/test/test_gateway.py
--- a/pypy/interpreter/test/test_gateway.py
+++ b/pypy/interpreter/test/test_gateway.py
@@ -457,6 +457,8 @@
space.mul(space.wrap(sys.maxint), space.wrap(-7)))
def test_interp2app_unwrap_spec_typechecks(self):
+ from rpython.rlib.rarithmetic import r_longlong
+
space = self.space
w = space.wrap
def g3_id(space, x):
@@ -491,6 +493,12 @@
raises(gateway.OperationError,space.call_function,w_app_g3_f,w(None))
raises(gateway.OperationError,space.call_function,w_app_g3_f,w("foo"))
+ app_g3_r = gateway.interp2app_temp(g3_id,
+ unwrap_spec=[gateway.ObjSpace,
+ r_longlong])
+ w_app_g3_r = space.wrap(app_g3_r)
+ raises(gateway.OperationError,space.call_function,w_app_g3_r,w(1.0))
+
def test_interp2app_unwrap_spec_unicode(self):
space = self.space
w = space.wrap
diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py
--- a/pypy/objspace/fake/objspace.py
+++ b/pypy/objspace/fake/objspace.py
@@ -51,7 +51,7 @@
def uint_w(self, space):
return r_uint(NonConstant(42))
- def bigint_w(self, space):
+ def bigint_w(self, space, allow_conversion=True):
from rpython.rlib.rbigint import rbigint
return rbigint.fromint(NonConstant(42))
diff --git a/pypy/objspace/std/floatobject.py b/pypy/objspace/std/floatobject.py
--- a/pypy/objspace/std/floatobject.py
+++ b/pypy/objspace/std/floatobject.py
@@ -37,6 +37,9 @@
def int_w(self, space, allow_conversion=True):
self._typed_unwrap_error(space, "integer")
+ def bigint_w(self, space, allow_conversion=True):
+ self._typed_unwrap_error(space, "integer")
+
def float_w(self, space):
return self.floatval
diff --git a/pypy/objspace/std/intobject.py b/pypy/objspace/std/intobject.py
--- a/pypy/objspace/std/intobject.py
+++ b/pypy/objspace/std/intobject.py
@@ -325,7 +325,10 @@
"cannot convert negative integer to unsigned")
return r_uint(intval)
- def bigint_w(self, space):
+ def bigint_w(self, space, allow_conversion=True):
+ return rbigint.fromint(self.intval)
+
+ def _bigint_w(self, space):
return rbigint.fromint(self.intval)
def float_w(self, space):
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
@@ -261,7 +261,10 @@
raise oefmt(space.w_OverflowError,
"long int too large to convert to unsigned int")
- def bigint_w(self, space):
+ def bigint_w(self, space, allow_conversion=True):
+ return self.num
+
+ def _bigint_w(self, space):
return self.num
def float_w(self, space):
diff --git a/pypy/objspace/std/smalllongobject.py
b/pypy/objspace/std/smalllongobject.py
--- a/pypy/objspace/std/smalllongobject.py
+++ b/pypy/objspace/std/smalllongobject.py
@@ -63,7 +63,10 @@
raise oefmt(space.w_OverflowError,
"long int too large to convert to unsigned int")
- def bigint_w(self, space):
+ def bigint_w(self, space, allow_conversion=True):
+ return self.asbigint()
+
+ def _bigint_w(self, space):
return self.asbigint()
def float_w(self, space):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit