Author: Alex Gaynor <alex.gay...@gmail.com>
Branch: 
Changeset: r61268:71233ccceb29
Date: 2013-02-15 08:18 -0800
http://bitbucket.org/pypy/pypy/changeset/71233ccceb29/

Log:    merged upstream

diff --git a/pypy/interpreter/test2/test_app_main.py 
b/pypy/interpreter/test2/test_app_main.py
--- a/pypy/interpreter/test2/test_app_main.py
+++ b/pypy/interpreter/test2/test_app_main.py
@@ -208,11 +208,6 @@
     These tests require pexpect (UNIX-only).
     http://pexpect.sourceforge.net/
     """
-    def setup_class(cls):
-        # some tests need to be able to import test2, change the cwd
-        goal_dir = 
os.path.abspath(os.path.join(os.path.realpath(os.path.dirname(__file__)), '..'))
-        os.chdir(goal_dir)
-
     def _spawn(self, *args, **kwds):
         try:
             import pexpect
@@ -456,13 +451,14 @@
         child.expect('789')    # expect to see it before the timeout hits
         child.sendline('X')
 
-    def test_options_i_m(self):
+    def test_options_i_m(self, monkeypatch):
         if sys.platform == "win32":
             skip("close_fds is not supported on Windows platforms")
         if not hasattr(runpy, '_run_module_as_main'):
             skip("requires CPython >= 2.6")
         p = os.path.join(os.path.realpath(os.path.dirname(__file__)), 
'mymodule.py')
         p = os.path.abspath(p)
+        monkeypatch.chdir(os.path.dirname(app_main))
         child = self.spawn(['-i',
                             '-m', 'test2.mymodule',
                             'extra'])
@@ -562,12 +558,13 @@
         child.sendline('Not at all. They could be carried.')
         child.expect('A five ounce bird could not carry a one pound coconut.')
 
-    def test_no_space_before_argument(self):
+    def test_no_space_before_argument(self, monkeypatch):
         if not hasattr(runpy, '_run_module_as_main'):
             skip("requires CPython >= 2.6")
         child = self.spawn(['-cprint "hel" + "lo"'])
         child.expect('hello')
 
+        monkeypatch.chdir(os.path.dirname(app_main))
         child = self.spawn(['-mtest2.mymodule'])
         child.expect('mymodule running')
 
@@ -667,11 +664,12 @@
                         '-c "import sys; print sys.warnoptions"')
         assert "['ignore', 'default', 'once', 'error']" in data
 
-    def test_option_m(self):
+    def test_option_m(self, monkeypatch):
         if not hasattr(runpy, '_run_module_as_main'):
             skip("requires CPython >= 2.6")
         p = os.path.join(os.path.realpath(os.path.dirname(__file__)), 
'mymodule.py')
         p = os.path.abspath(p)
+        monkeypatch.chdir(os.path.dirname(app_main))
         data = self.run('-m test2.mymodule extra')
         assert 'mymodule running' in data
         assert 'Name: __main__' in data
diff --git a/pypy/module/micronumpy/test/test_module.py 
b/pypy/module/micronumpy/test/test_module.py
--- a/pypy/module/micronumpy/test/test_module.py
+++ b/pypy/module/micronumpy/test/test_module.py
@@ -13,11 +13,13 @@
         assert sum(array(range(10))) == 45
 
     def test_min(self):
-        from _numpypy import array, min
+        from _numpypy import array, min, zeros
         assert min(range(10)) == 0
         assert min(array(range(10))) == 0
+        assert list(min(zeros((0, 2)), axis=1)) == []
 
     def test_max(self):
-        from _numpypy import array, max
+        from _numpypy import array, max, zeros
         assert max(range(10)) == 9
         assert max(array(range(10))) == 9
+        assert list(max(zeros((0, 2)), axis=1)) == []
diff --git a/pypy/module/micronumpy/test/test_numarray.py 
b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -1662,13 +1662,13 @@
         b = array([0, 1, 2], dtype=complex).astype(bool)
         assert (b == [False, True, True]).all()
         assert b.dtype == 'bool'
-        
+
         a = arange(6, dtype='f4').reshape(2,3)
         b = a.astype('i4')
 
         a = array('x').astype('S3').dtype
         assert a.itemsize == 3
-        
+
     def test_base(self):
         from _numpypy import array
         assert array(1).base is None
@@ -1679,6 +1679,11 @@
 
     def test_byteswap(self):
         from _numpypy import array
+
+        s1 = array(1.).byteswap().tostring()
+        s2 = array([1.]).byteswap().tostring()
+        assert s1 == s2
+
         a = array([1, 256 + 2, 3], dtype='i2')
         assert (a.byteswap() == [0x0100, 0x0201, 0x0300]).all()
         assert (a == [1, 256 + 2, 3]).all()
@@ -1686,39 +1691,40 @@
         assert (a == [0x0100, 0x0201, 0x0300]).all()
 
         a = array([1, -1, 1e300], dtype=float)
-        s1 = map(ord,a.tostring())
+        s1 = map(ord, a.tostring())
         s2 = map(ord, a.byteswap().tostring())
-        assert s1[7::-1] == s2[:8]
-        assert s1[15:7:-1] == s2[8:16]
-        assert s1[:15:-1] == s2[16:]
+        assert a.dtype.itemsize == 8
+        for i in range(a.size):
+            i1 = i * a.dtype.itemsize
+            i2 = (i+1) * a.dtype.itemsize
+            assert list(reversed(s1[i1:i2])) == s2[i1:i2]
 
         a = array([1+1e30j, -1, 1e10], dtype=complex)
-        s1 = map(ord,a.tostring())
+        s1 = map(ord, a.tostring())
         s2 = map(ord, a.byteswap().tostring())
-        assert s1[7::-1] == s2[:8]
-        assert s1[15:7:-1] == s2[8:16]
-        assert s1[23:15:-1] == s2[16:24]
-        assert s1[31:23:-1] == s2[24:32]
-        assert s1[39:31:-1] == s2[32:40]
-        assert s1[:39:-1] == s2[40:]
+        assert a.dtype.itemsize == 16
+        for i in range(a.size*2):
+            i1 = i * a.dtype.itemsize/2
+            i2 = (i+1) * a.dtype.itemsize/2
+            assert list(reversed(s1[i1:i2])) == s2[i1:i2]
 
         a = array([3.14, -1.5, 10000], dtype='float16')
-        s1 = map(ord,a.tostring())
+        s1 = map(ord, a.tostring())
         s2 = map(ord, a.byteswap().tostring())
-        s3 = [s1[1], s1[0],s1[3], s1[2], s1[5], s1[4]]
-        assert s3 == s2
+        assert a.dtype.itemsize == 2
+        for i in range(a.size):
+            i1 = i * a.dtype.itemsize
+            i2 = (i+1) * a.dtype.itemsize
+            assert list(reversed(s1[i1:i2])) == s2[i1:i2]
 
         a = array([1, -1, 10000], dtype='longfloat')
-        s1 = map(ord,a.tostring())
-        s2 = map(ord, a.byteswap().tostring())
-        n = a.dtype.itemsize
-        assert s1[n-1] == s2[0]
-
-        a = array(0., dtype='longfloat')
         s1 = map(ord, a.tostring())
         s2 = map(ord, a.byteswap().tostring())
-        n = a.dtype.itemsize
-        assert s1[n-1] == s2[0]
+        assert a.dtype.itemsize >= 8
+        for i in range(a.size):
+            i1 = i * a.dtype.itemsize
+            i2 = (i+1) * a.dtype.itemsize
+            assert list(reversed(s1[i1:i2])) == s2[i1:i2]
 
     def test_clip(self):
         from _numpypy import array
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -14,8 +14,8 @@
 from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rlib.rstruct.runpack import runpack
 from rpython.rlib.rstruct.nativefmttable import native_is_bigendian
-from rpython.rlib.rstruct.ieee import (float_pack, float_unpack, pack_float80,
-                                    unpack_float, unpack_float128)
+from rpython.rlib.rstruct.ieee import (float_pack, float_unpack, unpack_float,
+                                       pack_float80, unpack_float80)
 from rpython.tool.sourcetools import func_with_new_name
 from rpython.rlib import jit
 from rpython.rlib.rstring import StringBuilder
@@ -958,7 +958,6 @@
         swapped_value = byteswap(rffi.cast(self.T, value))
         raw_storage_setitem(storage, i + offset, swapped_value)
 
-
 class Float32(BaseType, Float):
     _attrs_ = ()
 
@@ -1505,7 +1504,6 @@
     BoxType = interp_boxes.W_Complex64Box
     ComponentBoxType = interp_boxes.W_Float32Box
 
-
 NonNativeComplex64 = Complex64
 
 class Complex128(ComplexFloating, BaseType):
@@ -1515,7 +1513,6 @@
     BoxType = interp_boxes.W_Complex128Box
     ComponentBoxType = interp_boxes.W_Float64Box
 
-
 NonNativeComplex128 = Complex128
 
 if interp_boxes.long_double_size == 12:
@@ -1528,17 +1525,16 @@
 
         def runpack_str(self, s):
             assert len(s) == 12
-            fval = unpack_float128(s, native_is_bigendian)
+            fval = unpack_float80(s, native_is_bigendian)
             return self.box(fval)
 
         def byteswap(self, w_v):
             value = self.unbox(w_v)
             result = StringBuilder(12)
-            pack_float80(result, value, 12, not native_is_bigendian)
-            return self.box(unpack_float128(result.build(), 
native_is_bigendian))
+            pack_float80(result, value, not native_is_bigendian)
+            return self.box(unpack_float80(result.build(), 
native_is_bigendian))
 
-    class NonNativeFloat96(Float96):
-        pass
+    NonNativeFloat96 = Float96
 
     class Complex192(ComplexFloating, BaseType):
         _attrs_ = ()
@@ -1549,7 +1545,6 @@
 
     NonNativeComplex192 = Complex192
 
-
 elif interp_boxes.long_double_size == 16:
     class Float128(BaseType, Float):
         _attrs_ = ()
@@ -1560,14 +1555,14 @@
 
         def runpack_str(self, s):
             assert len(s) == 16
-            fval = unpack_float128(s, native_is_bigendian)
+            fval = unpack_float80(s, native_is_bigendian)
             return self.box(fval)
 
         def byteswap(self, w_v):
             value = self.unbox(w_v)
             result = StringBuilder(16)
-            pack_float80(result, value, 16, not native_is_bigendian)
-            return self.box(unpack_float128(result.build(), 
native_is_bigendian))
+            pack_float80(result, value, not native_is_bigendian)
+            return self.box(unpack_float80(result.build(), 
native_is_bigendian))
 
     NonNativeFloat128 = Float128
 
@@ -1578,7 +1573,6 @@
         BoxType = interp_boxes.W_Complex256Box
         ComponentBoxType = interp_boxes.W_Float128Box
 
-
     NonNativeComplex256 = Complex256
 
 class BaseStringType(object):
diff --git a/pypy/module/sys/initpath.py b/pypy/module/sys/initpath.py
--- a/pypy/module/sys/initpath.py
+++ b/pypy/module/sys/initpath.py
@@ -67,6 +67,8 @@
     stdlib.
     If it cannot be found, return (None, None).
     """
+    if executable == '':
+        return None, None
     search = executable
     while True:
         dirname = resolvedirof(search)
diff --git a/pypy/module/sys/test/test_initpath.py 
b/pypy/module/sys/test/test_initpath.py
--- a/pypy/module/sys/test/test_initpath.py
+++ b/pypy/module/sys/test/test_initpath.py
@@ -10,12 +10,15 @@
     b = prefix.join('lib-python', dirname).ensure(dir=1)
     return a, b
 
-def test_find_stdlib(tmpdir):
+def test_find_stdlib(tmpdir, monkeypatch):
     bin_dir = tmpdir.join('bin').ensure(dir=True)
     pypy = bin_dir.join('pypy').ensure(file=True)
     build_hierarchy(tmpdir)
     path, prefix = find_stdlib(None, str(pypy))
     assert prefix == tmpdir
+    # shouldn't find stdlib if executable == '' even if parent dir has a stdlib
+    monkeypatch.chdir(tmpdir.join('bin'))
+    assert find_stdlib(None, '') == (None, None)
 
 @py.test.mark.skipif('not hasattr(os, "symlink")')
 def test_find_stdlib_follow_symlink(tmpdir):
@@ -84,6 +87,7 @@
     assert find_executable('pypy') == a.join('pypy.exe')
 
 def test_resolvedirof(tmpdir):
+    assert resolvedirof('') == os.path.abspath(os.path.join(os.getcwd(), '..'))
     foo = tmpdir.join('foo').ensure(dir=True)
     bar = tmpdir.join('bar').ensure(dir=True)
     myfile = foo.join('myfile').ensure(file=True)
diff --git a/pypy/module/test_lib_pypy/numpypy/core/test_fromnumeric.py 
b/pypy/module/test_lib_pypy/numpypy/core/test_fromnumeric.py
--- a/pypy/module/test_lib_pypy/numpypy/core/test_fromnumeric.py
+++ b/pypy/module/test_lib_pypy/numpypy/core/test_fromnumeric.py
@@ -127,7 +127,7 @@
         assert reshape(a, (1, -1)).shape == (1, 105)
         assert reshape(a, (1, 1, -1)).shape == (1, 1, 105)
         assert reshape(a, (-1, 1, 1)).shape == (105, 1, 1)
-    
+
     def test_transpose(self):   
         from numpypy import arange, array, transpose, ones
         x = arange(4).reshape((2,2))
@@ -136,7 +136,7 @@
         raises(NotImplementedError, "transpose(x, axes=(1, 0, 2))")
         # x = ones((1, 2, 3))
         # assert transpose(x, (1, 0, 2)).shape == (2, 1, 3)
-    
+
     def test_fromnumeric(self):
         from numpypy import array, swapaxes
         x = array([[1,2,3]])
diff --git a/pypy/module/test_lib_pypy/numpypy/test_numpy.py 
b/pypy/module/test_lib_pypy/numpypy/test_numpy.py
--- a/pypy/module/test_lib_pypy/numpypy/test_numpy.py
+++ b/pypy/module/test_lib_pypy/numpypy/test_numpy.py
@@ -8,3 +8,11 @@
             pass
         import numpypy
         import numpy     # works after 'numpypy' has been imported
+
+    def test_min_max_after_import(self):
+        from numpypy import *
+        assert min(1, 100) == 1
+        assert min(100, 1) == 1
+
+        assert max(1, 100) == 100
+        assert max(100, 1) == 100
diff --git a/pypy/module/test_lib_pypy/test_datetime.py 
b/pypy/module/test_lib_pypy/test_datetime.py
--- a/pypy/module/test_lib_pypy/test_datetime.py
+++ b/pypy/module/test_lib_pypy/test_datetime.py
@@ -66,9 +66,12 @@
     """
     import os
     import time
+    if os.name == 'nt':
+        skip("setting os.environ['TZ'] ineffective on windows")
     try:
         prev_tz = os.environ.get("TZ")
         os.environ["TZ"] = "GMT"
+        time.tzset()
         for unused in xrange(100):
             now = time.time()
             delta = (datetime.datetime.utcfromtimestamp(now) -
@@ -79,6 +82,7 @@
             del os.environ["TZ"]
         else:
             os.environ["TZ"] = prev_tz
+        time.tzset()
 
 def test_utcfromtimestamp_microsecond():
     dt = datetime.datetime.utcfromtimestamp(0)
diff --git a/rpython/rlib/rarithmetic.py b/rpython/rlib/rarithmetic.py
--- a/rpython/rlib/rarithmetic.py
+++ b/rpython/rlib/rarithmetic.py
@@ -630,21 +630,16 @@
          uint2singlefloat, singlefloat2uint
 
     T = lltype.typeOf(arg)
-    is_float = False
-    is_single_float = False
     if T == lltype.SingleFloat:
-        T = rffi.UINT
-        is_single_float = True
         arg = singlefloat2uint(arg)
     elif T == lltype.Float:
-        is_float = True
-        T = rffi.LONGLONG
         arg = float2longlong(arg)
     elif T == lltype.LongFloat:
         assert False
     else:
         # we cannot do arithmetics on small ints
         arg = widen(arg)
+
     if rffi.sizeof(T) == 1:
         res = arg
     elif rffi.sizeof(T) == 2:
@@ -667,9 +662,9 @@
                (f >> 24) | (g >> 40) | (h >> 56))
     else:
         assert False # unreachable code
-    if is_single_float:
+
+    if T == lltype.SingleFloat:
         return uint2singlefloat(rffi.cast(rffi.UINT, res))
-    if is_float:
-        res = rffi.cast(rffi.LONGLONG, res)
-        return longlong2float(res)
+    if T == lltype.Float:
+        return longlong2float(rffi.cast(rffi.LONGLONG, res))
     return rffi.cast(T, res)
diff --git a/rpython/rlib/rstruct/ieee.py b/rpython/rlib/rstruct/ieee.py
--- a/rpython/rlib/rstruct/ieee.py
+++ b/rpython/rlib/rstruct/ieee.py
@@ -235,12 +235,12 @@
     result.append("".join(l))
 
 @jit.unroll_safe
-def pack_float80(result, x, size, be):
+def pack_float80(result, x, be):
     l = []
     unsigned = float_pack80(x)
     for i in range(8):
         l.append(chr((unsigned[0] >> (i * 8)) & 0xFF))
-    for i in range(size - 8):
+    for i in range(2):
         l.append(chr((unsigned[1] >> (i * 8)) & 0xFF))
     if be:
         l.reverse()
@@ -253,12 +253,14 @@
         unsigned |= r_ulonglong(c) << (i * 8)
     return float_unpack(unsigned, len(s))
 
-def unpack_float128(s, be):
+def unpack_float80(s, be):
+    if len(s) != 10:
+        raise ValueError
     QQ = [r_ulonglong(0), r_ulonglong(0)]
     for i in range(8):
-        c = ord(s[len(s) - 1 - i if be else i])
+        c = ord(s[9 - i if be else i])
         QQ[0] |= r_ulonglong(c) << (i * 8)
-    for i in range(8, len(s)):
-        c = ord(s[len(s) - 1 - i if be else i])
+    for i in range(8, 10):
+        c = ord(s[9 - i if be else i])
         QQ[1] |= r_ulonglong(c) << ((i - 8) * 8)
     return float_unpack80(QQ)
diff --git a/rpython/rlib/rstruct/runpack.py b/rpython/rlib/rstruct/runpack.py
--- a/rpython/rlib/rstruct/runpack.py
+++ b/rpython/rlib/rstruct/runpack.py
@@ -46,7 +46,7 @@
     def __init__(self, fmt):
         self.formats = []
         self.fmt = fmt
-    
+
     def operate(self, fmtdesc, repetitions):
         if fmtdesc.needcount:
             self.formats.append((fmtdesc, repetitions, None))
@@ -110,5 +110,3 @@
     unpacker = create_unpacker(fmt)
     return unpacker.unpack(input)
 runpack._annspecialcase_ = 'specialize:arg(0)'
-
-    
diff --git a/rpython/rlib/rstruct/test/test_ieee.py 
b/rpython/rlib/rstruct/test/test_ieee.py
--- a/rpython/rlib/rstruct/test/test_ieee.py
+++ b/rpython/rlib/rstruct/test/test_ieee.py
@@ -1,9 +1,12 @@
-import py, sys
+import py
+import sys
 import random
 import struct
 
-from rpython.rlib.rfloat import isnan
-from rpython.rlib.rstruct.ieee import float_pack, float_unpack, float_pack80, 
float_unpack80
+from rpython.rlib.rstruct import ieee
+from rpython.rlib.rfloat import isnan, NAN, INFINITY
+from rpython.translator.c.test.test_genc import compile
+
 
 class TestFloatPacking:
     def setup_class(cls):
@@ -12,17 +15,29 @@
 
     def check_float(self, x):
         # check roundtrip
-        Q = float_pack(x, 8)
-        y = float_unpack(Q, 8)
-        assert repr(x) == repr(y)
+        Q = ieee.float_pack(x, 8)
+        y = ieee.float_unpack(Q, 8)
+        assert repr(x) == repr(y), '%r != %r, Q=%r' % (x, y, Q)
 
-        Q = float_pack80(x)
-        y = float_unpack80(Q)
-        assert repr(x) == repr(y),'%r != %r, Q=%r'%(x, y, Q)
+        Q = ieee.float_pack80(x)
+        y = ieee.float_unpack80(Q)
+        assert repr(x) == repr(y), '%r != %r, Q=%r' % (x, y, Q)
+
+        Q = []
+        ieee.pack_float(Q, x, 8, False)
+        Q = Q[0]
+        y = ieee.unpack_float(Q, False)
+        assert repr(x) == repr(y), '%r != %r, Q=%r' % (x, y, Q)
+
+        Q = []
+        ieee.pack_float80(Q, x, False)
+        Q = Q[0]
+        y = ieee.unpack_float80(Q, False)
+        assert repr(x) == repr(y), '%r != %r, Q=%r' % (x, y, Q)
 
         # check that packing agrees with the struct module
         struct_pack8 = struct.unpack('<Q', struct.pack('<d', x))[0]
-        float_pack8 = float_pack(x, 8)
+        float_pack8 = ieee.float_pack(x, 8)
         assert struct_pack8 == float_pack8
 
         # check that packing agrees with the struct module
@@ -31,7 +46,7 @@
         except OverflowError:
             struct_pack4 = "overflow"
         try:
-            float_pack4 = float_pack(x, 4)
+            float_pack4 = ieee.float_pack(x, 4)
         except OverflowError:
             float_pack4 = "overflow"
         assert struct_pack4 == float_pack4
@@ -40,16 +55,16 @@
             return
 
         # if we didn't overflow, try round-tripping the binary32 value
-        roundtrip = float_pack(float_unpack(float_pack4, 4), 4)
+        roundtrip = ieee.float_pack(ieee.float_unpack(float_pack4, 4), 4)
         assert float_pack4 == roundtrip
 
         try:
-            float_pack2 = float_pack(x, 2)
+            float_pack2 = ieee.float_pack(x, 2)
         except OverflowError:
             return
 
-        roundtrip = float_pack(float_unpack(float_pack2, 2), 2)
-        assert (float_pack2,x) == (roundtrip,x)
+        roundtrip = ieee.float_pack(ieee.float_unpack(float_pack2, 2), 2)
+        assert (float_pack2, x) == (roundtrip, x)
 
     def test_infinities(self):
         self.check_float(float('inf'))
@@ -61,23 +76,23 @@
 
     def test_check_size(self):
         # these were refactored into separate pack80/unpack80 functions
-        py.test.raises(ValueError, float_pack, 1.0, 12)
-        py.test.raises(ValueError, float_pack, 1.0, 16)
-        py.test.raises(ValueError, float_unpack, 1, 12)
-        py.test.raises(ValueError, float_unpack, 1, 16)
+        py.test.raises(ValueError, ieee.float_pack, 1.0, 12)
+        py.test.raises(ValueError, ieee.float_pack, 1.0, 16)
+        py.test.raises(ValueError, ieee.float_unpack, 1, 12)
+        py.test.raises(ValueError, ieee.float_unpack, 1, 16)
 
     def test_nans(self):
-        Q = float_pack80(float('nan'))
-        y = float_unpack80(Q)
+        Q = ieee.float_pack80(float('nan'))
+        y = ieee.float_unpack80(Q)
         assert repr(y) == 'nan'
-        Q = float_pack(float('nan'), 8)
-        y = float_unpack(Q, 8)
+        Q = ieee.float_pack(float('nan'), 8)
+        y = ieee.float_unpack(Q, 8)
         assert repr(y) == 'nan'
-        L = float_pack(float('nan'), 4)
-        z = float_unpack(L, 4)
+        L = ieee.float_pack(float('nan'), 4)
+        z = ieee.float_unpack(L, 4)
         assert repr(z) == 'nan'
-        L = float_pack(float('nan'), 2)
-        z = float_unpack(L, 2)
+        L = ieee.float_pack(float('nan'), 2)
+        z = ieee.float_unpack(L, 2)
         assert repr(z) == 'nan'
 
     def test_simple(self):
@@ -138,22 +153,22 @@
 
     def test_halffloat_exact(self):
         #testcases generated from numpy.float16(x).view('uint16')
-        cases = [[0, 0], [10, 18688], [-10, 51456], [10e3, 28898], 
+        cases = [[0, 0], [10, 18688], [-10, 51456], [10e3, 28898],
                  [float('inf'), 31744], [-float('inf'), 64512]]
-        for c,h in cases:
-            hbit = float_pack(c, 2)
+        for c, h in cases:
+            hbit = ieee.float_pack(c, 2)
             assert hbit == h
-            assert c == float_unpack(h, 2)
+            assert c == ieee.float_unpack(h, 2)
 
     def test_halffloat_inexact(self):
         #testcases generated from numpy.float16(x).view('uint16')
         cases = [[10.001, 18688, 10.], [-10.001, 51456, -10],
                  [0.027588, 10000, 0.027587890625],
                  [22001, 30047, 22000]]
-        for c,h,f in cases:
-            hbit = float_pack(c, 2)
+        for c, h, f in cases:
+            hbit = ieee.float_pack(c, 2)
             assert hbit == h
-            assert f == float_unpack(h, 2)
+            assert f == ieee.float_unpack(h, 2)
 
     def test_halffloat_overunderflow(self):
         import math
@@ -161,8 +176,43 @@
                  [1e-08, 0], [-1e-8, -0.]]
         for f1, f2 in cases:
             try:
-                f_out = float_unpack(float_pack(f1, 2), 2)
+                f_out = ieee.float_unpack(ieee.float_pack(f1, 2), 2)
             except OverflowError:
                 f_out = math.copysign(float('inf'), f1)
             assert f_out == f2
             assert math.copysign(1., f_out) == math.copysign(1., f2)
+
+
+class TestCompiled:
+    def test_pack_float(self):
+        def pack(x, size):
+            result = []
+            ieee.pack_float(result, x, size, False)
+            l = []
+            for x in result:
+                for c in x:
+                    l.append(str(ord(c)))
+            return ','.join(l)
+        c_pack = compile(pack, [float, int])
+
+        def unpack(s):
+            l = s.split(',')
+            s = ''.join([chr(int(x)) for x in l])
+            return ieee.unpack_float(s, False)
+        c_unpack = compile(unpack, [str])
+
+        def check_roundtrip(x, size):
+            s = c_pack(x, size)
+            assert s == pack(x, size)
+            if not isnan(x):
+                assert unpack(s) == x
+                assert c_unpack(s) == x
+            else:
+                assert isnan(unpack(s))
+                assert isnan(c_unpack(s))
+
+        for size in [2, 4, 8]:
+            check_roundtrip(123.4375, size)
+            check_roundtrip(-123.4375, size)
+            check_roundtrip(INFINITY, size)
+            check_roundtrip(NAN, size)
diff --git a/rpython/rlib/rstruct/test/test_runpack.py 
b/rpython/rlib/rstruct/test/test_runpack.py
new file mode 100644
--- /dev/null
+++ b/rpython/rlib/rstruct/test/test_runpack.py
@@ -0,0 +1,33 @@
+from rpython.rtyper.test.tool import BaseRtypingTest, LLRtypeMixin, 
OORtypeMixin
+from rpython.rlib.rstruct.runpack import runpack
+from rpython.rlib.rarithmetic import LONG_BIT
+import struct
+
+class BaseTestRStruct(BaseRtypingTest):
+    def test_unpack(self):
+        pad = '\x00' * (LONG_BIT//8-1)    # 3 or 7 null bytes
+        def fn():
+            return runpack('sll', 'a'+pad+'\x03'+pad+'\x04'+pad)[1]
+        assert fn() == 3
+        assert self.interpret(fn, []) == 3
+
+    def test_unpack_2(self):
+        data = struct.pack('iiii', 0, 1, 2, 4)
+        def fn():
+            a, b, c, d = runpack('iiii', data)
+            return a * 1000 + b * 100 + c * 10 + d
+        assert fn() == 124
+        assert self.interpret(fn, []) == 124
+
+    def test_unpack_single(self):
+        data = struct.pack('i', 123)
+        def fn():
+            return runpack('i', data)
+        assert fn() == 123
+        assert self.interpret(fn, []) == 123
+
+class TestLLType(BaseTestRStruct, LLRtypeMixin):
+    pass
+
+class TestOOType(BaseTestRStruct, OORtypeMixin):
+    pass
diff --git a/rpython/rlib/test/test_rarithmetic.py 
b/rpython/rlib/test/test_rarithmetic.py
--- a/rpython/rlib/test/test_rarithmetic.py
+++ b/rpython/rlib/test/test_rarithmetic.py
@@ -400,8 +400,8 @@
     
     assert rffi.cast(lltype.Signed, byteswap(rffi.cast(rffi.USHORT, 0x0102))) 
== 0x0201
     assert rffi.cast(lltype.Signed, byteswap(rffi.cast(rffi.INT, 0x01020304))) 
== 0x04030201
-    assert byteswap(rffi.cast(rffi.ULONGLONG, 0x0102030405060708L)) == 
0x0807060504030201L
-    assert byteswap(rffi.cast(rffi.LONGLONG, 0x0102030405060708L)) == 
0x0807060504030201L
+    assert byteswap(r_ulonglong(0x0102030405060708L)) == 
r_ulonglong(0x0807060504030201L)
+    assert byteswap(r_longlong(0x0102030405060708L)) == 
r_longlong(0x0807060504030201L)
     assert ((byteswap(2.3) - 1.903598566252326e+185) / 1e185) < 0.000001
     assert (rffi.cast(lltype.Float, byteswap(rffi.cast(lltype.SingleFloat, 
2.3))) - 4.173496037651603e-08) < 1e-16
 
diff --git a/rpython/rlib/test/test_rstruct.py 
b/rpython/rlib/test/test_rstruct.py
deleted file mode 100644
--- a/rpython/rlib/test/test_rstruct.py
+++ /dev/null
@@ -1,72 +0,0 @@
-
-from rpython.rtyper.test.tool import BaseRtypingTest, LLRtypeMixin, 
OORtypeMixin
-from rpython.rlib.rstruct.runpack import runpack
-from rpython.rlib.rstruct import ieee
-from rpython.rlib.rarithmetic import LONG_BIT
-from rpython.rlib.rfloat import INFINITY, NAN, isnan
-from rpython.translator.c.test.test_genc import compile
-import struct
-
-class BaseTestRStruct(BaseRtypingTest):
-    def test_unpack(self):
-        pad = '\x00' * (LONG_BIT//8-1)    # 3 or 7 null bytes
-        def fn():
-            return runpack('sll', 'a'+pad+'\x03'+pad+'\x04'+pad)[1]
-        assert fn() == 3
-        assert self.interpret(fn, []) == 3
-
-    def test_unpack_2(self):
-        data = struct.pack('iiii', 0, 1, 2, 4)
-        
-        def fn():
-            a, b, c, d = runpack('iiii', data)
-            return a * 1000 + b * 100 + c * 10 + d
-
-        assert fn() == 124
-        assert self.interpret(fn, []) == 124
-
-    def test_unpack_single(self):
-        data = struct.pack('i', 123)
-        def fn():
-            return runpack('i', data)
-        assert fn() == 123
-        assert self.interpret(fn, []) == 123
-
-class TestLLType(BaseTestRStruct, LLRtypeMixin):
-    pass
-
-class TestOOType(BaseTestRStruct, OORtypeMixin):
-    pass
-
-class TestCompiled:
-    def test_pack_float(self):
-        def pack(x):
-            result = []
-            ieee.pack_float(result, x, 8, False)
-            l = []
-            for x in result:
-                for c in x:
-                    l.append(str(ord(c)))
-            return ','.join(l)
-        c_pack = compile(pack, [float])
-        def unpack(s):
-            l = s.split(',')
-            s = ''.join([chr(int(x)) for x in l])
-            return ieee.unpack_float(s, False)
-        c_unpack = compile(unpack, [str])
-
-        def check_roundtrip(x):
-            s = c_pack(x)
-            assert s == pack(x)
-            if not isnan(x):
-                assert unpack(s) == x
-                assert c_unpack(s) == x
-            else:
-                assert isnan(unpack(s))
-                assert isnan(c_unpack(s))
-
-        check_roundtrip(123.456)
-        check_roundtrip(-123.456)
-        check_roundtrip(INFINITY)
-        check_roundtrip(NAN)
-
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to