[pypy-commit] pypy py3k: hg merge default

Manuel Jacob noreply at buildbot.pypy.org
Thu Feb 21 00:37:20 CET 2013


Author: Manuel Jacob
Branch: py3k
Changeset: r61511:60e8bbf6448f
Date: 2013-02-21 00:36 +0100
http://bitbucket.org/pypy/pypy/changeset/60e8bbf6448f/

Log:	hg merge default

diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py
--- a/pypy/module/_io/interp_fileio.py
+++ b/pypy/module/_io/interp_fileio.py
@@ -3,6 +3,7 @@
 from pypy.interpreter.error import OperationError, wrap_oserror, wrap_oserror2
 from rpython.rlib.rarithmetic import r_longlong
 from rpython.rlib.rstring import StringBuilder
+from rpython.rlib.rposix import validate_fd
 from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC
 import sys, os, stat, errno
 from pypy.module._io.interp_iobase import W_RawIOBase, convert_size
@@ -117,9 +118,6 @@
             return currentsize + BIGCHUNK
     return currentsize + SMALLCHUNK
 
-def verify_fd(fd):
-    return
-
 class W_FileIO(W_RawIOBase):
     def __init__(self, space):
         W_RawIOBase.__init__(self, space)
@@ -156,7 +154,7 @@
         fd_is_own = False
         try:
             if fd >= 0:
-                verify_fd(fd)
+                validate_fd(fd)
                 try:
                     os.fstat(fd)
                 except OSError, e:
@@ -233,7 +231,7 @@
         self.fd = -1
 
         try:
-            verify_fd(fd)
+            validate_fd(fd)
             os.close(fd)
         except OSError, e:
             raise wrap_oserror(space, e,
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -250,7 +250,7 @@
         ret = self.implementation.get_imag(self)
         if ret:
             return W_NDimArray(ret)
-        raise OperationError(space.w_NotImplementedError, 
+        raise OperationError(space.w_NotImplementedError,
                     space.wrap('imag not implemented for this dtype'))
 
     def descr_set_real(self, space, w_value):
@@ -261,7 +261,7 @@
     def descr_set_imag(self, space, w_value):
         # if possible, copy (broadcast) values into self
         if not self.get_dtype().is_complex_type():
-            raise OperationError(space.w_TypeError, 
+            raise OperationError(space.w_TypeError,
                     space.wrap('array does not have imaginary part to set'))
         tmp = self.implementation.get_imag(self)
         tmp.setslice(space, convert_to_array(space, w_value))
@@ -302,11 +302,11 @@
     @unwrap_spec(axis1=int, axis2=int)
     def descr_swapaxes(self, space, axis1, axis2):
         """a.swapaxes(axis1, axis2)
-    
+
         Return a view of the array with `axis1` and `axis2` interchanged.
-    
+
         Refer to `numpy.swapaxes` for full documentation.
-    
+
         See Also
         --------
         numpy.swapaxes : equivalent function
@@ -439,7 +439,7 @@
         ret = impl.base()
         if ret is None:
             return space.w_None
-        return ret    
+        return ret
 
     @unwrap_spec(inplace=bool)
     def descr_byteswap(self, space, inplace=False):
@@ -492,7 +492,7 @@
                 "axis1 and axis2 cannot be the same"))
         return interp_arrayops.diagonal(space, self.implementation, offset,
                                         axis1, axis2)
-    
+
     def descr_dump(self, space, w_file):
         raise OperationError(space.w_NotImplementedError, space.wrap(
             "dump not implemented yet"))
@@ -509,7 +509,7 @@
         raise OperationError(space.w_NotImplementedError, space.wrap(
             "setting flags not implemented yet"))
 
-    @unwrap_spec(offset=int)    
+    @unwrap_spec(offset=int)
     def descr_getfield(self, space, w_dtype, offset):
         raise OperationError(space.w_NotImplementedError, space.wrap(
             "getfield not implemented yet"))
@@ -518,7 +518,7 @@
         raise OperationError(space.w_NotImplementedError, space.wrap(
             "itemset not implemented yet"))
 
-    @unwrap_spec(neworder=str)    
+    @unwrap_spec(neworder=str)
     def descr_newbyteorder(self, space, neworder):
         raise OperationError(space.w_NotImplementedError, space.wrap(
             "newbyteorder not implemented yet"))
@@ -551,7 +551,7 @@
         raise OperationError(space.w_NotImplementedError, space.wrap(
             "setfield not implemented yet"))
 
-    def descr_setflags(self, space, w_write=None, w_align=None, w_uic=None): 
+    def descr_setflags(self, space, w_write=None, w_align=None, w_uic=None):
         raise OperationError(space.w_NotImplementedError, space.wrap(
             "setflags not implemented yet"))
 
@@ -572,7 +572,7 @@
             "tofile not implemented yet"))
 
     def descr_trace(self, space, w_offset=0, w_axis1=0, w_axis2=1,
-                    w_dtype=None, w_out=None): 
+                    w_dtype=None, w_out=None):
         raise OperationError(space.w_NotImplementedError, space.wrap(
             "trace not implemented yet"))
 
@@ -627,21 +627,23 @@
         w_remainder = self.descr_mod(space, w_other)
         return space.newtuple([w_quotient, w_remainder])
 
-    _descr_eq = _binop_impl("equal")
+    def _binop_comp_impl(ufunc):
+        def impl(self, space, w_other, w_out=None):
+            try:
+                return ufunc(self, space, w_other, w_out)
+            except OperationError, e:
+                if e.match(space, space.w_ValueError):
+                    return space.w_False
+                raise e
 
-    def descr_eq(self, space, w_other):
-        try:
-            return self._descr_eq(space, w_other)
-        except OperationError, e:
-            if e.match(space, space.w_ValueError):
-                return space.w_False
-            raise e
+        return func_with_new_name(impl, ufunc.func_name)
 
-    descr_ne = _binop_impl("not_equal")
-    descr_lt = _binop_impl("less")
-    descr_le = _binop_impl("less_equal")
-    descr_gt = _binop_impl("greater")
-    descr_ge = _binop_impl("greater_equal")
+    descr_eq = _binop_comp_impl(_binop_impl("equal"))
+    descr_ne = _binop_comp_impl(_binop_impl("not_equal"))
+    descr_lt = _binop_comp_impl(_binop_impl("less"))
+    descr_le = _binop_comp_impl(_binop_impl("less_equal"))
+    descr_gt = _binop_comp_impl(_binop_impl("greater"))
+    descr_ge = _binop_comp_impl(_binop_impl("greater_equal"))
 
     def _binop_right_impl(ufunc_name):
         def impl(self, space, w_other, w_out=None):
@@ -707,7 +709,7 @@
             if space.is_none(w_out):
                 out = None
             elif not isinstance(w_out, W_NDimArray):
-                raise OperationError(space.w_TypeError, space.wrap( 
+                raise OperationError(space.w_TypeError, space.wrap(
                         'output must be an array'))
             else:
                 out = w_out
@@ -727,7 +729,7 @@
 
     descr_cumsum = _reduce_ufunc_impl('add', cumultative=True)
     descr_cumprod = _reduce_ufunc_impl('multiply', cumultative=True)
-    
+
     def descr_mean(self, space, w_axis=None, w_out=None):
         if space.is_none(w_axis):
             w_denom = space.wrap(self.get_size())
@@ -872,7 +874,7 @@
     swapaxes = interp2app(W_NDimArray.descr_swapaxes),
     flat = GetSetProperty(W_NDimArray.descr_get_flatiter),
     item = interp2app(W_NDimArray.descr_item),
-    real = GetSetProperty(W_NDimArray.descr_get_real, 
+    real = GetSetProperty(W_NDimArray.descr_get_real,
                           W_NDimArray.descr_set_real),
     imag = GetSetProperty(W_NDimArray.descr_get_imag,
                           W_NDimArray.descr_set_imag),
@@ -932,7 +934,7 @@
                                                         dtype)
             #if dtype is interp_dtype.get_dtype_cache(space).w_float64dtype:
             #    break
-            
+
         if dtype is None:
             dtype = interp_dtype.get_dtype_cache(space).w_float64dtype
     if ndmin > len(shape):
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
@@ -10,7 +10,7 @@
 from rpython.rlib.rarithmetic import ovfcheck_float_to_int, intmask, LONG_BIT
 from rpython.rlib.rfloat import (
     isinf, isnan, isfinite, INFINITY, NAN, copysign, formatd,
-    DTSF_ADD_DOT_0, DTSF_STR_PRECISION)
+    DTSF_ADD_DOT_0, DTSF_STR_PRECISION, float_as_rbigint_ratio)
 from rpython.rlib.rbigint import rbigint
 from rpython.rlib import rfloat
 from rpython.tool.sourcetools import func_with_new_name
@@ -544,27 +544,18 @@
 
 def float_as_integer_ratio__Float(space, w_float):
     value = w_float.floatval
-    if isinf(value):
+    try:
+        num, den = float_as_rbigint_ratio(value)
+    except OverflowError:
         w_msg = space.wrap("cannot pass infinity to as_integer_ratio()")
         raise OperationError(space.w_OverflowError, w_msg)
-    elif isnan(value):
+    except ValueError:
         w_msg = space.wrap("cannot pass nan to as_integer_ratio()")
         raise OperationError(space.w_ValueError, w_msg)
-    float_part, exp = math.frexp(value)
-    for i in range(300):
-        if float_part == math.floor(float_part):
-            break
-        float_part *= 2.0
-        exp -= 1
-    w_num = W_LongObject.fromfloat(space, float_part)
-    w_den = space.newlong(1)
-    w_exp = space.newlong(abs(exp))
-    w_exp = space.lshift(w_den, w_exp)
-    if exp > 0:
-        w_num = space.mul(w_num, w_exp)
-    else:
-        w_den = w_exp
-    # Try to return int.
+
+    w_num = space.newlong_from_rbigint(num)
+    w_den = space.newlong_from_rbigint(den)
+    # Try to return int
     return space.newtuple([space.int(w_num), space.int(w_den)])
 
 def float_is_integer__Float(space, w_float):
diff --git a/rpython/rlib/rfloat.py b/rpython/rlib/rfloat.py
--- a/rpython/rlib/rfloat.py
+++ b/rpython/rlib/rfloat.py
@@ -419,3 +419,25 @@
 def isfinite(x):
     "NOT_RPYTHON"
     return not isinf(x) and not isnan(x)
+
+def float_as_rbigint_ratio(value):
+    from rpython.rlib.rbigint import rbigint
+
+    if isinf(value):
+        raise OverflowError("cannot pass infinity to as_integer_ratio()")
+    elif isnan(value):
+        raise ValueError("cannot pass nan to as_integer_ratio()")
+    float_part, exp_int = math.frexp(value)
+    for i in range(300):
+        if float_part == math.floor(float_part):
+            break
+        float_part *= 2.0
+        exp_int -= 1
+    num = rbigint.fromfloat(float_part)
+    den = rbigint.fromint(1)
+    exp = den.lshift(abs(exp_int))
+    if exp_int > 0:
+        num = num.mul(exp)
+    else:
+        den = exp
+    return num, den
diff --git a/rpython/rlib/test/test_rfloat.py b/rpython/rlib/test/test_rfloat.py
new file mode 100644
--- /dev/null
+++ b/rpython/rlib/test/test_rfloat.py
@@ -0,0 +1,131 @@
+import sys, py
+
+from rpython.rlib.rfloat import float_as_rbigint_ratio
+from rpython.rlib.rfloat import break_up_float
+from rpython.rlib.rfloat import copysign
+from rpython.rlib.rfloat import round_away
+from rpython.rlib.rfloat import round_double
+from rpython.rlib.rbigint import rbigint
+
+def test_copysign():
+    assert copysign(1, 1) == 1
+    assert copysign(-1, 1) == 1
+    assert copysign(-1, -1) == -1
+    assert copysign(1, -1) == -1
+    assert copysign(1, -0.) == -1
+
+def test_round_away():
+    assert round_away(.1) == 0.
+    assert round_away(.5) == 1.
+    assert round_away(.7) == 1.
+    assert round_away(1.) == 1.
+    assert round_away(-.5) == -1.
+    assert round_away(-.1) == 0.
+    assert round_away(-.7) == -1.
+    assert round_away(0.) == 0.
+
+def test_round_double():
+    def almost_equal(x, y):
+        assert round(abs(x-y), 7) == 0
+
+    almost_equal(round_double(0.125, 2), 0.13)
+    almost_equal(round_double(0.375, 2), 0.38)
+    almost_equal(round_double(0.625, 2), 0.63)
+    almost_equal(round_double(0.875, 2), 0.88)
+    almost_equal(round_double(-0.125, 2), -0.13)
+    almost_equal(round_double(-0.375, 2), -0.38)
+    almost_equal(round_double(-0.625, 2), -0.63)
+    almost_equal(round_double(-0.875, 2), -0.88)
+
+    almost_equal(round_double(0.25, 1), 0.3)
+    almost_equal(round_double(0.75, 1), 0.8)
+    almost_equal(round_double(-0.25, 1), -0.3)
+    almost_equal(round_double(-0.75, 1), -0.8)
+
+    round_double(-6.5, 0) == -7.0
+    round_double(-5.5, 0) == -6.0
+    round_double(-1.5, 0) == -2.0
+    round_double(-0.5, 0) == -1.0
+    round_double(0.5, 0) == 1.0
+    round_double(1.5, 0) == 2.0
+    round_double(2.5, 0) == 3.0
+    round_double(3.5, 0) == 4.0
+    round_double(4.5, 0) == 5.0
+    round_double(5.5, 0) == 6.0
+    round_double(6.5, 0) == 7.0
+
+    round_double(-25.0, -1) == -30.0
+    round_double(-15.0, -1) == -20.0
+    round_double(-5.0, -1) == -10.0
+    round_double(5.0, -1) == 10.0
+    round_double(15.0, -1) == 20.0
+    round_double(25.0, -1) == 30.0
+    round_double(35.0, -1) == 40.0
+    round_double(45.0, -1) == 50.0
+    round_double(55.0, -1) == 60.0
+    round_double(65.0, -1) == 70.0
+    round_double(75.0, -1) == 80.0
+    round_double(85.0, -1) == 90.0
+    round_double(95.0, -1) == 100.0
+    round_double(12325.0, -1) == 12330.0
+
+    round_double(350.0, -2) == 400.0
+    round_double(450.0, -2) == 500.0
+
+    almost_equal(round_double(0.5e21, -21), 1e21)
+    almost_equal(round_double(1.5e21, -21), 2e21)
+    almost_equal(round_double(2.5e21, -21), 3e21)
+    almost_equal(round_double(5.5e21, -21), 6e21)
+    almost_equal(round_double(8.5e21, -21), 9e21)
+
+    almost_equal(round_double(-1.5e22, -22), -2e22)
+    almost_equal(round_double(-0.5e22, -22), -1e22)
+    almost_equal(round_double(0.5e22, -22), 1e22)
+    almost_equal(round_double(1.5e22, -22), 2e22)
+
+def test_round_half_even():
+    from rpython.rlib import rfloat
+    for func in (rfloat.round_double_short_repr,
+                 rfloat.round_double_fallback_repr):
+        # 2.x behavior
+        assert func(2.5, 0, False) == 3.0
+        # 3.x behavior
+        assert func(2.5, 0, True) == 2.0
+
+def test_break_up_float():
+    assert break_up_float('1') == ('', '1', '', '')
+    assert break_up_float('+1') == ('+', '1', '', '')
+    assert break_up_float('-1') == ('-', '1', '', '')
+
+    assert break_up_float('.5') == ('', '', '5', '')
+
+    assert break_up_float('1.2e3') == ('', '1', '2', '3')
+    assert break_up_float('1.2e+3') == ('', '1', '2', '+3')
+    assert break_up_float('1.2e-3') == ('', '1', '2', '-3')
+
+    # some that will get thrown out on return:
+    assert break_up_float('.') == ('', '', '', '')
+    assert break_up_float('+') == ('+', '', '', '')
+    assert break_up_float('-') == ('-', '', '', '')
+    assert break_up_float('e1') == ('', '', '', '1')
+
+    py.test.raises(ValueError, break_up_float, 'e')
+
+
+def test_float_as_rbigint_ratio():
+    for f, ratio in [
+        (0.875, (7, 8)),
+        (-0.875, (-7, 8)),
+        (0.0, (0, 1)),
+        (11.5, (23, 2)),
+        ]:
+        num, den = float_as_rbigint_ratio(f)
+        assert num.eq(rbigint.fromint(ratio[0]))
+        assert den.eq(rbigint.fromint(ratio[1]))
+
+    with py.test.raises(OverflowError):
+        float_as_rbigint_ratio(float('inf'))
+    with py.test.raises(OverflowError):
+        float_as_rbigint_ratio(float('-inf'))
+    with py.test.raises(ValueError):
+        float_as_rbigint_ratio(float('nan'))
diff --git a/rpython/rtyper/test/test_rfloat.py b/rpython/rtyper/test/test_rfloat.py
--- a/rpython/rtyper/test/test_rfloat.py
+++ b/rpython/rtyper/test/test_rfloat.py
@@ -216,26 +216,6 @@
             # https://bugzilla.novell.com/show_bug.cgi?id=692493
             assert not self.interpret(fn, [1e200, 1e200]) # nan
 
-    def test_break_up_float(self):
-        from rpython.rlib.rfloat import break_up_float
-        assert break_up_float('1') == ('', '1', '', '')
-        assert break_up_float('+1') == ('+', '1', '', '')
-        assert break_up_float('-1') == ('-', '1', '', '')
-
-        assert break_up_float('.5') == ('', '', '5', '')
-
-        assert break_up_float('1.2e3') == ('', '1', '2', '3')
-        assert break_up_float('1.2e+3') == ('', '1', '2', '+3')
-        assert break_up_float('1.2e-3') == ('', '1', '2', '-3')
-
-        # some that will get thrown out on return:
-        assert break_up_float('.') == ('', '', '', '')
-        assert break_up_float('+') == ('+', '', '', '')
-        assert break_up_float('-') == ('-', '', '', '')
-        assert break_up_float('e1') == ('', '', '', '1')
-
-        py.test.raises(ValueError, break_up_float, 'e')
-
     def test_formatd(self):
         from rpython.rlib.rfloat import formatd
         def f(x):
@@ -296,93 +276,6 @@
         assert self.interpret(func, [0]) == 1e23
         assert self.interpret(func, [1]) == -1e23
 
-    def test_copysign(self):
-        from rpython.rlib.rfloat import copysign
-        assert copysign(1, 1) == 1
-        assert copysign(-1, 1) == 1
-        assert copysign(-1, -1) == -1
-        assert copysign(1, -1) == -1
-        assert copysign(1, -0.) == -1
-
-    def test_round_away(self):
-        from rpython.rlib.rfloat import round_away
-        assert round_away(.1) == 0.
-        assert round_away(.5) == 1.
-        assert round_away(.7) == 1.
-        assert round_away(1.) == 1.
-        assert round_away(-.5) == -1.
-        assert round_away(-.1) == 0.
-        assert round_away(-.7) == -1.
-        assert round_away(0.) == 0.
-
-    def test_round_double(self):
-        from rpython.rlib.rfloat import round_double
-        def almost_equal(x, y):
-            assert round(abs(x-y), 7) == 0
-
-        almost_equal(round_double(0.125, 2), 0.13)
-        almost_equal(round_double(0.375, 2), 0.38)
-        almost_equal(round_double(0.625, 2), 0.63)
-        almost_equal(round_double(0.875, 2), 0.88)
-        almost_equal(round_double(-0.125, 2), -0.13)
-        almost_equal(round_double(-0.375, 2), -0.38)
-        almost_equal(round_double(-0.625, 2), -0.63)
-        almost_equal(round_double(-0.875, 2), -0.88)
-
-        almost_equal(round_double(0.25, 1), 0.3)
-        almost_equal(round_double(0.75, 1), 0.8)
-        almost_equal(round_double(-0.25, 1), -0.3)
-        almost_equal(round_double(-0.75, 1), -0.8)
-
-        round_double(-6.5, 0) == -7.0
-        round_double(-5.5, 0) == -6.0
-        round_double(-1.5, 0) == -2.0
-        round_double(-0.5, 0) == -1.0
-        round_double(0.5, 0) == 1.0
-        round_double(1.5, 0) == 2.0
-        round_double(2.5, 0) == 3.0
-        round_double(3.5, 0) == 4.0
-        round_double(4.5, 0) == 5.0
-        round_double(5.5, 0) == 6.0
-        round_double(6.5, 0) == 7.0
-
-        round_double(-25.0, -1) == -30.0
-        round_double(-15.0, -1) == -20.0
-        round_double(-5.0, -1) == -10.0
-        round_double(5.0, -1) == 10.0
-        round_double(15.0, -1) == 20.0
-        round_double(25.0, -1) == 30.0
-        round_double(35.0, -1) == 40.0
-        round_double(45.0, -1) == 50.0
-        round_double(55.0, -1) == 60.0
-        round_double(65.0, -1) == 70.0
-        round_double(75.0, -1) == 80.0
-        round_double(85.0, -1) == 90.0
-        round_double(95.0, -1) == 100.0
-        round_double(12325.0, -1) == 12330.0
-
-        round_double(350.0, -2) == 400.0
-        round_double(450.0, -2) == 500.0
-
-        almost_equal(round_double(0.5e21, -21), 1e21)
-        almost_equal(round_double(1.5e21, -21), 2e21)
-        almost_equal(round_double(2.5e21, -21), 3e21)
-        almost_equal(round_double(5.5e21, -21), 6e21)
-        almost_equal(round_double(8.5e21, -21), 9e21)
-
-        almost_equal(round_double(-1.5e22, -22), -2e22)
-        almost_equal(round_double(-0.5e22, -22), -1e22)
-        almost_equal(round_double(0.5e22, -22), 1e22)
-        almost_equal(round_double(1.5e22, -22), 2e22)
-
-    def test_round_half_even(self):
-        from rpython.rlib import rfloat
-        for func in (rfloat.round_double_short_repr,
-                     rfloat.round_double_fallback_repr):
-            # 2.x behavior
-            assert func(2.5, 0, False) == 3.0
-            # 3.x behavior
-            assert func(2.5, 0, True) == 2.0
 
 
 class TestLLtype(BaseTestRfloat, LLRtypeMixin):


More information about the pypy-commit mailing list