Author: Brian Kearns <[email protected]>
Branch: numpy-newbyteorder
Changeset: r67879:dd6eb6413320
Date: 2013-11-07 19:17 -0500
http://bitbucket.org/pypy/pypy/changeset/dd6eb6413320/

Log:    provide newbyteorder() for numpy dtypes, test

diff --git a/pypy/module/micronumpy/conversion_utils.py 
b/pypy/module/micronumpy/conversion_utils.py
--- a/pypy/module/micronumpy/conversion_utils.py
+++ b/pypy/module/micronumpy/conversion_utils.py
@@ -1,6 +1,27 @@
 from pypy.interpreter.error import OperationError
 from pypy.module.micronumpy.constants import *
 
+
+def byteorder_converter(space, new_order):
+    endian = new_order[0]
+    if endian not in (NPY_BIG, NPY_LITTLE, NPY_NATIVE, NPY_IGNORE, NPY_SWAP):
+        ch = endian
+        if ch in ('b', 'B'):
+            endian = NPY_BIG
+        elif ch in ('l', 'L'):
+            endian = NPY_LITTLE
+        elif ch in ('n', 'N'):
+            endian = NPY_NATIVE
+        elif ch in ('i', 'I'):
+            endian = NPY_IGNORE
+        elif ch in ('s', 'S'):
+            endian = NPY_SWAP
+        else:
+            raise OperationError(space.w_ValueError, space.wrap(
+                "%s is an unrecognized byteorder" % new_order))
+    return endian
+
+
 def clipmode_converter(space, w_mode):
     if space.is_none(w_mode):
         return NPY_RAISE
@@ -19,6 +40,7 @@
     raise OperationError(space.w_TypeError,
                          space.wrap("clipmode not understood"))
 
+
 def order_converter(space, w_order, default):
     if space.is_none(w_order):
         return default
diff --git a/pypy/module/micronumpy/interp_dtype.py 
b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -9,6 +9,7 @@
 from rpython.rlib.rarithmetic import LONG_BIT, r_longlong, r_ulonglong
 from rpython.rtyper.lltypesystem import rffi
 from rpython.rlib import jit
+from pypy.module.micronumpy.conversion_utils import byteorder_converter
 from pypy.module.micronumpy.constants import *
 
 
@@ -303,6 +304,17 @@
         fields = space.getitem(w_data, space.wrap(4))
         self.set_fields(space, fields)
 
+    @unwrap_spec(new_order=str)
+    def descr_newbyteorder(self, space, new_order=NPY_SWAP):
+        newendian = byteorder_converter(space, new_order)
+        endian = self.byteorder
+        if endian != NPY_IGNORE:
+            if newendian == NPY_SWAP:
+                endian = NPY_OPPBYTE if self.is_native() else NPY_NATBYTE
+            elif newendian != NPY_IGNORE:
+                endian = newendian
+        return W_Dtype(self.itemtype, self.num, self.kind, self.name, 
self.char, self.w_box_type, endian)
+
 def dtype_from_list(space, w_lst):
     lst_w = space.listview(w_lst)
     fields = {}
@@ -400,6 +412,7 @@
 
     __reduce__ = interp2app(W_Dtype.descr_reduce),
     __setstate__ = interp2app(W_Dtype.descr_setstate),
+    newbyteorder = interp2app(W_Dtype.descr_newbyteorder),
 
     type = interp_attrproperty_w("w_box_type", cls=W_Dtype),
     kind = interp_attrproperty("kind", cls=W_Dtype),
diff --git a/pypy/module/micronumpy/test/test_dtypes.py 
b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -268,6 +268,42 @@
             assert a.dtype.__reduce__() == (dtype, ('i4', 0, 1), (3, '<', 
None, None, None, -1, -1, 0))
         assert loads(dumps(a.dtype)) == a.dtype
 
+    def test_newbyteorder(self):
+        import numpypy as np
+        import sys
+        sys_is_le = sys.byteorder == 'little'
+        native_code = sys_is_le and '<' or '>'
+        swapped_code = sys_is_le and '>' or '<'
+        native_dt = np.dtype(native_code+'i2')
+        swapped_dt = np.dtype(swapped_code+'i2')
+        assert native_dt.newbyteorder('S') == swapped_dt
+        assert native_dt.newbyteorder() == swapped_dt
+        assert native_dt == swapped_dt.newbyteorder('S')
+        assert native_dt == swapped_dt.newbyteorder('=')
+        assert native_dt == swapped_dt.newbyteorder('N')
+        assert native_dt == native_dt.newbyteorder('|')
+        assert np.dtype('<i2') == native_dt.newbyteorder('<')
+        assert np.dtype('<i2') == native_dt.newbyteorder('L')
+        assert np.dtype('>i2') == native_dt.newbyteorder('>')
+        assert np.dtype('>i2') == native_dt.newbyteorder('B')
+
+        for t in [np.int_, np.float_]:
+            dt = np.dtype(t)
+            dt1 = dt.newbyteorder().newbyteorder()
+            dt2 = dt.newbyteorder("<")
+            dt3 = dt.newbyteorder(">")
+            assert dt.byteorder != dt1.byteorder
+            #assert hash(dt) == hash(dt1)
+            if dt == dt2:
+                assert dt.byteorder != dt2.byteorder
+                #assert hash(dt) == hash(dt2)
+            else:
+                assert dt.byteorder != dt3.byteorder
+                #assert hash(dt) == hash(dt3)
+
+            exc = raises(ValueError, dt.newbyteorder, 'XX')
+            assert exc.value[0] == 'XX is an unrecognized byteorder'
+
 class AppTestTypes(BaseAppTestDtypes):
     def test_abstract_types(self):
         import numpypy as numpy
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to