Skip to content

Commit

Permalink
Make array_multisort() signature more variadic
Browse files Browse the repository at this point in the history
The second and third arguments are not always the sort_order and
sort_flags -- they can also be in reverse order, or be arrays
altogether. Move them into the variadic parameter to avoid awkward
error messages.
  • Loading branch information
nikic committed Sep 9, 2020
1 parent 0222204 commit d37d222
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,7 @@ Name: array1
Is passed by reference: yes
Can be passed by value: yes

Name: sort_order
Is passed by reference: yes
Can be passed by value: yes

Name: sort_flags
Is passed by reference: yes
Can be passed by value: yes

Name: arrays
Name: rest
Is passed by reference: yes
Can be passed by value: yes

Expand Down
10 changes: 3 additions & 7 deletions ext/standard/basic_functions.stub.php
Original file line number Diff line number Diff line change
Expand Up @@ -222,15 +222,11 @@ function array_udiff_uassoc(array $array, ...$rest): array {}

/**
* @param array $array1
* @param int $sort_order
* @param int $sort_flags
* @param array $arrays
* @param array|int $rest
* @prefer-ref $array1
* @prefer-ref $sort_order
* @prefer-ref $sort_flags
* @prefer-ref $arrays
* @prefer-ref $rest
*/
function array_multisort(&$array1, $sort_order = SORT_ASC, $sort_flags = SORT_REGULAR, &...$arrays): bool {}
function array_multisort(&$array1, &...$rest): bool {}

function array_rand(array $array, int $num_req = 1): int|string|array {}

Expand Down
6 changes: 2 additions & 4 deletions ext/standard/basic_functions_arginfo.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 56f49d359d2b11383a3f1401d0a3730192c28fc0 */
* Stub hash: 251fc9f272492ab76c4a1a1dabcd768269cf1bde */

ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
Expand Down Expand Up @@ -313,9 +313,7 @@ ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_multisort, 0, 1, _IS_BOOL, 0)
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, array1)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(ZEND_SEND_PREFER_REF, sort_order, "SORT_ASC")
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(ZEND_SEND_PREFER_REF, sort_flags, "SORT_REGULAR")
ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, arrays)
ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, rest)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_array_rand, 0, 1, MAY_BE_LONG|MAY_BE_STRING|MAY_BE_ARRAY)
Expand Down
4 changes: 2 additions & 2 deletions ext/standard/tests/array/array_multisort_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ try {
*** Testing array_multisort() : error conditions ***

-- Testing array_multisort() function with repeated flags --
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag that has not already been specified
array_multisort(): Argument #3 must be an array or a sort flag that has not already been specified

-- Testing array_multisort() function with repeated flags --
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag that has not already been specified
array_multisort(): Argument #3 must be an array or a sort flag that has not already been specified
46 changes: 23 additions & 23 deletions ext/standard/tests/array/array_multisort_variation2.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -117,25 +117,25 @@ bool(true)
bool(true)

--int 12345--
array_multisort(): Argument #2 ($sort_order) must be a valid sort flag
array_multisort(): Argument #2 must be a valid sort flag

--int -12345--
array_multisort(): Argument #2 ($sort_order) must be a valid sort flag
array_multisort(): Argument #2 must be a valid sort flag

--float 10.5--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--float -10.5--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--float 12.3456789000e10--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--float -12.3456789000e10--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--float .5--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--empty array--
Array sizes are inconsistent
Expand All @@ -150,49 +150,49 @@ bool(true)
Array sizes are inconsistent

--uppercase NULL--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--lowercase null--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--lowercase true--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--lowercase false--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--uppercase TRUE--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--uppercase FALSE--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--empty string DQ--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--empty string SQ--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--string DQ--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--string SQ--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--mixed case string--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--heredoc--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--instance of classWithToString--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--instance of classWithoutToString--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--undefined var--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag

--unset var--
array_multisort(): Argument #2 ($sort_order) must be an array or a sort flag
array_multisort(): Argument #2 must be an array or a sort flag
50 changes: 25 additions & 25 deletions ext/standard/tests/array/array_multisort_variation3.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -103,76 +103,76 @@ foreach($inputs as $key =>$value) {
*** Testing array_multisort() : usage variation ***

--int 0--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag that has not already been specified
array_multisort(): Argument #3 must be an array or a sort flag that has not already been specified

--int 1--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag that has not already been specified
array_multisort(): Argument #3 must be an array or a sort flag that has not already been specified

--int 12345--
array_multisort(): Argument #3 ($sort_flags) must be a valid sort flag
array_multisort(): Argument #3 must be a valid sort flag

--int -12345--
array_multisort(): Argument #3 ($sort_flags) must be a valid sort flag
array_multisort(): Argument #3 must be a valid sort flag

--float 10.5--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--float -10.5--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--float 12.3456789000e10--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--float -12.3456789000e10--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--float .5--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--uppercase NULL--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--lowercase null--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--lowercase true--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--lowercase false--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--uppercase TRUE--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--uppercase FALSE--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--empty string DQ--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--empty string SQ--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--string DQ--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--string SQ--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--mixed case string--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--heredoc--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--instance of classWithToString--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--instance of classWithoutToString--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--undefined var--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

--unset var--
array_multisort(): Argument #3 ($sort_flags) must be an array or a sort flag
array_multisort(): Argument #3 must be an array or a sort flag

0 comments on commit d37d222

Please sign in to comment.