diff options
| author | Travis Oliphant <oliphant@enthought.com> | 2006-06-20 08:46:02 +0000 |
|---|---|---|
| committer | Travis Oliphant <oliphant@enthought.com> | 2006-06-20 08:46:02 +0000 |
| commit | 669c8238d35fc7d60eba62f7499f9f624db908a6 (patch) | |
| tree | 746a5faa73850371dc968109c8088e43842b4768 /numpy/numarray | |
| parent | b29b5900de7389529d369f35a5f9629e8463c275 (diff) | |
| download | numpy-669c8238d35fc7d60eba62f7499f9f624db908a6.tar.gz | |
Fix-up C-API support for numarray
Diffstat (limited to 'numpy/numarray')
| -rw-r--r-- | numpy/numarray/_capi.c | 155 | ||||
| -rw-r--r-- | numpy/numarray/numpy_numarray/arraybase.h | 1 | ||||
| -rw-r--r-- | numpy/numarray/numpy_numarray/libnumarray.h | 1 | ||||
| -rw-r--r-- | numpy/numarray/numpy_numarray/nummacro.h | 124 |
4 files changed, 185 insertions, 96 deletions
diff --git a/numpy/numarray/_capi.c b/numpy/numarray/_capi.c index e66f4132a..d9fdd1d7b 100644 --- a/numpy/numarray/_capi.c +++ b/numpy/numarray/_capi.c @@ -1,8 +1,8 @@ - #include <Python.h> #define _libnumarray_MODULE #include "numpy_numarray/libnumarray.h" +#include <float.h> static PyObject *pCfuncClass; static PyTypeObject CfuncType; @@ -973,7 +973,8 @@ NA_InputArray(PyObject *a, NumarrayType t, int requires) PyArray_Descr *descr; if (t == tAny) descr = NULL; else descr = PyArray_DescrFromType(t); - return PyArray_CheckFromAny(a, descr, 0, 0, requires, NULL); + return (PyArrayObject *) \ + PyArray_CheckFromAny(a, descr, 0, 0, requires, NULL); } /* satisfies ensures that 'a' meets a set of requirements and matches @@ -1072,11 +1073,12 @@ NA_OptionalOutputArray(PyObject *optional, NumarrayType t, int requires, PyArrayObject *master) { if ((optional == Py_None) || (optional == NULL)) { - PyArrayObject *rval; + PyObject *rval; + PyArray_Descr *descr; if (t == tAny) descr=NULL; else descr = PyArray_DescrFromType(t); rval = PyArray_FromArray(master, descr, 0); - return rval; + return (PyArrayObject *)rval; } else { return NA_OutputArray(optional, t, requires); } @@ -1887,24 +1889,9 @@ NA_nameToTypeNo(char *typename) } static PyObject * -setTypeException(int type) -{ - /* Check if it is a printable character */ - if ((type >= 32) && (type <= 126)) - PyErr_Format(_Error, - "Type object lookup returned" - " NULL for type \'%c\'", type); - else - PyErr_Format(_Error, - "Type object lookup returned" - " NULL for type %d", type); - return NULL; -} - -static PyObject * getTypeObject(NumarrayType type) { - return PyArray_DescrFromType(type) + return (PyObject *)PyArray_DescrFromType(type); } @@ -2237,23 +2224,6 @@ NA_isPythonScalar(PyObject *o) #define PlatBigUInt PyLong_FromUnsignedLongLong #endif -static int -_checkOffset(PyArrayObject *a, long offset) -{ - long finaloffset = a->byteoffset + offset; - long size = getBufferSize(a->_data); - if (size < 0) { - PyErr_Format(_Error, - "can't get buffer size"); - return -1; - } - if (finaloffset < 0 || finaloffset > size) { - PyErr_Format(_Error, - "invalid buffer offset"); - return -1; - } - return 0; -} static PyObject * NA_getPythonScalar(PyArrayObject *a, long offset) @@ -2261,9 +2231,6 @@ NA_getPythonScalar(PyArrayObject *a, long offset) int type = a->descr->type_num; PyObject *rval = NULL; - if (_checkOffset(a, offset) < 0) - goto _exit; - switch(type) { case tBool: case tInt8: @@ -2308,10 +2275,68 @@ NA_getPythonScalar(PyArrayObject *a, long offset) "NA_getPythonScalar: bad type %d\n", type); } - _exit: return rval; } +static int +NA_overflow(PyArrayObject *a, Float64 v) +{ + if ((a->flags & CHECKOVERFLOW) == 0) return 0; + + switch(a->descr->type_num) { + case tBool: + return 0; + case tInt8: + if ((v < -128) || (v > 127)) goto _fail; + return 0; + case tUInt8: + if ((v < 0) || (v > 255)) goto _fail; + return 0; + case tInt16: + if ((v < -32768) || (v > 32767)) goto _fail; + return 0; + case tUInt16: + if ((v < 0) || (v > 65535)) goto _fail; + return 0; + case tInt32: + if ((v < -2147483648.) || + (v > 2147483647.)) goto _fail; + return 0; + case tUInt32: + if ((v < 0) || (v > 4294967295.)) goto _fail; + return 0; + case tInt64: + if ((v < -9223372036854775808.) || + (v > 9223372036854775807.)) goto _fail; + return 0; + #if HAS_UINT64 + case tUInt64: + if ((v < 0) || + (v > 18446744073709551615.)) goto _fail; + return 0; + #endif + case tFloat32: + if ((v < -FLT_MAX) || (v > FLT_MAX)) goto _fail; + return 0; + case tFloat64: + return 0; + case tComplex32: + if ((v < -FLT_MAX) || (v > FLT_MAX)) goto _fail; + return 0; + case tComplex64: + return 0; + default: + PyErr_Format( PyExc_TypeError, + "Unknown type %d in NA_overflow", + a->descr->type_num ); + PyErr_Print(); + return -1; + } + _fail: + PyErr_Format(PyExc_OverflowError, "value out of range for array"); + return -1; +} + static int _setFromPythonScalarCore(PyArrayObject *a, long offset, PyObject*value, int entries) { @@ -2383,8 +2408,6 @@ _setFromPythonScalarCore(PyArrayObject *a, long offset, PyObject*value, int entr static int NA_setFromPythonScalar(PyArrayObject *a, long offset, PyObject *value) { - if (_checkOffset(a, offset) < 0) - return -1; if (a->flags & WRITABLE) return _setFromPythonScalarCore(a, offset, value, 0); else { @@ -2444,8 +2467,7 @@ NA_typeObjectToTypeNo(PyObject *typeObj) static int NA_copyArray(PyArrayObject *to, const PyArrayObject *from) { - PyArrayObject *from0 = from; - return PyArray_CopyInto(to, from0); + return PyArray_CopyInto(to, (PyArrayObject *)from); } static PyArrayObject * @@ -2463,7 +2485,7 @@ NA_getType( PyObject *type) PyErr_Format(PyExc_ValueError, "NA_getType: unknown type."); typeobj = NULL; } - return typeobj; + return (PyObject *)typeobj; } @@ -2612,7 +2634,7 @@ NA_UfuncCheck(PyObject *op) { static int NA_CfuncCheck(PyObject *op) { - return PyObject_TypeCheck(ob, &CfuncType); + return PyObject_TypeCheck(op, &CfuncType); } static int @@ -2714,7 +2736,6 @@ NA_NewAllFromBuffer(int ndim, maybelong *shape, NumarrayType type, PyObject *bufferObject, maybelong byteoffset, maybelong bytestride, int byteorder, int aligned, int writeable) { - PyObject *typeObject; PyArrayObject *self = NULL; PyArray_Descr *dtype; @@ -2733,8 +2754,10 @@ NA_NewAllFromBuffer(int ndim, maybelong *shape, NumarrayType type, } if (bufferObject == Py_None || bufferObject == NULL) { - self = PyArray_NewFromDescr(&PyArray_Type, dtype, - ndim, shape, NULL, NULL, 0, NULL); + self = (PyArrayObject *) \ + PyArray_NewFromDescr(&PyArray_Type, dtype, + ndim, shape, NULL, NULL, + 0, NULL); } else { intp size = dtype->elsize; @@ -2742,36 +2765,14 @@ NA_NewAllFromBuffer(int ndim, maybelong *shape, NumarrayType type, for(i=0; i<self->nd; i++) { size *= self->dimensions[i]; } - self = PyArray_FromBuffer(bufferObject, dtype, size, byteoffset); + self = (PyArrayObject *)\ + PyArray_FromBuffer(bufferObject, dtype, + size, byteoffset); } return self; } -static Float64 * -NA_alloc1D_Float64(PyArrayObject *a, long offset, int cnt) -{ - Float64 *result = PyMem_New(Float64, cnt); - if (!result) return NULL; - if (NA_get1D_Float64(a, offset, cnt, result) < 0) { - PyMem_Free(result); - return NULL; - } - return result; -} - -static Int64 * -NA_alloc1D_Int64(PyArrayObject *a, long offset, int cnt) -{ - Int64 *result = PyMem_New(Int64, cnt); - if (!result) return NULL; - if (NA_get1D_Int64(a, offset, cnt, result) < 0) { - PyMem_Free(result); - return NULL; - } - return result; -} - static void NA_updateAlignment(PyArrayObject *self) { @@ -3075,7 +3076,9 @@ NA_IeeeMask64( Float64 f, Int32 mask) static PyArrayObject * NA_FromDimsStridesDescrAndData(int nd, maybelong *d, maybelong *s, PyArray_Descr *descr, char *data) { - return PyArray_NewFromDescr(&PyArray_Type, descr, nd, d, s, data, 0, NULL); + return (PyArrayObject *)\ + PyArray_NewFromDescr(&PyArray_Type, descr, nd, d, + s, data, 0, NULL); } static PyArrayObject * diff --git a/numpy/numarray/numpy_numarray/arraybase.h b/numpy/numarray/numpy_numarray/arraybase.h index 00e2f4c6c..45b44963f 100644 --- a/numpy/numarray/numpy_numarray/arraybase.h +++ b/numpy/numarray/numpy_numarray/arraybase.h @@ -43,7 +43,6 @@ typedef enum NUM_BIG_ENDIAN = 1 } NumarrayByteOrder; - #define Complex64 Complex64_ typedef struct { Float32 r, i; } Complex32; typedef struct { Float64 r, i; } Complex64; diff --git a/numpy/numarray/numpy_numarray/libnumarray.h b/numpy/numarray/numpy_numarray/libnumarray.h index f897b4f3f..3d838c061 100644 --- a/numpy/numarray/numpy_numarray/libnumarray.h +++ b/numpy/numarray/numpy_numarray/libnumarray.h @@ -4,7 +4,6 @@ #ifndef NUMPY_LIBNUMARRAY_H #define NUMPY_LIBNUMARRAY_H -#define PY_ARRAY_UNIQUE_SYMBOL NUMPY_LIBNUMARRAY #include "numpy/arrayobject.h" #include "arraybase.h" #include "nummacro.h" diff --git a/numpy/numarray/numpy_numarray/nummacro.h b/numpy/numarray/numpy_numarray/nummacro.h index 6b185e81e..7bcc250a9 100644 --- a/numpy/numarray/numpy_numarray/nummacro.h +++ b/numpy/numarray/numpy_numarray/nummacro.h @@ -87,7 +87,6 @@ typedef enum /* from here down, type("ai") is NDInfo* */ #define NA_PTR(ai) ((char *) NA_OFFSETDATA((ai))) -#define NA_TEMP(ai) ((char *) &((ai)->temp)) #define NA_PTR1(ai, i) (NA_PTR(ai) + \ (i)*(ai)->strides[0]) #define NA_PTR2(ai, i, j) (NA_PTR(ai) + \ @@ -97,12 +96,11 @@ typedef enum (i)*(ai)->strides[0] + \ (j)*(ai)->strides[1] + \ (k)*(ai)->strides[2]) -#define NA_RESULT(ai, type) (*((type *) NA_TEMP(ai))) - -#define NA_SET_TEMP(ai, type, v) (((type *) &(ai)->temp)[0] = v) +#define NA_SET_TEMP(ai, type, v) (((type *) &__temp__)[0] = v) #define NA_SWAPComplex64 NA_COMPLEX_SWAP16 +#define NA_SWAPComplex64_ NA_COMPLEX_SWAP16 #define NA_SWAPComplex32 NA_COMPLEX_SWAP8 #define NA_SWAPFloat64 NA_SWAP8 #define NA_SWAPFloat32 NA_SWAP4 @@ -117,6 +115,7 @@ typedef enum #define NA_SWAPBool NA_SWAP1 #define NA_COPYComplex64 NA_COPY16 +#define NA_COPYComplex64_ NA_COPY16 #define NA_COPYComplex32 NA_COPY8 #define NA_COPYFloat64 NA_COPY8 #define NA_COPYFloat32 NA_COPY4 @@ -130,20 +129,113 @@ typedef enum #define NA_COPYUInt8 NA_COPY1 #define NA_COPYBool NA_COPY1 -#define NA_REM(ai, ptr) ((ai)->wptr = (ptr)) -#define NA_REC(ai) ((ai)->wptr) +#ifdef __cplusplus +extern "C" { +#endif + +#define _makeGetPb(type) \ +static type _NA_GETPb_##type(char *ptr) \ +{ \ + type temp; \ + NA_SWAP##type(ptr, (char *)&temp); \ + return temp; \ +} + +#define _makeGetPa(type) \ +static type _NA_GETPa_##type(char *ptr) \ +{ \ + type temp; \ + NA_COPY##type(ptr, (char *)&temp); \ + return temp; \ +} + +_makeGetPb(Complex64_) +_makeGetPb(Complex32) +_makeGetPb(Float64) +_makeGetPb(Float32) +_makeGetPb(Int64) +_makeGetPb(UInt64) +_makeGetPb(Int32) +_makeGetPb(UInt32) +_makeGetPb(Int16) +_makeGetPb(UInt16) +_makeGetPb(Int8) +_makeGetPb(UInt8) +_makeGetPb(Bool) + +_makeGetPa(Complex64_) +_makeGetPa(Complex32) +_makeGetPa(Float64) +_makeGetPa(Float32) +_makeGetPa(Int64) +_makeGetPa(UInt64) +_makeGetPa(Int32) +_makeGetPa(UInt32) +_makeGetPa(Int16) +_makeGetPa(UInt16) +_makeGetPa(Int8) +_makeGetPa(UInt8) +_makeGetPa(Bool) + +#undef _makeGetPb +#undef _makeGetPa + +#define _makeSetPb(type) \ +static void _NA_SETPb_##type(char *ptr, type v) \ +{ \ + NA_SWAP##type(((char *)&v), ptr); \ + return; \ +} + +#define _makeSetPa(type) \ +static void _NA_SETPa_##type(char *ptr, type v) \ +{ \ + NA_COPY##type(((char *)&v), ptr); \ + return; \ +} + +_makeSetPb(Complex64_) +_makeSetPb(Complex32) +_makeSetPb(Float64) +_makeSetPb(Float32) +_makeSetPb(Int64) +_makeSetPb(UInt64) +_makeSetPb(Int32) +_makeSetPb(UInt32) +_makeSetPb(Int16) +_makeSetPb(UInt16) +_makeSetPb(Int8) +_makeSetPb(UInt8) +_makeSetPb(Bool) + +_makeSetPa(Complex64_) +_makeSetPa(Complex32) +_makeSetPa(Float64) +_makeSetPa(Float32) +_makeSetPa(Int64) +_makeSetPa(UInt64) +_makeSetPa(Int32) +_makeSetPa(UInt32) +_makeSetPa(Int16) +_makeSetPa(UInt16) +_makeSetPa(Int8) +_makeSetPa(UInt8) +_makeSetPa(Bool) + +#undef _makeSetPb +#undef _makeSetPa + +#ifdef __cplusplus + } +#endif /* ========================== ptr get/set ================================ */ /* byteswapping */ -#define NA_GETPb(ai, type, ptr) \ - (NA_REM(ai, ptr), NA_SWAP##type(NA_REC(ai), NA_TEMP(ai)), \ - NA_RESULT(ai, type)) +#define NA_GETPb(ai, type, ptr) _NA_GETPb_##type(ptr) /* aligning */ -#define NA_GETPa(ai, type, ptr) \ - (NA_REM(ai, ptr), NA_COPY##type(NA_REC(ai), NA_TEMP(ai)), \ - NA_RESULT(ai, type)) +#define NA_GETPa(ai, type, ptr) _NA_GETPa_##type(ptr) /* fast (aligned, !byteswapped) */ #define NA_GETPf(ai, type, ptr) (*((type *) (ptr))) @@ -157,14 +249,10 @@ typedef enum /* NOTE: NA_SET* macros cannot be used as values. */ /* byteswapping */ -#define NA_SETPb(ai, type, ptr, v) \ - (NA_REM(ai, ptr), NA_SET_TEMP(ai, type, v), \ - NA_SWAP##type(NA_TEMP(ai), NA_REC(ai))) +#define NA_SETPb(ai, type, ptr, v) _NA_SETPb_##type(ptr, v) /* aligning */ -#define NA_SETPa(ai, type, ptr, v) \ - (NA_REM(ai, ptr), NA_SET_TEMP(ai, type, v), \ - NA_COPY##type(NA_TEMP(ai), NA_REC(ai))) +#define NA_SETPa(ai, type, ptr, v) _NA_SETPa_##type(ptr, v) /* fast (aligned, !byteswapped) */ #define NA_SETPf(ai, type, ptr, v) ((*((type *) ptr)) = (v)) |
