summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--numpy/core/src/npysort/timsort.c.src60
-rw-r--r--numpy/core/tests/test_multiarray.py4
2 files changed, 44 insertions, 20 deletions
diff --git a/numpy/core/src/npysort/timsort.c.src b/numpy/core/src/npysort/timsort.c.src
index 1fd86ff97..26313ca5b 100644
--- a/numpy/core/src/npysort/timsort.c.src
+++ b/numpy/core/src/npysort/timsort.c.src
@@ -1313,6 +1313,12 @@ timsort_@suff@(void *start, npy_intp num, void *varr)
npy_intp l, n, stack_ptr, minrun;
run stack[TIMSORT_STACK_SIZE];
buffer_@suff@ buffer;
+
+ /* Items that have zero size don't make sense to sort */
+ if (len == 0) {
+ return 0;
+ }
+
buffer.pw = NULL;
buffer.size = 0;
buffer.len = len;
@@ -1341,12 +1347,11 @@ timsort_@suff@(void *start, npy_intp num, void *varr)
if (NPY_UNLIKELY(ret < 0)) { goto cleanup; }
ret = 0;
-cleanup:
+cleanup:
if (buffer.pw != NULL) {
free(buffer.pw);
}
-
return ret;
}
@@ -1696,6 +1701,12 @@ atimsort_@suff@(void *start, npy_intp *tosort, npy_intp num, void *varr)
npy_intp l, n, stack_ptr, minrun;
run stack[TIMSORT_STACK_SIZE];
buffer_intp buffer;
+
+ /* Items that have zero size don't make sense to sort */
+ if (len == 0) {
+ return 0;
+ }
+
buffer.pw = NULL;
buffer.size = 0;
stack_ptr = 0;
@@ -1719,12 +1730,11 @@ atimsort_@suff@(void *start, npy_intp *tosort, npy_intp num, void *varr)
if (NPY_UNLIKELY(ret < 0)) { goto cleanup; }
ret = 0;
-cleanup:
+cleanup:
if (buffer.pw != NULL) {
free(buffer.pw);
}
-
return ret;
}
@@ -2121,46 +2131,54 @@ npy_force_collapse(char *arr, run *stack, npy_intp *stack_ptr,
int
npy_timsort(void *start, npy_intp num, void *varr)
{
- size_t len = PyArray_ITEMSIZE(varr);
- PyArray_CompareFunc *cmp = PyArray_DESCR(varr)->f->compare;
+ PyArrayObject *arr = varr;
+ size_t len = PyArray_ITEMSIZE(arr);
+ PyArray_CompareFunc *cmp = PyArray_DESCR(arr)->f->compare;
int ret;
npy_intp l, n, stack_ptr, minrun;
run stack[TIMSORT_STACK_SIZE];
buffer_char buffer;
+
+ /* Items that have zero size don't make sense to sort */
+ if (len == 0) {
+ return 0;
+ }
+
buffer.pw = NULL;
buffer.size = 0;
buffer.len = len;
stack_ptr = 0;
minrun = compute_min_run_short(num);
+
/* used for insertion sort and gallop key */
ret = resize_buffer_char(&buffer, len);
if (NPY_UNLIKELY(ret < 0)) { goto cleanup; }
for (l = 0; l < num;) {
- n = npy_count_run(start, l, num, minrun, buffer.pw, len, cmp, varr);
+ n = npy_count_run(start, l, num, minrun, buffer.pw, len, cmp, arr);
+
/* both s and l are scaled by len */
stack[stack_ptr].s = l;
stack[stack_ptr].l = n;
++stack_ptr;
- ret = npy_try_collapse(start, stack, &stack_ptr, &buffer, len, cmp, varr);
+ ret = npy_try_collapse(start, stack, &stack_ptr, &buffer, len, cmp, arr);
if (NPY_UNLIKELY(ret < 0)) { goto cleanup; }
l += n;
}
- ret = npy_force_collapse(start, stack, &stack_ptr, &buffer, len, cmp, varr);
+ ret = npy_force_collapse(start, stack, &stack_ptr, &buffer, len, cmp, arr);
if (NPY_UNLIKELY(ret < 0)) { goto cleanup; }
ret = 0;
-cleanup:
+cleanup:
if (buffer.pw != NULL) {
free(buffer.pw);
}
-
return ret;
}
@@ -2509,25 +2527,32 @@ npy_aforce_collapse(char *arr, npy_intp *tosort, run *stack,
int
npy_atimsort(void *start, npy_intp *tosort, npy_intp num, void *varr)
{
- size_t len = PyArray_ITEMSIZE(varr);
- PyArray_CompareFunc *cmp = PyArray_DESCR(varr)->f->compare;
+ PyArrayObject *arr = varr;
+ size_t len = PyArray_ITEMSIZE(arr);
+ PyArray_CompareFunc *cmp = PyArray_DESCR(arr)->f->compare;
int ret;
npy_intp l, n, stack_ptr, minrun;
run stack[TIMSORT_STACK_SIZE];
buffer_intp buffer;
+
+ /* Items that have zero size don't make sense to sort */
+ if (len == 0) {
+ return 0;
+ }
+
buffer.pw = NULL;
buffer.size = 0;
stack_ptr = 0;
minrun = compute_min_run_short(num);
for (l = 0; l < num;) {
- n = npy_acount_run(start, tosort, l, num, minrun, len, cmp, varr);
+ n = npy_acount_run(start, tosort, l, num, minrun, len, cmp, arr);
/* both s and l are scaled by len */
stack[stack_ptr].s = l;
stack[stack_ptr].l = n;
++stack_ptr;
ret = npy_atry_collapse(start, tosort, stack, &stack_ptr, &buffer, len, cmp,
- varr);
+ arr);
if (NPY_UNLIKELY(ret < 0)) { goto cleanup; }
@@ -2535,16 +2560,15 @@ npy_atimsort(void *start, npy_intp *tosort, npy_intp num, void *varr)
}
ret = npy_aforce_collapse(start, tosort, stack, &stack_ptr, &buffer, len,
- cmp, varr);
+ cmp, arr);
if (NPY_UNLIKELY(ret < 0)) { goto cleanup; }
ret = 0;
-cleanup:
+cleanup:
if (buffer.pw != NULL) {
free(buffer.pw);
}
-
return ret;
}
diff --git a/numpy/core/tests/test_multiarray.py b/numpy/core/tests/test_multiarray.py
index 1378330dd..62184de4e 100644
--- a/numpy/core/tests/test_multiarray.py
+++ b/numpy/core/tests/test_multiarray.py
@@ -1395,10 +1395,10 @@ class TestZeroSizeFlexible(object):
sort_func(zs, kind=kind, **kwargs)
def test_sort(self):
- self._test_sort_partition('sort', kinds='qhm')
+ self._test_sort_partition('sort', kinds='qhmt')
def test_argsort(self):
- self._test_sort_partition('argsort', kinds='qhm')
+ self._test_sort_partition('argsort', kinds='qhmt')
def test_partition(self):
self._test_sort_partition('partition', kinds=['introselect'], kth=2)