summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-03-05 17:23:40 +0400
committerDmitry Stogov <dmitry@zend.com>2014-03-05 17:23:40 +0400
commit47f90144583224a29c04e7aeebbacaec9b33de0e (patch)
tree966664e1b10b573c469e0d7a813a6e6f146d2ab4
parent84c092f6d623a9e58963db84c507624a13b50e17 (diff)
downloadphp-git-47f90144583224a29c04e7aeebbacaec9b33de0e.tar.gz
Fixed array_nultisort() to support IS_REFERENCE
-rw-r--r--ext/standard/array.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index c6806d3521..c4fd3ab6b2 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -3860,7 +3860,12 @@ PHP_FUNCTION(array_multisort)
* accordingly. There can't be two sort flags of the same type after an
* array, and the very first argument has to be an array. */
for (i = 0; i < argc; i++) {
- if (Z_TYPE(args[i]) == IS_ARRAY) {
+ zval *arg = &args[i];
+
+ if (Z_TYPE_P(arg) == IS_REFERENCE) {
+ arg = Z_REFVAL_P(arg);
+ }
+ if (Z_TYPE_P(arg) == IS_ARRAY) {
/* We see the next array, so we update the sort flags of
* the previous array and reset the sort flags. */
if (i > 0) {
@@ -3869,14 +3874,14 @@ PHP_FUNCTION(array_multisort)
sort_order = PHP_SORT_ASC;
sort_type = PHP_SORT_REGULAR;
}
- arrays[num_arrays++] = &args[i];
+ arrays[num_arrays++] = arg;
/* Next one may be an array or a list of sort flags. */
for (k = 0; k < MULTISORT_LAST; k++) {
parse_state[k] = 1;
}
- } else if (Z_TYPE(args[i]) == IS_LONG) {
- switch (Z_LVAL(args[i]) & ~PHP_SORT_FLAG_CASE) {
+ } else if (Z_TYPE_P(arg) == IS_LONG) {
+ switch (Z_LVAL_P(arg) & ~PHP_SORT_FLAG_CASE) {
case PHP_SORT_ASC:
case PHP_SORT_DESC:
/* flag allowed here */