mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
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:
parent
0706032b73
commit
020b51b46e
2 changed files with 31 additions and 7 deletions
|
@ -91,11 +91,10 @@ 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);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
static inline void zend_sort_3(void *a, void *b, void *c, compare_func_t cmp, swap_func_t swp) /* {{{ */ {
|
static inline void zend_sort_3(void *a, void *b, void *c, compare_func_t cmp, swap_func_t swp) /* {{{ */ {
|
||||||
|
@ -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;
|
||||||
|
|
25
ext/standard/tests/array/usort_variation11.phpt
Normal file
25
ext/standard/tests/array/usort_variation11.phpt
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue