Author: Brian Kearns <bdkea...@gmail.com> Branch: refactor-buffer-api Changeset: r70941:47fd7571d5f0 Date: 2014-04-24 16:49 -0400 http://bitbucket.org/pypy/pypy/changeset/47fd7571d5f0/
Log: fix float.__new__ bufferstr behavior diff --git a/pypy/objspace/std/floattype.py b/pypy/objspace/std/floattype.py --- a/pypy/objspace/std/floattype.py +++ b/pypy/objspace/std/floattype.py @@ -23,7 +23,7 @@ register_all(vars(), globals()) -@unwrap_spec(w_x = WrappedDefault(0.0)) +@unwrap_spec(w_x=WrappedDefault(0.0)) def descr__new__(space, w_floattype, w_x): from pypy.objspace.std.floatobject import W_FloatObject w_value = w_x # 'x' is the keyword argument name in CPython @@ -32,15 +32,19 @@ if space.is_w(w_floattype, space.w_float): return w_obj value = space.float_w(w_obj) - elif (space.isinstance_w(w_value, space.w_str) or - space.isinstance_w(w_value, space.w_bytearray)): - value = _string_to_float(space, w_value, space.bufferstr_w(w_value)) elif space.isinstance_w(w_value, space.w_unicode): from unicodeobject import unicode_to_decimal_w value = _string_to_float(space, w_value, unicode_to_decimal_w(space, w_value)) else: - value = space.float_w(w_x) + try: + value = space.charbuf_w(w_value) + except OperationError as e: + if e.match(space, space.w_TypeError): + raise OperationError(space.w_TypeError, space.wrap( + "float() argument must be a string or a number")) + raise + value = _string_to_float(space, w_value, value) w_obj = space.allocate_instance(W_FloatObject, w_floattype) W_FloatObject.__init__(w_obj, value) return w_obj diff --git a/pypy/objspace/std/test/test_floatobject.py b/pypy/objspace/std/test/test_floatobject.py --- a/pypy/objspace/std/test/test_floatobject.py +++ b/pypy/objspace/std/test/test_floatobject.py @@ -61,7 +61,7 @@ class AppTestAppFloatTest: spaceconfig = dict(usemodules=['binascii', 'rctime']) - + def setup_class(cls): cls.w_py26 = cls.space.wrap(sys.version_info >= (2, 6)) @@ -138,6 +138,11 @@ assert repr(float("+nan")) == "nan" assert repr(float("-nAn")) == "nan" + assert float(buffer("inf")) == inf + assert float(bytearray("inf")) == inf + exc = raises(TypeError, float, memoryview("inf")) + assert str(exc.value) == "float() argument must be a string or a number" + def test_float_unicode(self): # u00A0 and u2000 are some kind of spaces assert 42.75 == float(unichr(0x00A0)+unicode("42.75")+unichr(0x2000)) @@ -812,7 +817,7 @@ def check(a, b): assert (a, math.copysign(1.0, a)) == (b, math.copysign(1.0, b)) - + check(mod(-1.0, 1.0), 0.0) check(mod(-1e-100, 1.0), 1.0) check(mod(-0.0, 1.0), 0.0) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit