@@ -40,6 +40,10 @@ static const int dbf2np_map[DBF_MENU+1] = {
4040 NPY_INT16 , // DBF_MENU
4141};
4242static PyArray_Descr * dbf2np [DBF_MENU + 1 ];
43+ #if NPY_ABI_VERSION < 0x02000000
44+ #define PyDataType_ELSIZE (descr ) ((descr)->elsize)
45+ #define PyDataType_SET_ELSIZE (descr , size ) (descr)->elsize = size
46+ #endif
4347#endif
4448
4549typedef struct {
@@ -98,10 +102,10 @@ static PyObject* build_array(PyObject* obj, void *data, unsigned short ftype, un
98102
99103 desc = dbf2np [ftype ];
100104 if (ftype == DBF_STRING ) {
101- desc -> elsize = MAX_STRING_SIZE ;
105+ PyDataType_SET_ELSIZE ( desc , MAX_STRING_SIZE ) ;
102106 }
103107
104- Py_XINCREF (desc );
108+ Py_XINCREF (desc ); // take a reference for PyArray_NewFromDescr() to steal
105109 return PyArray_NewFromDescr (& PyArray_Type , desc , ndims , dims , NULL , data , flags , (PyObject * )obj );
106110#else
107111 PyErr_SetNone (PyExc_NotImplementedError );
@@ -115,22 +119,25 @@ static int assign_array(DBADDR *paddr, PyObject *arr)
115119 void * rawfield = paddr -> pfield ;
116120 rset * prset ;
117121 PyObject * aval ;
122+ PyArrayObject * array = (PyArrayObject * )arr ;
118123 unsigned elemsize = dbValueSize (paddr -> field_type );
119124 unsigned long maxlen = paddr -> no_elements , insize ;
120125 PyArray_Descr * desc = dbf2np [paddr -> field_type ];
121126
122127 if (paddr -> field_type == DBF_STRING &&
123- (PyArray_NDIM (arr )!= 2 || PyArray_DIM (arr ,0 )> maxlen || PyArray_DIM (arr ,1 )!= MAX_STRING_SIZE ))
128+ (PyArray_NDIM (array ) != 2 ||
129+ PyArray_DIM (array , 0 ) > (npy_intp ) maxlen ||
130+ PyArray_DIM (array , 1 ) != MAX_STRING_SIZE ))
124131 {
125132 PyErr_Format (PyExc_ValueError , "String array has incorrect shape or is too large" );
126133 return 1 ;
127134
128- } else if (PyArray_NDIM (arr ) != 1 || PyArray_DIM (arr , 0 ) > maxlen ) {
135+ } else if (PyArray_NDIM (array ) != 1 || PyArray_DIM (array , 0 ) > ( npy_intp ) maxlen ) {
129136 PyErr_Format (PyExc_ValueError , "Array has incorrect shape or is too large" );
130137 return 1 ;
131138 }
132139
133- insize = PyArray_DIM (arr , 0 );
140+ insize = PyArray_DIM (array , 0 );
134141
135142 if (paddr -> special == SPC_DBADDR &&
136143 (prset = dbGetRset (paddr )) &&
@@ -152,16 +159,17 @@ static int assign_array(DBADDR *paddr, PyObject *arr)
152159 }
153160
154161 Py_XINCREF (desc );
155- if (!(aval = PyArray_FromAny (arr , desc , 1 , 2 , NPY_CARRAY , arr )))
162+ if (!(aval = PyArray_FromAny (arr , desc , 1 , 2 , NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE , arr )))
156163 return 1 ;
157164
158- if (elemsize != PyArray_ITEMSIZE (aval )) {
165+ if (elemsize != PyArray_ITEMSIZE (( PyArrayObject * ) aval )) {
159166 PyErr_Format (PyExc_AssertionError , "item size mismatch %u %u" ,
160- elemsize , (unsigned )PyArray_ITEMSIZE (aval ) );
167+ elemsize , (unsigned )PyArray_ITEMSIZE ((PyArrayObject * )aval ));
168+ Py_DECREF (aval );
161169 return 1 ;
162170 }
163171
164- memcpy (rawfield , PyArray_GETPTR1 (aval , 0 ), insize * elemsize );
172+ memcpy (rawfield , PyArray_GETPTR1 (( PyArrayObject * ) aval , 0 ), insize * elemsize );
165173
166174 Py_DECREF (aval );
167175
@@ -207,7 +215,7 @@ static PyObject* pyField_getval(pyField *self)
207215
208216 if (self -> addr .no_elements > 1 ) {
209217 return build_array ((PyObject * )self , rawfield , self -> addr .field_type ,
210- noe , NPY_CARRAY_RO );
218+ noe , NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED );
211219 }
212220 }
213221
@@ -362,7 +370,7 @@ static PyObject *pyField_getarray(pyField *self)
362370 } else
363371 data = self -> addr .pfield ;
364372
365- return build_array ((PyObject * )self , data , self -> addr .field_type , self -> addr .no_elements , NPY_CARRAY );
373+ return build_array ((PyObject * )self , data , self -> addr .field_type , self -> addr .no_elements , NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE );
366374}
367375
368376static PyObject * pyField_getlen (pyField * self )
0 commit comments