Todd Miller wrote: > Hi, > > I've been looking at a 64-bit numpy problem we were having on Solaris: > > >>> a=numpy.zeros(0x180000000,dtype='b1') > >>> a.data > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > ValueError: size must be zero or positive > > A working fix seemed to be this: > > Index: arrayobject.c > =================================================================== > --- arrayobject.c (revision 6530) > +++ arrayobject.c (working copy) > @@ -6774,7 +6774,7 @@ > static PyObject * > array_data_get(PyArrayObject *self) > { > - intp nbytes; > + Py_ssize_t nbytes; > if (!(PyArray_ISONESEGMENT(self))) { > PyErr_SetString(PyExc_AttributeError, "cannot get single-"\ > "segment buffer for discontiguous array"); > @@ -6782,10 +6782,10 @@ > } > nbytes = PyArray_NBYTES(self); > if PyArray_ISWRITEABLE(self) { > - return PyBuffer_FromReadWriteObject((PyObject *)self, 0, (int) > nbytes); > + return PyBuffer_FromReadWriteObject((PyObject *)self, 0, > (Py_ssize_t) nbytes); > } > else { > - return PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes); > + return PyBuffer_FromObject((PyObject *)self, 0, (Py_ssize_t) > nbytes); > } > } > > This fix could be simpler but still illustrates the typical problem: > use of (or cast to) int rather than something "pointer sized". > This looks like a problem with the port to Python2.5 not getting all the Python C-API changes. There is no need to change the
intp nbytes line, but the un-necessary casting to (int) in the calls to the PyBuffer_ should absolutely be changed at least for Python 2.5 and above. -Travis _______________________________________________ Numpy-discussion mailing list Numpy-discussion@scipy.org http://projects.scipy.org/mailman/listinfo/numpy-discussion