[pypy-commit] pypy int_w-refactor: implement allow_conversion=True also for float_w: this finally fixes the struct+numpy failing test which I introduced at the beginning of the branch
antocuni
noreply at buildbot.pypy.org
Wed Feb 26 18:09:43 CET 2014
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: int_w-refactor
Changeset: r69467:229c615d291d
Date: 2014-02-26 18:08 +0100
http://bitbucket.org/pypy/pypy/changeset/229c615d291d/
Log: implement allow_conversion=True also for float_w: this finally fixes
the struct+numpy failing test which I introduced at the beginning of
the branch
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -212,7 +212,13 @@
def _int_w(self, space):
self._typed_unwrap_error(space, "integer")
- def float_w(self, space):
+ def float_w(self, space, allow_conversion=True):
+ w_obj = self
+ if allow_conversion:
+ w_obj = space.float(self)
+ return w_obj._float_w(space)
+
+ def _float_w(self, space):
self._typed_unwrap_error(space, "float")
def uint_w(self, space):
@@ -1388,13 +1394,17 @@
def bigint_w(self, w_obj, allow_conversion=True):
"""
- Like int_w, for returns a rlib.rbigint object and call __long__ is
+ Like int_w, but return a rlib.rbigint object and call __long__ if
allow_conversion is True.
"""
return w_obj.bigint_w(self, allow_conversion)
- def float_w(self, w_obj):
- return w_obj.float_w(self)
+ def float_w(self, w_obj, allow_conversion=True):
+ """
+ Like int_w, but return an interp-level float and call __float__ if
+ allow_conversion is True.
+ """
+ return w_obj.float_w(self, allow_conversion)
def realstr_w(self, w_obj):
# Like str_w, but only works if w_obj is really of type 'str'.
diff --git a/pypy/module/cppyy/test/test_zjit.py b/pypy/module/cppyy/test/test_zjit.py
--- a/pypy/module/cppyy/test/test_zjit.py
+++ b/pypy/module/cppyy/test/test_zjit.py
@@ -120,7 +120,7 @@
return FakeInt(int(obj))
assert 0
- def float_w(self, w_obj):
+ def float_w(self, w_obj, allow_conversion=True):
assert isinstance(w_obj, FakeFloat)
return w_obj.val
diff --git a/pypy/module/micronumpy/compile.py b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -152,7 +152,7 @@
assert isinstance(w_obj, interp_boxes.W_GenericBox)
return self.float(w_obj.descr_float(self))
- def float_w(self, w_obj):
+ def float_w(self, w_obj, allow_conversion=True):
assert isinstance(w_obj, FloatObject)
return w_obj.floatval
diff --git a/pypy/module/posix/interp_posix.py b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -868,8 +868,8 @@
args_w = space.fixedview(w_tuple)
if len(args_w) != 2:
raise OperationError(space.w_TypeError, space.wrap(msg))
- actime = space.float_w(args_w[0])
- modtime = space.float_w(args_w[1])
+ actime = space.float_w(args_w[0], allow_conversion=False)
+ modtime = space.float_w(args_w[1], allow_conversion=False)
dispatch_filename(rposix.utime, 2)(space, w_path, (actime, modtime))
except OSError, e:
raise wrap_oserror2(space, e, w_path)
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
@@ -115,7 +115,7 @@
def _freeze_(self):
return True
- def float_w(self, w_obj):
+ def float_w(self, w_obj, allow_conversion=True):
is_root(w_obj)
return NonConstant(42.5)
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
@@ -40,7 +40,10 @@
def bigint_w(self, space, allow_conversion=True):
self._typed_unwrap_error(space, "integer")
- def float_w(self, space):
+ def float_w(self, space, allow_conversion=True):
+ return self.floatval
+
+ def _float_w(self, space):
return self.floatval
def int(self, space):
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
@@ -331,9 +331,12 @@
def _bigint_w(self, space):
return rbigint.fromint(self.intval)
- def float_w(self, space):
+ def float_w(self, space, allow_conversion=True):
return float(self.intval)
+ # note that we do NOT implement _float_w, because __float__ cannot return
+ # an int
+
def int(self, space):
if type(self) is W_IntObject:
return self
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
@@ -267,7 +267,10 @@
def _bigint_w(self, space):
return self.num
- def float_w(self, space):
+ def float_w(self, space, allow_conversion=True):
+ return self.tofloat(space)
+
+ def _float_w(self, space):
return self.tofloat(space)
def int(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
@@ -69,7 +69,7 @@
def _bigint_w(self, space):
return self.asbigint()
- def float_w(self, space):
+ def _float_w(self, space):
return float(self.longlong)
def int(self, space):
More information about the pypy-commit
mailing list