summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-08-10 12:02:52 +0000
committerDmitry Stogov <dmitry@php.net>2005-08-10 12:02:52 +0000
commitebd4ab4d7875e2757adecb74e65fd31d846e6948 (patch)
tree0d755c30d9ab2dbcff7b7c24d26e39a378b4b7ed
parent779e6d203e4fa159120dfbc0644a3ed386bcf66e (diff)
downloadphp-git-ebd4ab4d7875e2757adecb74e65fd31d846e6948.tar.gz
Fixed bug #25359 (array_multisort() doesn't work in a function if array is global or reference)
-rw-r--r--NEWS2
-rw-r--r--Zend/zend_compile.c7
-rw-r--r--Zend/zend_compile.h24
-rw-r--r--ext/standard/basic_functions.c8
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)