summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorTravis Oliphant <oliphant@enthought.com>2007-05-22 22:36:10 +0000
committerTravis Oliphant <oliphant@enthought.com>2007-05-22 22:36:10 +0000
commit4cfa7705d3a05b75d5c7031ad958d1adf818fe7e (patch)
treeb1d7906eb7ff42ecba5fd92790f1a9ef291f298e /numpy
parent4de81d32d97a2efb1023ca0c19e36990f1ba64a4 (diff)
downloadnumpy-4cfa7705d3a05b75d5c7031ad958d1adf818fe7e.tar.gz
Add a few more checks to make sure that numpy unicode scalars report correctly on narrow builds. Fix a long-standing seg-fault that arose when calling u.imag on an object with numpy.unicode_ type.
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/arrayobject.c2
-rw-r--r--numpy/core/src/scalartypes.inc.src39
2 files changed, 29 insertions, 12 deletions
diff --git a/numpy/core/src/arrayobject.c b/numpy/core/src/arrayobject.c
index b5b39caad..e02cff92e 100644
--- a/numpy/core/src/arrayobject.c
+++ b/numpy/core/src/arrayobject.c
@@ -1378,7 +1378,7 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
byte_swap_vector(destptr, length, 4);
#else
/* need aligned data buffer */
- if (!PyArray_ISBEHAVED(base)) {
+ if ((((intp)data) % descr->alignment) != 0) {
buffer = _pya_malloc(itemsize);
if (buffer == NULL)
return PyErr_NoMemory();
diff --git a/numpy/core/src/scalartypes.inc.src b/numpy/core/src/scalartypes.inc.src
index 2eda10c12..6739edfb4 100644
--- a/numpy/core/src/scalartypes.inc.src
+++ b/numpy/core/src/scalartypes.inc.src
@@ -158,6 +158,9 @@ PyArray_ScalarAsCtype(PyObject *scalar, void *ctypeptr)
where only a reference for flexible types is returned
*/
+/* This may not work right on narrow builds for NumPy unicode scalars.
+ */
+
/*OBJECT_API
Cast Scalar to c-type
*/
@@ -752,13 +755,7 @@ voidtype_dtypedescr_get(PyVoidScalarObject *self)
static PyObject *
gentype_data_get(PyObject *self)
{
- PyArray_Descr *typecode;
- PyObject *ret;
-
- typecode = PyArray_DescrFromScalar(self);
- ret = PyBuffer_FromObject(self, 0, typecode->elsize);
- Py_DECREF(typecode);
- return ret;
+ return PyBuffer_FromObject(self, 0, Py_END_OF_BUFFER);
}
@@ -767,9 +764,16 @@ gentype_itemsize_get(PyObject *self)
{
PyArray_Descr *typecode;
PyObject *ret;
+ int elsize;
typecode = PyArray_DescrFromScalar(self);
- ret = PyInt_FromLong((long) typecode->elsize);
+ elsize = typecode->elsize;
+#ifndef Py_UNICODE_WIDE
+ if (typecode->type_num == NPY_UNICODE) {
+ elsize >>= 1;
+ }
+#endif
+ ret = PyInt_FromLong((long) elsize);
Py_DECREF(typecode);
return ret;
}
@@ -928,9 +932,11 @@ gentype_imag_get(PyObject *self)
}
else {
char *temp;
+ int elsize;
typecode = PyArray_DescrFromScalar(self);
- temp = PyDataMem_NEW(typecode->elsize);
- memset(temp, '\0', typecode->elsize);
+ elsize = typecode->elsize;
+ temp = PyDataMem_NEW(elsize);
+ memset(temp, '\0', elsize);
ret = PyArray_Scalar(temp, typecode, NULL);
PyDataMem_FREE(temp);
}
@@ -1633,6 +1639,11 @@ gentype_getreadbuf(PyObject *self, Py_ssize_t segment, void **ptrptr)
numbytes = outcode->elsize;
*ptrptr = (void *)scalar_value(self, outcode);
+#ifndef Py_UNICODE_WIDE
+ if (outcode->type_num == NPY_UNICODE) {
+ numbytes >>= 1;
+ }
+#endif
Py_DECREF(outcode);
return numbytes;
}
@@ -1643,8 +1654,14 @@ gentype_getsegcount(PyObject *self, Py_ssize_t *lenp)
PyArray_Descr *outcode;
outcode = PyArray_DescrFromScalar(self);
- if (lenp)
+ if (lenp) {
*lenp = outcode->elsize;
+#ifndef Py_UNICODE_WIDE
+ if (outcode->type_num == NPY_UNICODE) {
+ *lenp >>= 1;
+ }
+#endif
+ }
Py_DECREF(outcode);
return 1;
}