From ebd4ab4d7875e2757adecb74e65fd31d846e6948 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 10 Aug 2005 12:02:52 +0000 Subject: [PATCH] Fixed bug #25359 (array_multisort() doesn't work in a function if array is global or reference) --- NEWS | 2 ++ Zend/zend_compile.c | 7 ++++++- Zend/zend_compile.h | 24 ++++++++++++++++++++++-- ext/standard/basic_functions.c | 8 ++++++-- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 1f351c9966..f7dedb1c9f 100644 --- a/NEWS +++ b/NEWS @@ -44,6 +44,8 @@ PHP NEWS - Fixed bug #32010 (Memory leak in mssql_fetch_batch). (fmk) - Fixed bug #29334 (win32 mail() provides incorrect Date: header). (Jani) - Fixed bug #29253 (array_diff with $GLOBALS argument fails). (Dmitry) +- Fixed bug #25359 (array_multisort() doesn't work in a function if array is + global or reference). (Dmitry) 14 Jul 2005, PHP 5.1 Beta 3 - Upgraded bundled SQLite library for PDO:SQLite to 3.2.2 (Ilia) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f73c379312..0ab89a4766 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1499,7 +1499,12 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC) } if (function_ptr) { - send_by_reference = ARG_SHOULD_BE_SENT_BY_REF(function_ptr, (zend_uint) offset) ? ZEND_ARG_SEND_BY_REF : 0; + if (ARG_MAY_BE_SENT_BY_REF(function_ptr, (zend_uint) offset)) { + op = (param->op_type & (IS_VAR|IS_CV))?ZEND_SEND_REF:ZEND_SEND_VAL; + send_by_reference = 0; + } else { + send_by_reference = ARG_SHOULD_BE_SENT_BY_REF(function_ptr, (zend_uint) offset) ? ZEND_ARG_SEND_BY_REF : 0; + } } else { send_by_reference = 0; } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 21ea82ae17..b63dd8c90a 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -648,6 +648,10 @@ int zendlex(znode *zendlval TSRMLS_DC); #define ZEND_ARG_COMPILE_TIME_BOUND (1<<1) #define ZEND_ARG_SEND_FUNCTION (1<<2) +#define ZEND_SEND_BY_VAL 0 +#define ZEND_SEND_BY_REF 1 +#define ZEND_SEND_PREFER_REF 2 + /* Lost In Stupid Parentheses */ #define ARG_SHOULD_BE_SENT_BY_REF(zf, arg_num) \ ( \ @@ -657,15 +661,31 @@ int zendlex(znode *zendlval TSRMLS_DC); ( \ ( \ arg_num<=((zend_function *) zf)->common.num_args \ - && ((zend_function *) zf)->common.arg_info[arg_num-1].pass_by_reference \ + && ((zend_function *) zf)->common.arg_info[arg_num-1].pass_by_reference == ZEND_SEND_BY_REF \ ) \ || ( \ arg_num>((zend_function *) zf)->common.num_args \ - && ((zend_function *) zf)->common.pass_rest_by_reference \ + && ((zend_function *) zf)->common.pass_rest_by_reference == ZEND_SEND_BY_REF \ ) \ ) \ ) +#define ARG_MAY_BE_SENT_BY_REF(zf, arg_num) \ + ( \ + zf \ + && ((zend_function *) zf)->common.arg_info \ + && \ + ( \ + ( \ + arg_num<=((zend_function *) zf)->common.num_args \ + && ((zend_function *) zf)->common.arg_info[arg_num-1].pass_by_reference == ZEND_SEND_PREFER_REF \ + ) \ + || ( \ + arg_num>((zend_function *) zf)->common.num_args \ + && ((zend_function *) zf)->common.pass_rest_by_reference == ZEND_SEND_PREFER_REF \ + ) \ + ) \ + ) #define ZEND_RETURN_VAL 0 #define ZEND_RETURN_REF 1 diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 15637475ae..455d8f3668 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -142,6 +142,10 @@ static ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO() +static + ZEND_BEGIN_ARG_INFO(all_args_prefer_ref, ZEND_SEND_PREFER_REF) + ZEND_END_ARG_INFO() + typedef struct _php_shutdown_function_entry { zval **arguments; int arg_count; @@ -449,7 +453,7 @@ function_entry basic_functions[] = { PHP_FE(call_user_func_array, NULL) PHP_FE(call_user_method, second_arg_force_ref) PHP_FE(call_user_method_array, second_arg_force_ref) - PHP_FE(serialize, NULL) + PHP_FE(serialize, NULL) PHP_FE(unserialize, NULL) PHP_FE(var_dump, NULL) @@ -762,7 +766,7 @@ function_entry basic_functions[] = { PHP_FE(compact, NULL) PHP_FE(array_fill, NULL) PHP_FE(range, NULL) - PHP_FE(array_multisort, NULL) + PHP_FE(array_multisort, all_args_prefer_ref) PHP_FE(array_push, first_arg_force_ref) PHP_FE(array_pop, first_arg_force_ref) PHP_FE(array_shift, first_arg_force_ref) -- 2.40.0