[Numpy-svn] r5317 - branches/1.1.x/numpy/core/src
numpy-svn at scipy.org
numpy-svn at scipy.org
Thu Jun 26 19:06:27 EDT 2008
Author: charris
Date: 2008-06-26 18:06:13 -0500 (Thu, 26 Jun 2008)
New Revision: 5317
Modified:
branches/1.1.x/numpy/core/src/arraytypes.inc.src
Log:
Fix bus error on SPARC.
Modified: branches/1.1.x/numpy/core/src/arraytypes.inc.src
===================================================================
--- branches/1.1.x/numpy/core/src/arraytypes.inc.src 2008-06-26 04:32:54 UTC (rev 5316)
+++ branches/1.1.x/numpy/core/src/arraytypes.inc.src 2008-06-26 23:06:13 UTC (rev 5317)
@@ -253,44 +253,56 @@
static PyObject *
UNICODE_getitem(char *ip, PyArrayObject *ap)
{
- PyObject *obj;
- int mysize;
- PyArray_UCS4 *dptr;
- char *buffer;
- int alloc=0;
+ intp elsize = ap->descr->elsize;
+ intp mysize = elsize/sizeof(PyArray_UCS4);
+ int alloc = 0;
+ PyArray_UCS4 *buffer = NULL;
+ PyUnicodeObject *obj;
+ intp i;
- mysize = ap->descr->elsize >> 2;
- dptr = (PyArray_UCS4 *)ip + mysize-1;
- while(mysize > 0 && *dptr-- == 0) mysize--;
- if (!PyArray_ISBEHAVED(ap)) {
- buffer = _pya_malloc(mysize << 2);
- if (buffer == NULL)
- return PyErr_NoMemory();
+ if (!PyArray_ISBEHAVED_RO(ap)) {
+ buffer = malloc(elsize);
+ if (buffer == NULL) {
+ PyErr_NoMemory();
+ goto fail;
+ }
alloc = 1;
- memcpy(buffer, ip, mysize << 2);
+ memcpy(buffer, ip, elsize);
if (!PyArray_ISNOTSWAPPED(ap)) {
- byte_swap_vector(buffer, mysize, 4);
+ byte_swap_vector(buffer, mysize, sizeof(PyArray_UCS4));
}
}
- else buffer = ip;
+ else {
+ buffer = (PyArray_UCS4 *)ip;
+ }
+ for (i = mysize; i > 0 && buffer[--i] == 0; mysize = i);
+
#ifdef Py_UNICODE_WIDE
- obj = PyUnicode_FromUnicode((const Py_UNICODE *)buffer, mysize);
+ obj = (PyUnicodeObject *)PyUnicode_FromUnicode(buffer, mysize);
#else
/* create new empty unicode object of length mysize*2 */
- obj = MyPyUnicode_New(mysize*2);
- if (obj == NULL) {if (alloc) _pya_free(buffer); return obj;}
- mysize = PyUCS2Buffer_FromUCS4(((PyUnicodeObject *)obj)->str,
- (PyArray_UCS4 *)buffer, mysize);
+ obj = (PyUnicodeObject *)MyPyUnicode_New(mysize*2);
+ if (obj == NULL) {
+ goto fail;
+ }
+ mysize = PyUCS2Buffer_FromUCS4(obj->str, buffer, mysize);
/* reset length of unicode object to ucs2size */
- if (MyPyUnicode_Resize((PyUnicodeObject *)obj, mysize) < 0) {
- if (alloc) _pya_free(buffer);
+ if (MyPyUnicode_Resize(obj, mysize) < 0) {
Py_DECREF(obj);
- return NULL;
+ goto fail;
}
#endif
- if (alloc) _pya_free(buffer);
- return obj;
+ if (alloc) {
+ free(buffer);
+ }
+ return (PyObject *)obj;
+
+fail:
+ if (alloc) {
+ free(buffer);
+ }
+ return NULL;
}
static int
More information about the Numpy-svn
mailing list