summaryrefslogtreecommitdiff
path: root/numpy/numarray
diff options
context:
space:
mode:
authorTravis Oliphant <oliphant@enthought.com>2006-06-20 08:46:02 +0000
committerTravis Oliphant <oliphant@enthought.com>2006-06-20 08:46:02 +0000
commit669c8238d35fc7d60eba62f7499f9f624db908a6 (patch)
tree746a5faa73850371dc968109c8088e43842b4768 /numpy/numarray
parentb29b5900de7389529d369f35a5f9629e8463c275 (diff)
downloadnumpy-669c8238d35fc7d60eba62f7499f9f624db908a6.tar.gz
Fix-up C-API support for numarray
Diffstat (limited to 'numpy/numarray')
-rw-r--r--numpy/numarray/_capi.c155
-rw-r--r--numpy/numarray/numpy_numarray/arraybase.h1
-rw-r--r--numpy/numarray/numpy_numarray/libnumarray.h1
-rw-r--r--numpy/numarray/numpy_numarray/nummacro.h124
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))