summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarraymodule.c3
-rw-r--r--numpy/core/src/scalartypes.inc.src32
-rw-r--r--numpy/core/src/ucsnarrow.c2
3 files changed, 36 insertions, 1 deletions
diff --git a/numpy/core/src/multiarraymodule.c b/numpy/core/src/multiarraymodule.c
index f6e9ddd32..c150b3a10 100644
--- a/numpy/core/src/multiarraymodule.c
+++ b/numpy/core/src/multiarraymodule.c
@@ -5710,6 +5710,9 @@ array_empty(PyObject *ignored, PyObject *args, PyObject *kwds)
return ret;
}
+/* This function is needed for supporting Pickles of
+ numpy scalar objects.
+*/
static PyObject *
array_scalar(PyObject *ignored, PyObject *args, PyObject *kwds)
{
diff --git a/numpy/core/src/scalartypes.inc.src b/numpy/core/src/scalartypes.inc.src
index acf2097d1..27d37a1a5 100644
--- a/numpy/core/src/scalartypes.inc.src
+++ b/numpy/core/src/scalartypes.inc.src
@@ -1271,9 +1271,41 @@ gentype_reduce(PyObject *self, PyObject *args)
Py_BuildValue("NO", obj, mod));
}
else {
+#ifndef Py_UNICODE_WIDE
+ /* We need to expand the buffer so that we always write
+ UCS4 to disk for pickle of unicode scalars.
+
+ This could be in a unicode_reduce function, but
+ that would require re-factoring.
+ */
+ int alloc=0;
+ char *tmp;
+ int newlen;
+
+ if (PyArray_IsScalar(self, Unicode)) {
+ tmp = _pya_malloc(buflen*2);
+ if (tmp == NULL) {
+ Py_DECREF(ret);
+ return Py_NoMemory();
+ }
+ alloc = 1;
+ newlen = PyUCS2Buffer_AsUCS4((Py_UNICODE *)buffer,
+ (PyArray_UCS4 *)tmp,
+ buflen / 2, buflen / 2);
+ buflen = newlen*4;
+ buffer = tmp;
+ }
+#endif
mod = PyString_FromStringAndSize(buffer, buflen);
+ if (mod == NULL) {
+ Py_DECREF(ret);
+ return Py_NoMemory();
+ }
PyTuple_SET_ITEM(ret, 1,
Py_BuildValue("NN", obj, mod));
+#ifndef Py_UNICODE_WIDE
+ if (alloc) _pya_free(buffer);
+#endif
}
return ret;
}
diff --git a/numpy/core/src/ucsnarrow.c b/numpy/core/src/ucsnarrow.c
index 2d6fec082..9c4a45e9e 100644
--- a/numpy/core/src/ucsnarrow.c
+++ b/numpy/core/src/ucsnarrow.c
@@ -39,7 +39,7 @@ PyUCS2Buffer_FromUCS4(Py_UNICODE *ucs2, PyArray_UCS4 *ucs4, int ucs4length)
It converts up to ucs4len characters of UCS2
It returns the number of characters converted which can
- be less than ucslen if there are surrogate pairs in ucs2.
+ be less than ucs2len if there are surrogate pairs in ucs2.
The return value is the actual size of the used part of the ucs4 buffer.
*/