[Numpy-svn] r8074 - in trunk/numpy/core: src/multiarray tests

numpy-svn@scip... numpy-svn@scip...
Tue Jan 19 12:58:19 CST 2010


Author: oliphant
Date: 2010-01-19 12:58:18 -0600 (Tue, 19 Jan 2010)
New Revision: 8074

Modified:
   trunk/numpy/core/src/multiarray/arraytypes.c.src
   trunk/numpy/core/tests/test_multiarray.py
Log:
Fix VOID_compare to handle the case of byteswapped data.  Fixes Ticket #1366.

Modified: trunk/numpy/core/src/multiarray/arraytypes.c.src
===================================================================
--- trunk/numpy/core/src/multiarray/arraytypes.c.src	2010-01-17 20:44:28 UTC (rev 8073)
+++ trunk/numpy/core/src/multiarray/arraytypes.c.src	2010-01-19 18:58:18 UTC (rev 8074)
@@ -2608,6 +2608,7 @@
  * in not_equal.
  *
  * Must align data passed on to sub-comparisons.
+ * Also must swap data based on to sub-comparisons.
  */
 static int
 VOID_compare(char *ip1, char *ip2, PyArrayObject *ap)
@@ -2616,7 +2617,7 @@
     PyObject *names, *key;
     PyObject *tup, *title;
     char *nip1, *nip2;
-    int i, offset, res = 0;
+    int i, offset, res = 0, swap=0;
 
     if (!PyArray_HASFIELDS(ap)) {
         return STRING_compare(ip1, ip2, ap);
@@ -2634,18 +2635,21 @@
             goto finish;
         }
         ap->descr = new;
+        swap = PyArray_ISBYTESWAPPED(ap);
         nip1 = ip1+offset;
         nip2 = ip2+offset;
-        if (new->alignment > 1) {
-            if (((intp)(nip1) % new->alignment) != 0) {
+        if ((swap) || (new->alignment > 1)) {
+            if ((swap) || (((intp)(nip1) % new->alignment) != 0)) {
                 /* create buffer and copy */
                 nip1 = _pya_malloc(new->elsize);
                 if (nip1 == NULL) {
                     goto finish;
                 }
                 memcpy(nip1, ip1+offset, new->elsize);
+                if (swap)
+                    new->f->copyswap(nip1, NULL, swap, ap);
             }
-            if (((intp)(nip2) % new->alignment) != 0) {
+            if ((swap) || (((intp)(nip2) % new->alignment) != 0)) {
                 /* copy data to a buffer */
                 nip2 = _pya_malloc(new->elsize);
                 if (nip2 == NULL) {
@@ -2655,10 +2659,12 @@
                     goto finish;
                 }
                 memcpy(nip2, ip2+offset, new->elsize);
+                if (swap)
+                    new->f->copyswap(nip2, NULL, swap, ap);
             }
         }
         res = new->f->compare(nip1, nip2, ap);
-        if (new->alignment > 1) {
+        if ((swap) || (new->alignment > 1)) {
             if (nip1 != ip1+offset) {
                 _pya_free(nip1);
             }

Modified: trunk/numpy/core/tests/test_multiarray.py
===================================================================
--- trunk/numpy/core/tests/test_multiarray.py	2010-01-17 20:44:28 UTC (rev 8073)
+++ trunk/numpy/core/tests/test_multiarray.py	2010-01-19 18:58:18 UTC (rev 8074)
@@ -410,6 +410,16 @@
         assert_equal(r.word, array(['my','first','name']))
         assert_equal(r.number, array([3.1,4.5,6.2]))
 
+        if sys.byteorder == 'little':
+            strtype = '>i2'
+        else:
+            strtype = '<i2'
+        r = np.array([('a', 1),('b', 255), ('c', 3), ('d', 258)],
+                     dtype=[('name', 'S5'),('col2',strtype)])
+        r.sort(order='col2')
+        assert_equal(r['col2'], [1, 3, 255, 258])
+        assert_equal(r, [('a', 1), ('c', 3), ('b', 255), ('d', 258)])
+
     def test_argsort(self):
         # all c scalar argsorts use the same code with different types
         # so it suffices to run a quick check with one type. The number



More information about the Numpy-svn mailing list