Permalink
Browse files

Fixed bug #25359 (array_multisort() doesn't work in a function if arr…

…ay is global or reference)
  • Loading branch information...
1 parent 779e6d2 commit ebd4ab4d7875e2757adecb74e65fd31d846e6948 Dmitry Stogov committed Aug 10, 2005
Showing with 36 additions and 5 deletions.
  1. +2 −0 NEWS
  2. +6 −1 Zend/zend_compile.c
  3. +22 −2 Zend/zend_compile.h
  4. +6 −2 ext/standard/basic_functions.c
View
2 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)
View
@@ -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;
}
View
@@ -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
@@ -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)

0 comments on commit ebd4ab4

Please sign in to comment.