From: Xinchen Hui Date: Mon, 19 Jan 2015 06:04:23 +0000 (-0500) Subject: Don't use >= as sorting condition X-Git-Tag: PRE_PHP7_REMOVALS~25^2~95 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=020b51b46eceb1a8c2876aac263772ed55ba9a1a;p=php Don't use >= as sorting condition which could avoid breaking usage like: usort($a, function($a, $b) { return $a > $b; }) --- 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