lbalhar / rpms / numpy

Forked from rpms/numpy 4 years ago
Clone
Blob Blame History Raw
--- numpy-1.7.0b1/numpy/core/src/multiarray/scalarapi.c	2012-08-12 21:53:17.000000000 -0600
+++ numpy/numpy/core/src/multiarray/scalarapi.c	2012-08-21 16:34:29.864303392 -0600
@@ -641,6 +641,35 @@ PyArray_Scalar(void *data, PyArray_Descr
             itemsize = (((itemsize - 1) >> 2) + 1) << 2;
         }
     }
+#if PY_VERSION_HEX >= 0x03030000
+    if (type_num == NPY_UNICODE) {
+        PyObject *u, *args;
+        int byteorder;
+
+#if NPY_BYTE_ORDER == NPY_LITTLE_ENDIAN
+        byteorder = -1;
+#elif NPY_BYTE_ORDER == NPY_BIG_ENDIAN
+        byteorder = +1;
+#else
+        #error Endianness undefined ?
+#endif
+        if (swap) byteorder *= -1;
+
+        u = PyUnicode_DecodeUTF32(data, itemsize, NULL, &byteorder);
+        if (u == NULL) {
+            return NULL;
+        }
+        args = Py_BuildValue("(O)", u);
+        if (args == NULL) {
+            Py_DECREF(u);
+            return NULL;
+        }
+        obj = type->tp_new(type, args, NULL);
+        Py_DECREF(u);
+        Py_DECREF(args);
+        return obj;
+    }
+#endif
     if (type->tp_itemsize != 0) {
         /* String type */
         obj = type->tp_alloc(type, itemsize);
@@ -672,6 +701,7 @@ PyArray_Scalar(void *data, PyArray_Descr
             memcpy(destptr, data, itemsize);
             return obj;
         }
+#if PY_VERSION_HEX < 0x03030000
         else if (type_num == NPY_UNICODE) {
             /* tp_alloc inherited from Python PyBaseObject_Type */
             PyUnicodeObject *uni = (PyUnicodeObject*)obj;
@@ -743,6 +773,7 @@ PyArray_Scalar(void *data, PyArray_Descr
 #endif
             return obj;
         }
+#endif /* PY_VERSION_HEX < 0x03030000 */
         else {
             PyVoidScalarObject *vobj = (PyVoidScalarObject *)obj;
             vobj->base = NULL;
diff -up numpy-1.6.2/numpy/core/src/multiarray/scalartypes.c.src.fix_PyUnicodeObject numpy-1.6.2/numpy/core/src/multiarray/scalartypes.c.src
--- numpy-1.6.2/numpy/core/src/multiarray/scalartypes.c.src.fix_PyUnicodeObject	2012-05-19 09:51:54.000000000 -0400
+++ numpy-1.6.2/numpy/core/src/multiarray/scalartypes.c.src	2012-08-05 16:05:40.868718999 -0400
@@ -2323,7 +2323,11 @@ finish:
     *((npy_@name@ *)dest) = *((npy_@name@ *)src);
 #elif @default@ == 1 /* unicode and strings */
     if (itemsize == 0) { /* unicode */
+#if PY_VERSION_HEX >= 0x03030000
+        itemsize = PyUnicode_GetLength(robj) * PyUnicode_KIND(robj);
+#else
         itemsize = ((PyUnicodeObject *)robj)->length * sizeof(Py_UNICODE);
+#endif
     }
     memcpy(dest, src, itemsize);
     /* @default@ == 2 won't get here */