diff options
author | Travis Oliphant <oliphant@enthought.com> | 2007-05-22 22:36:10 +0000 |
---|---|---|
committer | Travis Oliphant <oliphant@enthought.com> | 2007-05-22 22:36:10 +0000 |
commit | 4cfa7705d3a05b75d5c7031ad958d1adf818fe7e (patch) | |
tree | b1d7906eb7ff42ecba5fd92790f1a9ef291f298e /numpy | |
parent | 4de81d32d97a2efb1023ca0c19e36990f1ba64a4 (diff) | |
download | numpy-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.c | 2 | ||||
-rw-r--r-- | numpy/core/src/scalartypes.inc.src | 39 |
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; } |