71 lines
2.3 KiB
Diff
71 lines
2.3 KiB
Diff
--- numpy/core/src/multiarray/scalarapi.c.orig 2012-05-19 15:51:54.000000000 +0200
|
|
+++ numpy/core/src/multiarray/scalarapi.c 2012-08-05 14:57:02.068276634 +0200
|
|
@@ -652,6 +652,35 @@
|
|
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);
|
|
@@ -688,6 +717,7 @@
|
|
memcpy(destptr, data, itemsize);
|
|
return obj;
|
|
}
|
|
+#if PY_VERSION_HEX < 0x03030000
|
|
else if (type_num == PyArray_UNICODE) {
|
|
/* tp_alloc inherited from Python PyBaseObject_Type */
|
|
PyUnicodeObject *uni = (PyUnicodeObject*)obj;
|
|
@@ -759,6 +789,7 @@
|
|
#endif
|
|
return obj;
|
|
}
|
|
+#endif /* PY_VERSION_HEX < 0x03030000 */
|
|
else {
|
|
PyVoidScalarObject *vobj = (PyVoidScalarObject *)obj;
|
|
vobj->base = NULL;
|
|
diff --git numpy/core/src/multiarray/scalartypes.c.src numpy/core/src/multiarray/scalartypes.c.src
|
|
index e547071..12745d7 100644
|
|
--- numpy/core/src/multiarray/scalartypes.c.src
|
|
+++ numpy/core/src/multiarray/scalartypes.c.src
|
|
@@ -2592,7 +2592,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 */
|