summaryrefslogtreecommitdiff
path: root/scipy/base/src/arrayobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'scipy/base/src/arrayobject.c')
-rw-r--r--scipy/base/src/arrayobject.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/scipy/base/src/arrayobject.c b/scipy/base/src/arrayobject.c
index f678114a8..0c8ff4380 100644
--- a/scipy/base/src/arrayobject.c
+++ b/scipy/base/src/arrayobject.c
@@ -721,8 +721,7 @@ PyArray_FromDimsAndDataAndDescr(int nd, int *d,
{
PyObject *ret;
- if (!PyArray_ISNBO(descr->byteorder) && \
- (descr->byteorder != '|'))
+ if (!PyArray_ISNBO(descr->byteorder))
descr->byteorder = '=';
#if SIZEOF_INTP != SIZEOF_INT
@@ -812,6 +811,7 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
itemsize = descr->elsize;
type = descr->typeobj;
copyswap = descr->f->copyswap;
+ swap = !PyArray_ISNBO(descr->byteorder);
if (type->tp_itemsize != 0) /* String type */
obj = type->tp_alloc(type, itemsize);
else
@@ -850,6 +850,7 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
vobj->obval = NULL;
vobj->ob_size = itemsize;
vobj->flags = BEHAVED_FLAGS | OWNDATA;
+ swap = 0;
if (type != &PyVoidArrType_Type && descr->fields) {
name = PyString_InternFromString("fields");
PyObject_GenericSetAttr(obj, name, \
@@ -877,7 +878,6 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
destptr = _SOFFSET_(obj, type_num);
}
/* copyswap for OBJECT increments the reference count */
- swap = !PyArray_ISNBO(descr->byteorder);
copyswap(destptr, data, swap, itemsize);
return obj;
}
@@ -5825,7 +5825,7 @@ array_fromattr(PyObject *op, PyArray_Descr *typecode, int flags)
return r;
}
-/* Steals a reference to newtype */
+/* Steals a reference to newtype --- which can be NULL */
static PyObject *
array_fromobject(PyObject *op, PyArray_Descr *newtype, int min_depth,
int max_depth, int flags)
@@ -5939,6 +5939,7 @@ PyArray_ObjectType(PyObject *op, int minimum_type)
FORTRAN,
ALIGNED,
WRITEABLE,
+ NOTSWAPPED,
ENSURECOPY,
UPDATEIFCOPY,
FORCECAST,
@@ -5982,6 +5983,16 @@ PyArray_FromAny(PyObject *op, PyArray_Descr *descr, int min_depth,
if (requires & ENSURECOPY) {
requires |= DEFAULT_FLAGS;
}
+ if (requires & NOTSWAPPED) {
+ if (!descr && PyArray_Check(op) && \
+ !PyArray_ISNBO(PyArray_DESCR(op)->byteorder)) {
+ descr = PyArray_DescrNew(PyArray_DESCR(op));
+ }
+ else if ((descr && !PyArray_ISNBO(descr->byteorder))) {
+ PyArray_DESCR_REPLACE(descr);
+ }
+ descr->byteorder = PyArray_NATIVE;
+ }
return array_fromobject(op, descr, min_depth, max_depth,
requires);