diff options
author | Travis Oliphant <oliphant@enthought.com> | 2006-09-15 18:05:27 +0000 |
---|---|---|
committer | Travis Oliphant <oliphant@enthought.com> | 2006-09-15 18:05:27 +0000 |
commit | a761817d410c96e93a413f6ad98de17cb20fbd6b (patch) | |
tree | 5bf18c77e3eb5a814aa0e36d707c3f2f04e0ead3 /numpy | |
parent | b3a5ff58124174ff9beab9118039b16db8a6b83d (diff) | |
download | numpy-a761817d410c96e93a413f6ad98de17cb20fbd6b.tar.gz |
Add DescrAlignConverter
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/core/code_generators/multiarray_api_order.txt | 2 | ||||
-rw-r--r-- | numpy/core/include/numpy/ndarrayobject.h | 1 | ||||
-rw-r--r-- | numpy/core/src/arrayobject.c | 28 | ||||
-rw-r--r-- | numpy/core/src/multiarraymodule.c | 51 |
4 files changed, 57 insertions, 25 deletions
diff --git a/numpy/core/code_generators/multiarray_api_order.txt b/numpy/core/code_generators/multiarray_api_order.txt index 15ab7a9e9..997e45f6d 100644 --- a/numpy/core/code_generators/multiarray_api_order.txt +++ b/numpy/core/code_generators/multiarray_api_order.txt @@ -78,3 +78,5 @@ PyArray_OutputConverter PyArray_BroadcastToShape _PyArray_SigintHandler _PyArray_GetSigintBuf +PyArray_DescrAlignConverter +PyArray_DescrAlignConverter2
\ No newline at end of file diff --git a/numpy/core/include/numpy/ndarrayobject.h b/numpy/core/include/numpy/ndarrayobject.h index 95e076c13..73dff296c 100644 --- a/numpy/core/include/numpy/ndarrayobject.h +++ b/numpy/core/include/numpy/ndarrayobject.h @@ -1478,6 +1478,7 @@ typedef struct { #define PyArray_ToScalar(data, arr) \ PyArray_Scalar(data, PyArray_DESCR(arr), (PyObject *)arr) + /* These might be faster without the dereferencing of obj going on inside -- of course an optimizing compiler should inline the constants inside a for loop making it a moot point 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 |