diff options
Diffstat (limited to 'numpy/core/src')
-rw-r--r-- | numpy/core/src/arraymethods.c | 40 | ||||
-rw-r--r-- | numpy/core/src/arrayobject.c | 179 | ||||
-rw-r--r-- | numpy/core/src/arraytypes.inc.src | 10 | ||||
-rw-r--r-- | numpy/core/src/multiarraymodule.c | 90 |
4 files changed, 175 insertions, 144 deletions
diff --git a/numpy/core/src/arraymethods.c b/numpy/core/src/arraymethods.c index 070beb6a7..488ed3bf7 100644 --- a/numpy/core/src/arraymethods.c +++ b/numpy/core/src/arraymethods.c @@ -897,20 +897,7 @@ static void _deepcopy_call(char *iptr, char *optr, PyArray_Descr *dtype, PyObject *deepcopy, PyObject *visit) { - if (dtype->hasobject == 0) return; - if (dtype->type_num == PyArray_OBJECT) { - PyObject **itemp, **otemp; - PyObject *res; - itemp = (PyObject **)iptr; - otemp = (PyObject **)optr; - Py_XINCREF(*itemp); - /* call deepcopy on this argument */ - res = PyObject_CallFunctionObjArgs(deepcopy, - *itemp, visit, NULL); - Py_XDECREF(*itemp); - Py_XDECREF(*otemp); - *otemp = res; - } + if (!PyDataType_REFCHK(dtype)) return; else if (PyDescr_HASFIELDS(dtype)) { PyObject *key, *value, *title=NULL; PyArray_Descr *new; @@ -923,6 +910,20 @@ _deepcopy_call(char *iptr, char *optr, PyArray_Descr *dtype, deepcopy, visit); } } + else { + PyObject **itemp, **otemp; + PyObject *res; + itemp = (PyObject **)iptr; + otemp = (PyObject **)optr; + Py_XINCREF(*itemp); + /* call deepcopy on this argument */ + res = PyObject_CallFunctionObjArgs(deepcopy, + *itemp, visit, NULL); + Py_XDECREF(*itemp); + Py_XDECREF(*otemp); + *otemp = res; + } + } @@ -936,7 +937,7 @@ array_deepcopy(PyArrayObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "O", &visit)) return NULL; ret = PyArray_Copy(self); - if (self->descr->hasobject) { + if (PyDataType_REFCHK(self->descr)) { copy = PyImport_ImportModule("copy"); if (copy == NULL) return NULL; deepcopy = PyObject_GetAttrString(copy, "deepcopy"); @@ -1057,7 +1058,7 @@ array_reduce(PyArrayObject *self, PyObject *args) mybool = (PyArray_ISFORTRAN(self) ? Py_True : Py_False); Py_INCREF(mybool); PyTuple_SET_ITEM(state, 3, mybool); - if (self->descr->hasobject || self->descr->f->listpickle) { + if (PyDataType_FLAGCHK(self->descr, NPY_LIST_PICKLE)) { thestr = _getlist_pkl(self); } else { @@ -1134,7 +1135,7 @@ array_setstate(PyArrayObject *self, PyObject *args) return NULL; } - if (typecode->hasobject || typecode->f->listpickle) { + if (PyDataType_FLAGCHK(typecode, NPY_LIST_PICKLE)) { if (!PyList_Check(rawdata)) { PyErr_SetString(PyExc_TypeError, "object pickle not returning list"); @@ -1187,7 +1188,7 @@ array_setstate(PyArrayObject *self, PyObject *args) &(self->flags)); } - if (typecode->hasobject != 1 && !typecode->f->listpickle) { + if (!PyDataType_FLAGCHK(typecode, NPY_LIST_PICKLE)) { int swap=!PyArray_ISNOTSWAPPED(self); self->data = datastr; if (!_IsAligned(self) || swap) { @@ -1234,7 +1235,8 @@ array_setstate(PyArrayObject *self, PyObject *args) if (self->dimensions) PyDimMem_FREE(self->dimensions); return PyErr_NoMemory(); } - if (self->descr->hasobject) memset(self->data, 0, PyArray_NBYTES(self)); + if (PyDataType_FLAGCHK(self->descr, NPY_NEEDS_INIT)) + memset(self->data, 0, PyArray_NBYTES(self)); self->flags |= OWNDATA; self->base = NULL; if (_setlist_pkl(self, rawdata) < 0) diff --git a/numpy/core/src/arrayobject.c b/numpy/core/src/arrayobject.c index c6041578d..c953d3516 100644 --- a/numpy/core/src/arrayobject.c +++ b/numpy/core/src/arrayobject.c @@ -46,7 +46,7 @@ PyArray_GetPriority(PyObject *obj, double default_) static int _check_object_rec(PyArray_Descr *descr) { - if (descr->hasobject && !PyDescr_ISOBJECT(descr)) { + if (PyDataType_HASFIELDS(descr) && PyDataType_REFCHK(descr)) { PyErr_SetString(PyExc_TypeError, "Not supported for this data-type."); return -1; } @@ -154,7 +154,7 @@ PyArray_Item_INCREF(char *data, PyArray_Descr *descr) { PyObject **temp; - if (descr->hasobject == 0) return; + if (!PyDataType_REFCHK(descr)) return; if (descr->type_num == PyArray_OBJECT) { temp = (PyObject **)data; @@ -182,7 +182,7 @@ PyArray_Item_XDECREF(char *data, PyArray_Descr *descr) { PyObject **temp; - if (descr->hasobject == 0) return; + if (!PyDataType_REFCHK(descr)) return; if (descr->type_num == PyArray_OBJECT) { temp = (PyObject **)data; @@ -216,7 +216,7 @@ PyArray_INCREF(PyArrayObject *mp) PyObject **data, **temp; PyArrayIterObject *it; - if (mp->descr->hasobject == 0) return 0; + if (!PyDataType_REFCHK(mp->descr)) return 0; if (mp->descr->type_num != PyArray_OBJECT) { it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp); @@ -267,7 +267,7 @@ PyArray_XDECREF(PyArrayObject *mp) PyObject **temp; PyArrayIterObject *it; - if (mp->descr->hasobject == 0) return 0; + if (!PyDataType_REFCHK(mp->descr)) return 0; if (mp->descr->type_num != PyArray_OBJECT) { it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp); @@ -1314,16 +1314,14 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base) int swap; type_num = descr->type_num; - type = descr->typeobj; if (type_num == PyArray_BOOL) PyArrayScalar_RETURN_BOOL_FROM_LONG(*(Bool*)data); - else if (type_num == PyArray_OBJECT || - (PyTypeNum_ISUSERDEF(type_num) && - !(PyType_IsSubtype(type, &PyGenericArrType_Type)))) { + else if (PyDataType_FLAGCHK(descr, NPY_USE_GETITEM)) { return descr->f->getitem(data, base); } itemsize = descr->elsize; copyswap = descr->f->copyswap; + type = descr->typeobj; swap = !PyArray_ISNBO(descr->byteorder); if PyTypeNum_ISSTRING(type_num) { /* Eliminate NULL bytes */ char *dptr = data; @@ -1705,8 +1703,8 @@ PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) n3 = (sep ? strlen((const char *)sep) : 0); if (n3 == 0) { /* binary data */ - if (self->descr->hasobject) { - PyErr_SetString(PyExc_ValueError, "cannot write "\ + if (PyDataType_FLAGCHK(self->descr, NPY_LIST_PICKLE)) { + PyErr_SetString(PyExc_ValueError, "cannot write " \ "object arrays to a file in " \ "binary mode"); return -1; @@ -1934,7 +1932,7 @@ array_dealloc(PyArrayObject *self) { if ((self->flags & OWNDATA) && self->data) { /* Free internal references if an Object array */ - if (self->descr->hasobject) { + if (PyDataType_FLAGCHK(self->descr, NPY_ITEM_REFCOUNT)) { Py_INCREF(self); /*hold on to self */ PyArray_XDECREF(self); /* Don't need to DECREF -- because we are deleting @@ -2443,7 +2441,7 @@ PyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op) copyswap = PyArray_DESCR(arr)->f->copyswap; PyArray_MapIterReset(mit); /* Need to decref hasobject arrays */ - if (descr->hasobject) { + if (PyDataType_FLAGCHK(descr, NPY_ITEM_REFCOUNT)) { while (index--) { PyArray_Item_XDECREF(mit->dataptr, PyArray_DESCR(arr)); PyArray_Item_INCREF(it->dataptr, PyArray_DESCR(arr)); @@ -5368,7 +5366,7 @@ PyArray_NewFromDescr(PyTypeObject *subtype, PyArray_Descr *descr, int nd, /* It is bad to have unitialized OBJECT pointers */ /* which could also be sub-fields of a VOID array */ - if (descr->hasobject) { + if (PyDataType_FLAGCHK(descr, NPY_NEEDS_INIT)) { memset(data, 0, sd); } } @@ -5431,15 +5429,9 @@ PyArray_NewFromDescr(PyTypeObject *subtype, PyArray_Descr *descr, int nd, static void _putzero(char *optr, PyObject *zero, PyArray_Descr *dtype) { - if (dtype->hasobject == 0) { + if (!PyDataType_FLAGCHK(dtype, NPY_ITEM_REFCOUNT)) { memset(optr, 0, dtype->elsize); } - else if (PyDescr_ISOBJECT(dtype)) { - PyObject **temp; - Py_INCREF(zero); - temp = (PyObject **)optr; - *temp = zero; - } else if (PyDescr_HASFIELDS(dtype)) { PyObject *key, *value, *title=NULL; PyArray_Descr *new; @@ -5451,6 +5443,12 @@ _putzero(char *optr, PyObject *zero, PyArray_Descr *dtype) _putzero(optr + offset, zero, new); } } + else { + PyObject **temp; + Py_INCREF(zero); + temp = (PyObject **)optr; + *temp = zero; + } return; } @@ -5483,12 +5481,6 @@ PyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape, int refcheck, return NULL; } - if (self->descr->hasobject) { - PyErr_SetString(PyExc_ValueError, - "cannot resize an object-array like this"); - return NULL; - } - if (fortran == PyArray_ANYORDER) fortran = PyArray_CORDER; @@ -5547,7 +5539,7 @@ PyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape, int refcheck, if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { /* Fill new memory with zeros */ elsize = self->descr->elsize; - if (self->descr->hasobject) { + if (PyDataType_FLAGCHK(self->descr, NPY_ITEM_REFCOUNT)) { PyObject *zero = PyInt_FromLong(0); char *optr; optr = self->data + oldsize*elsize; @@ -5595,7 +5587,7 @@ PyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape, int refcheck, static void _fillobject(char *optr, PyObject *obj, PyArray_Descr *dtype) { - if (!dtype->hasobject) { + if (!PyDataType_FLAGCHK(dtype, NPY_ITEM_REFCOUNT)) { if ((obj == Py_None) || (PyInt_Check(obj) && PyInt_AsLong(obj)==0)) return; @@ -5610,14 +5602,7 @@ _fillobject(char *optr, PyObject *obj, PyArray_Descr *dtype) Py_XDECREF(arr); } } - if (PyDescr_ISOBJECT(dtype)) { - PyObject **temp; - Py_XINCREF(obj); - temp = (PyObject **)optr; - *temp = obj; - return; - } - if (PyDescr_HASFIELDS(dtype)) { + else if (PyDescr_HASFIELDS(dtype)) { PyObject *key, *value, *title=NULL; PyArray_Descr *new; int offset; @@ -5628,6 +5613,13 @@ _fillobject(char *optr, PyObject *obj, PyArray_Descr *dtype) _fillobject(optr + offset, obj, new); } } + else { + PyObject **temp; + Py_XINCREF(obj); + temp = (PyObject **)optr; + *temp = obj; + return; + } } /* Assumes contiguous */ @@ -5815,7 +5807,8 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) dims.ptr, strides.ptr, NULL, fortran, NULL); if (ret == NULL) {descr=NULL;goto fail;} - if (descr->hasobject) { /* place Py_None in object positions */ + if (PyDataType_FLAGCHK(descr, NPY_ITEM_HASOBJECT)) { + /* place Py_None in object positions */ PyArray_FillObjectArray(ret, Py_None); if (PyErr_Occurred()) { descr=NULL; @@ -6235,9 +6228,12 @@ array_descr_set(PyArrayObject *self, PyObject *arg) PyErr_SetString(PyExc_TypeError, "invalid data-type for array"); return -1; } - if (newtype->hasobject || self->descr->hasobject) { - PyErr_SetString(PyExc_TypeError, \ - "Cannot change data-type for object" \ + if (PyDataType_FLAGCHK(newtype, NPY_ITEM_HASOBJECT) || + PyDataType_FLAGCHK(newtype, NPY_ITEM_IS_POINTER) || + PyDataType_FLAGCHK(self->descr, NPY_ITEM_HASOBJECT) || + PyDataType_FLAGCHK(self->descr, NPY_ITEM_IS_POINTER)) { + PyErr_SetString(PyExc_TypeError, \ + "Cannot change data-type for object " \ "array."); Py_DECREF(newtype); return -1; @@ -6535,7 +6531,7 @@ array_flat_set(PyArrayObject *self, PyObject *val) swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr); copyswap = self->descr->f->copyswap; - if (self->descr->hasobject) { + if (PyDataType_REFCHK(self->descr)) { while(selfit->index < selfit->size) { PyArray_Item_XDECREF(selfit->dataptr, self->descr); PyArray_Item_INCREF(arrit->dataptr, PyArray_DESCR(arr)); @@ -7520,9 +7516,9 @@ _broadcast_cast(PyArrayObject *out, PyArrayObject *in, PyErr_NoMemory(); return -1; } - if (out->descr->hasobject) + if (PyDataType_FLAGCHK(out->descr, NPY_NEEDS_INIT)) memset(buffers[0], 0, N*delsize); - if (in->descr->hasobject) + if (PyDataType_FLAGCHK(in->descr, NPY_NEEDS_INIT)) memset(buffers[1], 0, N*selsize); #if NPY_ALLOW_THREADS @@ -7548,12 +7544,12 @@ _broadcast_cast(PyArrayObject *out, PyArrayObject *in, } #endif Py_DECREF(multi); - if (in->descr->hasobject) { + if (PyDataType_REFCHK(in->descr)) { obptr = buffers[1]; for (i=0; i<N; i++, obptr+=selsize) PyArray_Item_XDECREF(obptr, out->descr); } - if (out->descr->hasobject) { + if (PyDataType_REFCHK(out->descr)) { obptr = buffers[0]; for (i=0; i<N; i++, obptr+=delsize) PyArray_Item_XDECREF(obptr, out->descr); @@ -10617,7 +10613,10 @@ static PyMemberDef arraydescr_members[] = { {"byteorder", T_CHAR, offsetof(PyArray_Descr, byteorder), RO, NULL}, {"itemsize", T_INT, offsetof(PyArray_Descr, elsize), RO, NULL}, {"alignment", T_INT, offsetof(PyArray_Descr, alignment), RO, NULL}, + /* Get rid of this in 1.1 */ {"hasobject", T_UBYTE, offsetof(PyArray_Descr, hasobject), RO, NULL}, + /* END */ + {"flags", T_UBYTE, offsetof(PyArray_Descr, hasobject), RO, NULL}, {"names", T_OBJECT, offsetof(PyArray_Descr, names), RO, NULL}, {NULL}, }; @@ -10870,7 +10869,7 @@ arraydescr_reduce(PyArray_Descr *self, PyObject *args) /* version number of this pickle type. Increment if we need to change the format. Be sure to handle the old versions in arraydescr_setstate. */ - const int version = 2; + const int version = 3; PyObject *ret, *mod, *obj; PyObject *state; char endian; @@ -10906,7 +10905,7 @@ arraydescr_reduce(PyArray_Descr *self, PyObject *args) endian = '<'; if (!PyArray_IsNativeByteOrder(endian)) endian = '>'; } - state = PyTuple_New(7); + state = PyTuple_New(8); PyTuple_SET_ITEM(state, 0, PyInt_FromLong(version)); PyTuple_SET_ITEM(state, 1, PyString_FromFormat("%c", endian)); PyTuple_SET_ITEM(state, 2, arraydescr_subdescr_get(self)); @@ -10932,6 +10931,7 @@ arraydescr_reduce(PyArray_Descr *self, PyObject *args) PyTuple_SET_ITEM(state, 5, PyInt_FromLong(elsize)); PyTuple_SET_ITEM(state, 6, PyInt_FromLong(alignment)); + PyTuple_SET_ITEM(state, 7, PyInt_FromLong(self->hasobject)); PyTuple_SET_ITEM(ret, 2, state); return ret; @@ -10944,8 +10944,9 @@ arraydescr_reduce(PyArray_Descr *self, PyObject *args) static int _descr_find_object(PyArray_Descr *self) { - if (self->hasobject || self->type_num == PyArray_OBJECT || self->kind == 'O') - return 1; + if (self->hasobject || self->type_num == PyArray_OBJECT || + self->kind == 'O') + return NPY_OBJECT_DTYPE_FLAGS; if (PyDescr_HASFIELDS(self)) { PyObject *key, *value, *title=NULL; PyArray_Descr *new; @@ -10958,8 +10959,8 @@ _descr_find_object(PyArray_Descr *self) return 0; } if (_descr_find_object(new)) { - new->hasobject = 1; - return 1; + new->hasobject = NPY_OBJECT_DTYPE_FLAGS; + return NPY_OBJECT_DTYPE_FLAGS; } } } @@ -10974,26 +10975,61 @@ static PyObject * arraydescr_setstate(PyArray_Descr *self, PyObject *args) { int elsize = -1, alignment = -1; - int version = 2; + int version = 3; char endian; PyObject *subarray, *fields, *names=NULL; int incref_names = 1; + int dtypeflags=0; if (self->fields == Py_None) {Py_INCREF(Py_None); return Py_None;} - if (!PyArg_ParseTuple(args, "(icOOOii)", &version, &endian, &subarray, - &names, &fields, &elsize, &alignment)) { - PyErr_Clear(); - if (!PyArg_ParseTuple(args, "(icOOii)", &version, &endian, - &subarray, &fields, &elsize, - &alignment)) { - PyErr_Clear(); + if (PyTuple_GET_SIZE(args) != 1 || + !(PyTuple_Check(PyTuple_GET_ITEM(args, 0)))) { + PyErr_BadInternalCall(); + return NULL; + } + switch (PyTuple_GET_SIZE(PyTuple_GET_ITEM(args,0))) { + case 8: + if (!PyArg_ParseTuple(args, "(icOOOiii)", &version, &endian, + &subarray, &names, &fields, &elsize, + &alignment, &dtypeflags)) { + return NULL; + } + break; + case 7: + if (!PyArg_ParseTuple(args, "(icOOOii)", &version, &endian, + &subarray, &names, &fields, &elsize, + &alignment)) { + return NULL; + } + break; + case 6: + if (!PyArg_ParseTuple(args, "(icOOii)", &version, + &endian, &subarray, &fields, + &elsize, &alignment)) { + PyErr_Clear(); + } + break; + case 5: version = 0; - if (!PyArg_ParseTuple(args, "(cOOii)", &endian, &subarray, - &fields, &elsize, &alignment)) { - return NULL; + if (!PyArg_ParseTuple(args, "(cOOii)", + &endian, &subarray, &fields, &elsize, + &alignment)) { + return NULL; } - } + break; + default: + version = -1; /* raise an error */ + } + + /* If we ever need another pickle format, increment the version + number. But we should still be able to handle the old versions. + */ + if (version < 0 || version > 3) { + PyErr_Format(PyExc_ValueError, + "can't handle version %d of numpy.dtype pickle", + version); + return NULL; } if (version == 1 || version == 0) { @@ -11010,18 +11046,8 @@ arraydescr_setstate(PyArray_Descr *self, PyObject *args) else { names = Py_None; } - version = 2; } - /* If we ever need another pickle format, increment the version - number. But we should still be able to handle the old versions. - */ - if (version != 2) { - PyErr_Format(PyExc_ValueError, - "can't handle version %d of numpy.dtype pickle", - version); - return NULL; - } if ((fields == Py_None && names != Py_None) || \ (names == Py_None && fields != Py_None)) { @@ -11064,7 +11090,10 @@ arraydescr_setstate(PyArray_Descr *self, PyObject *args) self->alignment = alignment; } - self->hasobject = _descr_find_object(self); + self->hasobject = dtypeflags; + if (version < 3) { + self->hasobject = _descr_find_object(self); + } Py_INCREF(Py_None); return Py_None; } diff --git a/numpy/core/src/arraytypes.inc.src b/numpy/core/src/arraytypes.inc.src index 963038619..4ccaa1140 100644 --- a/numpy/core/src/arraytypes.inc.src +++ b/numpy/core/src/arraytypes.inc.src @@ -514,7 +514,8 @@ VOID_getitem(char *ip, PyArrayObject *ap) } finish: - if (descr->hasobject) { + if (PyDataType_FLAGCHK(descr, NPY_ITEM_HASOBJECT) || + PyDataType_FLAGCHK(descr, NPY_ITEM_IS_POINTER)) { PyErr_SetString(PyExc_ValueError, "tried to get void-array with object" " members as buffer."); @@ -622,7 +623,8 @@ VOID_setitem(PyObject *op, char *ip, PyArrayObject *ap) { const void *buffer; Py_ssize_t buflen; - if (descr->hasobject) { + if (PyDataType_FLAGCHK(descr, NPY_ITEM_HASOBJECT) || + PyDataType_FLAGCHK(descr, NPY_ITEM_IS_POINTER)) { PyErr_SetString(PyExc_ValueError, "tried to set void-array with object" " members using buffer."); @@ -2105,7 +2107,7 @@ static PyArray_Descr @from@_Descr = { #NAME= Bool, Byte, UByte, Short, UShort, Int, UInt, Long, ULong, LongLong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, Object# #kind= GENBOOL, SIGNED, UNSIGNED, SIGNED, UNSIGNED, SIGNED, UNSIGNED, SIGNED, UNSIGNED, SIGNED, UNSIGNED, FLOATING, FLOATING, FLOATING, COMPLEX, COMPLEX, COMPLEX, OBJECT# #endian= |*3, =*14, |# -#isobject= 0*17,1# +#isobject= 0*17,NPY_OBJECT_DTYPE_FLAGS# */ static PyArray_ArrFuncs _Py@NAME@_ArrFuncs = { @@ -2154,7 +2156,7 @@ static PyArray_ArrFuncs _Py@NAME@_ArrFuncs = { (PyArray_ScalarKindFunc*)NULL, NULL, NULL, - 0 + 0, }; static PyArray_Descr @from@_Descr = { diff --git a/numpy/core/src/multiarraymodule.c b/numpy/core/src/multiarraymodule.c index c99c34a90..846c6f224 100644 --- a/numpy/core/src/multiarraymodule.c +++ b/numpy/core/src/multiarraymodule.c @@ -2571,7 +2571,9 @@ PyArray_LexSort(PyObject *sort_keys, int axis) "merge sort not available for item %d", i); goto fail; } - if (!object && mps[i]->descr->hasobject) object = 1; + if (!object && + PyDataType_FLAGCHK(mps[i]->descr, NPY_NEEDS_PYAPI)) + object = 1; its[i] = (PyArrayIterObject *)PyArray_IterAllButAxis \ ((PyObject *)mps[i], &axis); if (its[i]==NULL) goto fail; @@ -3715,7 +3717,7 @@ PyArray_PutTo(PyArrayObject *self, PyObject* values0, PyObject *indices0, if (values == NULL) goto fail; nv = PyArray_SIZE(values); if (nv <= 0) goto finish; - if (self->descr->hasobject) { + if (PyDataType_REFCHK(self->descr)) { switch(clipmode) { case NPY_RAISE: for(i=0; i<ni; i++) { @@ -3891,7 +3893,7 @@ PyArray_PutMask(PyArrayObject *self, PyObject* values0, PyObject* mask0) return Py_None; } if (nv > 0) { - if (self->descr->hasobject) { + if (PyDataType_REFCHK(self->descr)) { for(i=0; i<ni; i++) { src = values->data + chunk * (i % nv); tmp = ((Bool *)(mask->data))[i]; @@ -4337,9 +4339,8 @@ _use_inherit(PyArray_Descr *type, PyObject *newobj, int *errflag) new->names = conv->names; Py_XINCREF(new->names); } + new->hasobject = conv->hasobject; Py_DECREF(conv); - if (conv->hasobject) - new->hasobject = 1; *errflag = 0; return new; @@ -4417,7 +4418,7 @@ _convert_from_tuple(PyObject *obj) PyDimMem_FREE(shape.ptr); newdescr->subarray = _pya_malloc(sizeof(PyArray_ArrayDescr)); newdescr->subarray->base = type; - if (type->hasobject) newdescr->hasobject = 1; + newdescr->hasobject = type->hasobject; Py_INCREF(val); newdescr->subarray->shape = val; Py_XDECREF(newdescr->fields); @@ -4448,7 +4449,8 @@ _convert_from_array_descr(PyObject *obj) PyObject *nameslist; PyArray_Descr *new; PyArray_Descr *conv; - int hasobject=0; + int dtypeflags=0; + n = PyList_GET_SIZE(obj); nameslist = PyTuple_New(n); @@ -4505,8 +4507,7 @@ _convert_from_array_descr(PyObject *obj) "two fields with the same name"); goto fail; } - if (!hasobject && conv->hasobject) - hasobject = 1; + dtypeflags |= (conv->hasobject & NPY_FROM_FIELDS); tup = PyTuple_New((title == NULL ? 2 : 3)); PyTuple_SET_ITEM(tup, 0, (PyObject *)conv); PyTuple_SET_ITEM(tup, 1, PyInt_FromLong((long) totalsize)); @@ -4528,7 +4529,7 @@ _convert_from_array_descr(PyObject *obj) new->fields = fields; new->names = nameslist; new->elsize = totalsize; - new->hasobject=hasobject; + new->hasobject=dtypeflags; return new; fail: @@ -4558,7 +4559,7 @@ _convert_from_list(PyObject *obj, int align) PyObject *nameslist=NULL; int ret; int maxalign=0; - int hasobject=0; + int dtypeflags=0; n = PyList_GET_SIZE(obj); /* Ignore any empty string at end which _internal._commastring @@ -4580,8 +4581,7 @@ _convert_from_list(PyObject *obj, int align) Py_DECREF(key); goto fail; } - if (!hasobject && conv->hasobject) - hasobject=1; + dtypeflags |= (conv->hasobject & NPY_FROM_FIELDS); PyTuple_SET_ITEM(tup, 0, (PyObject *)conv); if (align) { int _align; @@ -4599,7 +4599,7 @@ _convert_from_list(PyObject *obj, int align) new = PyArray_DescrNewFromType(PyArray_VOID); new->fields = fields; new->names = nameslist; - new->hasobject=hasobject; + new->hasobject=dtypeflags; if (maxalign > 1) { totalsize = ((totalsize+maxalign-1)/maxalign)*maxalign; } @@ -4709,7 +4709,7 @@ _convert_from_dict(PyObject *obj, int align) int n, i; int totalsize; int maxalign=0; - int hasobject=0; + int dtypeflags=0; fields = PyDict_New(); if (fields == NULL) return (PyArray_Descr *)PyErr_NoMemory(); @@ -4815,8 +4815,7 @@ _convert_from_dict(PyObject *obj, int align) } Py_DECREF(tup); if ((ret == PY_FAIL) || (newdescr->elsize == 0)) goto fail; - if (!hasobject && newdescr->hasobject) - hasobject = 1; + dtypeflags |= (newdescr->hasobject & NPY_FROM_FIELDS); totalsize += newdescr->elsize; } @@ -4834,7 +4833,7 @@ _convert_from_dict(PyObject *obj, int align) } new->names = names; new->fields = fields; - new->hasobject=hasobject; + new->hasobject = dtypeflags; return new; fail: @@ -5415,7 +5414,7 @@ PyArray_Empty(int nd, intp *dims, PyArray_Descr *type, int fortran) fortran, NULL); if (ret == NULL) return NULL; - if (type->hasobject) { + if (PyDataType_REFCHK(type)) { PyArray_FillObjectArray(ret, Py_None); if (PyErr_Occurred()) {Py_DECREF(ret); return NULL;} } @@ -5476,8 +5475,8 @@ array_scalar(PyObject *ignored, PyObject *args, PyObject *kwds) "itemsize cannot be zero"); return NULL; } - - if (typecode->type_num == PyArray_OBJECT || typecode->f->listpickle) { + + if (PyDataType_FLAGCHK(typecode, NPY_ITEM_IS_POINTER)) { if (obj == NULL) obj = Py_None; dptr = &obj; } @@ -5534,7 +5533,7 @@ PyArray_Zeros(int nd, intp *dims, PyArray_Descr *type, int fortran) fortran, NULL); if (ret == NULL) return NULL; - if (type->hasobject) { + if (PyDataType_REFCHK(type)) { PyObject *zero = PyInt_FromLong(0); PyArray_FillObjectArray(ret, zero); Py_DECREF(zero); @@ -5617,8 +5616,8 @@ PyArray_FromString(char *data, intp slen, PyArray_Descr *dtype, if (dtype == NULL) dtype=PyArray_DescrFromType(PyArray_DEFAULT); - - if (dtype->hasobject) { + + if (PyDataType_FLAGCHK(dtype, NPY_ITEM_IS_POINTER)) { PyErr_SetString(PyExc_ValueError, "Cannot create an object array from" \ " a string"); @@ -5797,9 +5796,9 @@ PyArray_FromIter(PyObject *obj, PyArray_Descr *dtype, intp count) elsize = dtype->elsize; /* We would need to alter the memory RENEW code to decrement any - reference counts before just throwing away the memory. + reference counts before throwing away any memory. */ - if (dtype->hasobject) { + if (PyDataType_REFCHK(dtype)) { PyErr_SetString(PyExc_ValueError, "cannot create "\ "object arrays from iterator"); goto done; @@ -5911,7 +5910,7 @@ PyArray_FromFile(FILE *fp, PyArray_Descr *typecode, intp num, char *sep) PyArray_ScanFunc *scan; Bool binary; - if (typecode->hasobject) { + if (PyDataType_REFCHK(typecode)) { PyErr_SetString(PyExc_ValueError, "cannot read into" "object array"); Py_DECREF(typecode); @@ -6105,7 +6104,7 @@ PyArray_FromBuffer(PyObject *buf, PyArray_Descr *type, int write=1; - if (type->hasobject) { + if (PyDataType_REFCHK(type)) { PyErr_SetString(PyExc_ValueError, "cannot create an OBJECT array from memory"\ " buffer"); @@ -7227,29 +7226,28 @@ PyMODINIT_FUNC initmultiarray(void) { s = PyString_FromString("3.0"); PyDict_SetItemString(d, "__version__", s); Py_DECREF(s); - s = PyInt_FromLong(NPY_ALLOW_THREADS); - PyDict_SetItemString(d, "ALLOW_THREADS", s); - Py_DECREF(s); - s = PyInt_FromLong(NPY_BUFSIZE); - PyDict_SetItemString(d, "BUFSIZE", s); - Py_DECREF(s); +#define ADDCONST(NAME) \ + s = PyInt_FromLong(NPY_##NAME); \ + PyDict_SetItemString(d, #NAME, s); \ + Py_DECREF(s) - s = PyInt_FromLong(NPY_CLIP); - PyDict_SetItemString(d, "CLIP", s); - Py_DECREF(s); - s = PyInt_FromLong(NPY_RAISE); - PyDict_SetItemString(d, "RAISE", s); - Py_DECREF(s); + ADDCONST(ALLOW_THREADS); + ADDCONST(BUFSIZE); + ADDCONST(CLIP); - s = PyInt_FromLong(NPY_WRAP); - PyDict_SetItemString(d, "WRAP", s); - Py_DECREF(s); + ADDCONST(ITEM_HASOBJECT); + ADDCONST(LIST_PICKLE); + ADDCONST(ITEM_IS_POINTER); + ADDCONST(NEEDS_INIT); + ADDCONST(NEEDS_PYAPI); + ADDCONST(USE_GETITEM); - s = PyInt_FromLong(NPY_MAXDIMS); - PyDict_SetItemString(d, "MAXDIMS", s); - Py_DECREF(s); + ADDCONST(RAISE); + ADDCONST(WRAP); + ADDCONST(MAXDIMS); +#undef ADDCONST Py_INCREF(&PyArray_Type); PyDict_SetItemString(d, "ndarray", (PyObject *)&PyArray_Type); |