diff options
Diffstat (limited to 'numpy/core/src')
-rw-r--r-- | numpy/core/src/arrayobject.c | 28 | ||||
-rw-r--r-- | numpy/core/src/multiarraymodule.c | 51 |
2 files changed, 54 insertions, 25 deletions
diff --git a/numpy/core/src/arrayobject.c b/numpy/core/src/arrayobject.c index 417b12717..1a126e3e2 100644 --- a/numpy/core/src/arrayobject.c +++ b/numpy/core/src/arrayobject.c @@ -10729,32 +10729,10 @@ arraydescr_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) return NULL; if (align) { - conv = NULL; - if PyDict_Check(odescr) - conv = _convert_from_dict(odescr, 1); - else if PyList_Check(odescr) { - PyErr_SetString(PyExc_ValueError, - "align cannot be True" \ - " with array_descriptor " \ - "specification."); - return NULL; - } - else if PyString_Check(odescr) - conv = _convert_from_commastring(odescr, 1); - else { - PyErr_SetString(PyExc_ValueError, - "align can only be non-zero for " \ - "dictionary, list, and string objects."); - } - if (conv) return (PyObject *)conv; - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ValueError, - "data-type-descriptor not understood"); - } - return NULL; + if (!PyArray_DescrAlignConverter(odescr, &conv)) + return NULL; } - - if (!PyArray_DescrConverter(odescr, &conv)) + else if (!PyArray_DescrConverter(odescr, &conv)) return NULL; /* Get a new copy of it unless it's already a copy */ if (copy && conv->fields == Py_None) { diff --git a/numpy/core/src/multiarraymodule.c b/numpy/core/src/multiarraymodule.c index ec3cd88d2..d3c2830e1 100644 --- a/numpy/core/src/multiarraymodule.c +++ b/numpy/core/src/multiarraymodule.c @@ -4661,6 +4661,57 @@ _check_for_commastring(char *type, int len) /*MULTIARRAY_API + Get type-descriptor from an object forcing alignment if possible + None goes to DEFAULT type. +*/ +static int +PyArray_DescrAlignConverter(PyObject *obj, PyArray_Descr **at) +{ + if PyDict_Check(obj) { + *at = _convert_from_dict(obj, 1); + } + else if PyString_Check(obj) + *at = _convert_from_commastring(obj, 1); + else { + return PyArray_DescrConverter(obj, at); + } + if (*at == NULL) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ValueError, + "data-type-descriptor not understood"); + } + return PY_FAIL; + } + return PY_SUCCEED; +} + +/*MULTIARRAY_API + Get type-descriptor from an object forcing alignment if possible + None goes to NULL. +*/ +static int +PyArray_DescrAlignConverter2(PyObject *obj, PyArray_Descr **at) +{ + if PyDict_Check(obj) { + *at = _convert_from_dict(obj, 1); + } + else if PyString_Check(obj) + *at = _convert_from_commastring(obj, 1); + else { + return PyArray_DescrConverter2(obj, at); + } + if (*at == NULL) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ValueError, + "data-type-descriptor not understood"); + } + return PY_FAIL; + } + return PY_SUCCEED; +} + + +/*MULTIARRAY_API Get typenum from an object -- None goes to NULL */ static int |