From 020b51b46eceb1a8c2876aac263772ed55ba9a1a Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 19 Jan 2015 01:04:23 -0500 Subject: [PATCH] Don't use >= as sorting condition which could avoid breaking usage like: usort($a, function($a, $b) { return $a > $b; }) --- Zend/zend_sort.c | 13 +++++----- .../tests/array/usort_variation11.phpt | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 ext/standard/tests/array/usort_variation11.phpt diff --git a/Zend/zend_sort.c b/Zend/zend_sort.c index 383fe226b4..78ed0ebb5f 100644 --- a/Zend/zend_sort.c +++ b/Zend/zend_sort.c @@ -91,10 +91,9 @@ ZEND_API void zend_qsort(void *base, size_t nmemb, size_t siz, compare_func_t co /* }}} */ static inline void zend_sort_2(void *a, void *b, compare_func_t cmp, swap_func_t swp) /* {{{ */ { - if (cmp(a, b) <= 0) { - return; + if (cmp(a, b) > 0) { + swp(a, b); } - swp(a, b); } /* }}} */ @@ -109,7 +108,7 @@ static inline void zend_sort_3(void *a, void *b, void *c, compare_func_t cmp, sw } return; } - if (cmp(b, c) >= 0) { + if (cmp(c, b) <= 0) { swp(a, c); return; } @@ -215,7 +214,7 @@ ZEND_API void zend_insert_sort(void *base, size_t nmemb, size_t siz, compare_fun } if (j == start + siz) { j -= siz; - if (cmp(j, i) < 0) { + if (cmp(i, j) > 0) { j += siz; } break; @@ -338,7 +337,7 @@ ZEND_API void zend_sort(void *base, size_t nmemb, size_t siz, compare_func_t cmp i = pivot + siz; j = end - siz; while (1) { - while (cmp(i, pivot) < 0) { + while (cmp(pivot, i) > 0) { i += siz; if (UNEXPECTED(i == j)) { goto done; @@ -348,7 +347,7 @@ ZEND_API void zend_sort(void *base, size_t nmemb, size_t siz, compare_func_t cmp if (UNEXPECTED(j == i)) { goto done; } - while (cmp(pivot, j) < 0) { + while (cmp(j, pivot) > 0) { j -= siz; if (UNEXPECTED(j == i)) { goto done; diff --git a/ext/standard/tests/array/usort_variation11.phpt b/ext/standard/tests/array/usort_variation11.phpt new file mode 100644 index 0000000000..b6cdeef766 --- /dev/null +++ b/ext/standard/tests/array/usort_variation11.phpt @@ -0,0 +1,25 @@ +--TEST-- +Test usort() function : usage variations - binary return cmp +--FILE-- + $b; +} + +$range = array(2, 4, 8, 16, 32, 64, 128); + +foreach ($range as $r) { + $backup = $array = range(0, $r); + shuffle($array); + usort($array, "ucmp"); + if ($array != $backup) { + var_dump($array); + var_dump($backup); + die("Whatever sorting algo you used, this test should never be broken"); + } +} +echo "okey"; +?> +--EXPECT-- +okey -- 2.40.0