diff options
| author | Travis Oliphant <oliphant@enthought.com> | 2008-08-06 17:34:56 +0000 |
|---|---|---|
| committer | Travis Oliphant <oliphant@enthought.com> | 2008-08-06 17:34:56 +0000 |
| commit | ded1bf725d022e9e2ac5df3d6785a14e702f6fec (patch) | |
| tree | c9b811585cd725cc69c6173dd736af64cdf98e86 /numpy | |
| parent | db148964e45b01604e6df0a8e0f3c35f2fc951c6 (diff) | |
| download | numpy-ded1bf725d022e9e2ac5df3d6785a14e702f6fec.tar.gz | |
Fix ticket #877 along with other bugs not yet reported for data-types with titles.
Diffstat (limited to 'numpy')
| -rw-r--r-- | numpy/core/include/numpy/ndarrayobject.h | 18 | ||||
| -rw-r--r-- | numpy/core/src/arraymethods.c | 1 | ||||
| -rw-r--r-- | numpy/core/src/arrayobject.c | 13 | ||||
| -rw-r--r-- | numpy/core/src/arraytypes.inc.src | 3 |
4 files changed, 30 insertions, 5 deletions
diff --git a/numpy/core/include/numpy/ndarrayobject.h b/numpy/core/include/numpy/ndarrayobject.h index 84e94f470..58728c94b 100644 --- a/numpy/core/include/numpy/ndarrayobject.h +++ b/numpy/core/include/numpy/ndarrayobject.h @@ -2014,9 +2014,15 @@ typedef struct { #include "old_defines.h" -#ifdef __cplusplus -} -#endif +/* + Check to see if this key in the dictionary is the "title" + entry of the tuple (i.e. a duplicate dictionary entry in the fields + dict. +*/ + +#define NPY_TITLE_KEY(key, value) ((PyTuple_GET_SIZE((value))==3) && \ + (PyTuple_GET_ITEM((value), 2) == (key))) + /* Define python version independent deprecation macro */ @@ -2026,4 +2032,10 @@ typedef struct { #define DEPRECATE(msg) PyErr_Warn(PyExc_DeprecationWarning,msg) #endif + +#ifdef __cplusplus +} +#endif + + #endif /* NPY_NDARRAYOBJECT_H */ diff --git a/numpy/core/src/arraymethods.c b/numpy/core/src/arraymethods.c index 964c18dbd..8e50bcdf7 100644 --- a/numpy/core/src/arraymethods.c +++ b/numpy/core/src/arraymethods.c @@ -1006,6 +1006,7 @@ _deepcopy_call(char *iptr, char *optr, PyArray_Descr *dtype, int offset; Py_ssize_t pos=0; while (PyDict_Next(dtype->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) return; _deepcopy_call(iptr + offset, optr + offset, new, diff --git a/numpy/core/src/arrayobject.c b/numpy/core/src/arrayobject.c index d1074a887..1fbbe6a9e 100644 --- a/numpy/core/src/arrayobject.c +++ b/numpy/core/src/arrayobject.c @@ -13,7 +13,7 @@ Travis Oliphant, oliphant@ee.byu.edu Brigham Young Univeristy -:8613 + maintainer email: oliphant.travis@ieee.org Numarray design (which provided guidance) by @@ -171,6 +171,7 @@ PyArray_Item_INCREF(char *data, PyArray_Descr *descr) Py_ssize_t pos=0; while (PyDict_Next(descr->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) { return; @@ -202,8 +203,10 @@ PyArray_Item_XDECREF(char *data, PyArray_Descr *descr) PyArray_Descr *new; int offset; Py_ssize_t pos=0; + while (PyDict_Next(descr->fields, &pos, &key, &value)) { - if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, + if NPY_TITLE_KEY(key, value) continue; + if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) { return; } @@ -4814,6 +4817,7 @@ _void_compare(PyArrayObject *self, PyArrayObject *other, int cmp_op) op = (cmp_op == Py_EQ ? n_ops.logical_and : n_ops.logical_or); while (PyDict_Next(self->descr->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; a = PyArray_EnsureAnyArray(array_subscript(self, key)); if (a==NULL) { Py_XDECREF(res); @@ -5706,6 +5710,7 @@ _putzero(char *optr, PyObject *zero, PyArray_Descr *dtype) int offset; Py_ssize_t pos=0; while (PyDict_Next(dtype->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) return; _putzero(optr + offset, zero, new); @@ -5876,6 +5881,7 @@ _fillobject(char *optr, PyObject *obj, PyArray_Descr *dtype) int offset; Py_ssize_t pos=0; while (PyDict_Next(dtype->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) return; _fillobject(optr + offset, obj, new); @@ -11296,6 +11302,7 @@ _arraydescr_isnative(PyArray_Descr *self) int offset; Py_ssize_t pos=0; while(PyDict_Next(self->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) return -1; if (!_arraydescr_isnative(new)) return 0; @@ -11567,6 +11574,7 @@ _descr_find_object(PyArray_Descr *self) int offset; Py_ssize_t pos=0; while (PyDict_Next(self->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) { PyErr_Clear(); @@ -11760,6 +11768,7 @@ PyArray_DescrNewByteorder(PyArray_Descr *self, char newendian) /* make new dictionary with replaced */ /* PyArray_Descr Objects */ while(PyDict_Next(self->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyString_Check(key) || \ !PyTuple_Check(value) || \ ((len=PyTuple_GET_SIZE(value)) < 2)) diff --git a/numpy/core/src/arraytypes.inc.src b/numpy/core/src/arraytypes.inc.src index 29c581f55..23a6ed167 100644 --- a/numpy/core/src/arraytypes.inc.src +++ b/numpy/core/src/arraytypes.inc.src @@ -1306,6 +1306,7 @@ VOID_copyswapn (char *dst, intp dstride, char *src, intp sstride, Py_ssize_t pos=0; descr = arr->descr; while (PyDict_Next(descr->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) { arr->descr=descr;return; @@ -1357,6 +1358,7 @@ VOID_copyswap (char *dst, char *src, int swap, PyArrayObject *arr) Py_ssize_t pos=0; descr = arr->descr; /* Save it */ while (PyDict_Next(descr->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) { arr->descr=descr;return; @@ -1596,6 +1598,7 @@ VOID_nonzero (char *ip, PyArrayObject *ap) descr = ap->descr; savedflags = ap->flags; while (PyDict_Next(descr->fields, &pos, &key, &value)) { + if NPY_TITLE_KEY(key, value) continue; if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) {PyErr_Clear(); continue;} ap->descr = new; |
