summaryrefslogtreecommitdiff
path: root/numpy/core
diff options
context:
space:
mode:
authorMatti Picus <matti.picus@gmail.com>2020-03-31 23:22:01 +0300
committerGitHub <noreply@github.com>2020-03-31 23:22:01 +0300
commit642181c76b11bd1cc87ee7443d3ee215744df0fd (patch)
treeff83018220f879b7dbc65644f096f3c0fe698a83 /numpy/core
parent5d8bcae56a337d21d7bf60d042c7dff32d91b451 (diff)
parentb88415edf288cff6ab89b19bb7f7ca55ec1e6ade (diff)
downloadnumpy-642181c76b11bd1cc87ee7443d3ee215744df0fd.tar.gz
Merge pull request #15882 from eric-wieser/reject-illegal-strides-in-ndarray.__new__
BUG: Do not ignore empty tuple of strides in ndarray.__new__
Diffstat (limited to 'numpy/core')
-rw-r--r--numpy/core/src/multiarray/arrayobject.c7
-rw-r--r--numpy/core/src/multiarray/conversion_utils.c14
-rw-r--r--numpy/core/src/multiarray/conversion_utils.h3
-rw-r--r--numpy/core/tests/test_multiarray.py6
4 files changed, 27 insertions, 3 deletions
diff --git a/numpy/core/src/multiarray/arrayobject.c b/numpy/core/src/multiarray/arrayobject.c
index 16896aa12..dedaf38eb 100644
--- a/numpy/core/src/multiarray/arrayobject.c
+++ b/numpy/core/src/multiarray/arrayobject.c
@@ -41,6 +41,7 @@ maintainer email: oliphant.travis@ieee.org
#include "arraytypes.h"
#include "scalartypes.h"
#include "arrayobject.h"
+#include "conversion_utils.h"
#include "ctors.h"
#include "methods.h"
#include "descriptor.h"
@@ -1624,7 +1625,7 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
PyArray_Descr *descr = NULL;
int itemsize;
PyArray_Dims dims = {NULL, 0};
- PyArray_Dims strides = {NULL, 0};
+ PyArray_Dims strides = {NULL, -1};
PyArray_Chunk buffer;
npy_longlong offset = 0;
NPY_ORDER order = NPY_CORDER;
@@ -1645,7 +1646,7 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
PyArray_BufferConverter,
&buffer,
&offset,
- &PyArray_IntpConverter,
+ &PyArray_OptionalIntpConverter,
&strides,
&PyArray_OrderConverter,
&order)) {
@@ -1660,7 +1661,7 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
itemsize = descr->elsize;
- if (strides.ptr != NULL) {
+ if (strides.len != -1) {
npy_intp nb, off;
if (strides.len != dims.len) {
PyErr_SetString(PyExc_ValueError,
diff --git a/numpy/core/src/multiarray/conversion_utils.c b/numpy/core/src/multiarray/conversion_utils.c
index 484a13134..260ae7080 100644
--- a/numpy/core/src/multiarray/conversion_utils.c
+++ b/numpy/core/src/multiarray/conversion_utils.c
@@ -137,6 +137,20 @@ PyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq)
return NPY_SUCCEED;
}
+/*
+ * Like PyArray_IntpConverter, but leaves `seq` untouched if `None` is passed
+ * rather than treating `None` as `()`.
+ */
+NPY_NO_EXPORT int
+PyArray_OptionalIntpConverter(PyObject *obj, PyArray_Dims *seq)
+{
+ if (obj == Py_None) {
+ return NPY_SUCCEED;
+ }
+
+ return PyArray_IntpConverter(obj, seq);
+}
+
/*NUMPY_API
* Get buffer chunk from object
*
diff --git a/numpy/core/src/multiarray/conversion_utils.h b/numpy/core/src/multiarray/conversion_utils.h
index 9bf712c3b..bee0c6064 100644
--- a/numpy/core/src/multiarray/conversion_utils.h
+++ b/numpy/core/src/multiarray/conversion_utils.h
@@ -7,6 +7,9 @@ NPY_NO_EXPORT int
PyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq);
NPY_NO_EXPORT int
+PyArray_OptionalIntpConverter(PyObject *obj, PyArray_Dims *seq);
+
+NPY_NO_EXPORT int
PyArray_BufferConverter(PyObject *obj, PyArray_Chunk *buf);
NPY_NO_EXPORT int
diff --git a/numpy/core/tests/test_multiarray.py b/numpy/core/tests/test_multiarray.py
index 0d035388d..0b99008e0 100644
--- a/numpy/core/tests/test_multiarray.py
+++ b/numpy/core/tests/test_multiarray.py
@@ -679,6 +679,12 @@ class TestZeroRank:
y[()] = 6
assert_equal(x[()], 6)
+ # strides and shape must be the same length
+ with pytest.raises(ValueError):
+ np.ndarray((2,), strides=())
+ with pytest.raises(ValueError):
+ np.ndarray((), strides=(2,))
+
def test_output(self):
x = np.array(2)
assert_raises(ValueError, np.add, x, [1], x)