summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorTravis Oliphant <oliphant@enthought.com>2008-08-06 17:34:56 +0000
committerTravis Oliphant <oliphant@enthought.com>2008-08-06 17:34:56 +0000
commitded1bf725d022e9e2ac5df3d6785a14e702f6fec (patch)
treec9b811585cd725cc69c6173dd736af64cdf98e86 /numpy
parentdb148964e45b01604e6df0a8e0f3c35f2fc951c6 (diff)
downloadnumpy-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.h18
-rw-r--r--numpy/core/src/arraymethods.c1
-rw-r--r--numpy/core/src/arrayobject.c13
-rw-r--r--numpy/core/src/arraytypes.inc.src3
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;