Don't use >= as sorting condition

which could avoid breaking usage like:

usort($a, function($a, $b) { return $a > $b; })
This commit is contained in:
Xinchen Hui 2015-01-19 01:04:23 -05:00
parent 0706032b73
commit 020b51b46e
2 changed files with 31 additions and 7 deletions

View file

@ -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) /* {{{ */ { static inline void zend_sort_2(void *a, void *b, compare_func_t cmp, swap_func_t swp) /* {{{ */ {
if (cmp(a, b) <= 0) { if (cmp(a, b) > 0) {
return;
}
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; return;
} }
if (cmp(b, c) >= 0) { if (cmp(c, b) <= 0) {
swp(a, c); swp(a, c);
return; 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) { if (j == start + siz) {
j -= siz; j -= siz;
if (cmp(j, i) < 0) { if (cmp(i, j) > 0) {
j += siz; j += siz;
} }
break; 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; i = pivot + siz;
j = end - siz; j = end - siz;
while (1) { while (1) {
while (cmp(i, pivot) < 0) { while (cmp(pivot, i) > 0) {
i += siz; i += siz;
if (UNEXPECTED(i == j)) { if (UNEXPECTED(i == j)) {
goto done; 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)) { if (UNEXPECTED(j == i)) {
goto done; goto done;
} }
while (cmp(pivot, j) < 0) { while (cmp(j, pivot) > 0) {
j -= siz; j -= siz;
if (UNEXPECTED(j == i)) { if (UNEXPECTED(j == i)) {
goto done; goto done;

View file

@ -0,0 +1,25 @@
--TEST--
Test usort() function : usage variations - binary return cmp
--FILE--
<?php
function ucmp($a, $b) {
return $a > $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