diff options
Diffstat (limited to 'numpy')
| -rw-r--r-- | numpy/core/src/multiarray/_multiarray_tests.c.src | 7 | ||||
| -rw-r--r-- | numpy/core/src/multiarray/common.c | 1 | ||||
| -rw-r--r-- | numpy/core/src/multiarray/descriptor.c | 6 | ||||
| -rw-r--r-- | numpy/core/src/multiarray/getset.c | 1 | ||||
| -rw-r--r-- | numpy/core/tests/test_dtype.py | 13 |
5 files changed, 23 insertions, 5 deletions
diff --git a/numpy/core/src/multiarray/_multiarray_tests.c.src b/numpy/core/src/multiarray/_multiarray_tests.c.src index 0fcebedc7..b22b2c14d 100644 --- a/numpy/core/src/multiarray/_multiarray_tests.c.src +++ b/numpy/core/src/multiarray/_multiarray_tests.c.src @@ -1035,7 +1035,7 @@ get_all_cast_information(PyObject *NPY_UNUSED(mod), PyObject *NPY_UNUSED(args)) PyObject *classes = PyObject_CallMethod( (PyObject *)&PyArrayDescr_Type, "__subclasses__", ""); if (classes == NULL) { - return NULL; + goto fail; } Py_SETREF(classes, PySequence_Fast(classes, NULL)); if (classes == NULL) { @@ -2010,6 +2010,10 @@ get_struct_alignments(PyObject *NPY_UNUSED(self), PyObject *args) { PyObject *ret = PyTuple_New(3); PyObject *alignment, *size, *val; + if (ret == NULL) { + return NULL; + } + /**begin repeat * #N = 1,2,3# */ @@ -2019,6 +2023,7 @@ get_struct_alignments(PyObject *NPY_UNUSED(self), PyObject *args) { Py_DECREF(alignment); Py_DECREF(size); if (val == NULL) { + Py_DECREF(ret); return NULL; } PyTuple_SET_ITEM(ret, @N@-1, val); diff --git a/numpy/core/src/multiarray/common.c b/numpy/core/src/multiarray/common.c index aa612146c..da8d23a26 100644 --- a/numpy/core/src/multiarray/common.c +++ b/numpy/core/src/multiarray/common.c @@ -136,7 +136,6 @@ _zerofill(PyArrayObject *ret) PyArray_FillObjectArray(ret, zero); Py_DECREF(zero); if (PyErr_Occurred()) { - Py_DECREF(ret); return -1; } } diff --git a/numpy/core/src/multiarray/descriptor.c b/numpy/core/src/multiarray/descriptor.c index a23ee6d2c..4955062c0 100644 --- a/numpy/core/src/multiarray/descriptor.c +++ b/numpy/core/src/multiarray/descriptor.c @@ -2164,6 +2164,7 @@ arraydescr_names_set( N = PyTuple_GET_SIZE(self->names); if (!PySequence_Check(val) || PyObject_Size((PyObject *)val) != N) { + /* Should be a TypeError, but this should be deprecated anyway. */ PyErr_Format(PyExc_ValueError, "must replace all names at once with a sequence of length %d", N); @@ -2172,16 +2173,17 @@ arraydescr_names_set( /* Make sure all entries are strings */ for (i = 0; i < N; i++) { PyObject *item; - int valid = 1; + int valid; item = PySequence_GetItem(val, i); valid = PyUnicode_Check(item); - Py_DECREF(item); if (!valid) { PyErr_Format(PyExc_ValueError, "item #%d of names is of type %s and not string", i, Py_TYPE(item)->tp_name); + Py_DECREF(item); return -1; } + Py_DECREF(item); } /* Invalidate cached hash value */ self->hash = -1; diff --git a/numpy/core/src/multiarray/getset.c b/numpy/core/src/multiarray/getset.c index eb55e5e61..ab35548ed 100644 --- a/numpy/core/src/multiarray/getset.c +++ b/numpy/core/src/multiarray/getset.c @@ -808,6 +808,7 @@ array_imag_get(PyArrayObject *self, void *NPY_UNUSED(ignored)) return NULL; } if (_zerofill(ret) < 0) { + Py_DECREF(ret); return NULL; } PyArray_CLEARFLAGS(ret, NPY_ARRAY_WRITEABLE); diff --git a/numpy/core/tests/test_dtype.py b/numpy/core/tests/test_dtype.py index 356b53df9..32e2c6842 100644 --- a/numpy/core/tests/test_dtype.py +++ b/numpy/core/tests/test_dtype.py @@ -223,7 +223,8 @@ class TestRecord: assert refcounts == refcounts_new def test_mutate(self): - # Mutating a dtype should reset the cached hash value + # Mutating a dtype should reset the cached hash value. + # NOTE: Mutating should be deprecated, but new API added to replace it. a = np.dtype([('yo', int)]) b = np.dtype([('yo', int)]) c = np.dtype([('ye', int)]) @@ -237,6 +238,16 @@ class TestRecord: assert_dtype_equal(a, b) assert_dtype_not_equal(a, c) + def test_mutate_error(self): + # NOTE: Mutating should be deprecated, but new API added to replace it. + a = np.dtype("i,i") + + with pytest.raises(ValueError, match="must replace all names at once"): + a.names = ["f0"] + + with pytest.raises(ValueError, match=".*and not string"): + a.names = ["f0", b"not a unicode name"] + def test_not_lists(self): """Test if an appropriate exception is raised when passing bad values to the dtype constructor. |
