diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-07-06 11:49:56 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-07-06 11:51:10 +0200 |
commit | 75c4e613e4522a4895d68009d789563a539fec95 (patch) | |
tree | 6db0338040e130d7bb4a4a2a37a47ab7586389f1 | |
parent | 8d1a1120bf7347a216fbcfebd23a5336d00483e9 (diff) | |
download | php-git-75c4e613e4522a4895d68009d789563a539fec95.tar.gz |
Correctly determine arg name of USER_ARG_INFO functions
-rw-r--r-- | Zend/tests/closure_invoke_ref_warning.phpt | 13 | ||||
-rw-r--r-- | Zend/zend_execute_API.c | 11 |
2 files changed, 17 insertions, 7 deletions
diff --git a/Zend/tests/closure_invoke_ref_warning.phpt b/Zend/tests/closure_invoke_ref_warning.phpt new file mode 100644 index 0000000000..08eefd3fb2 --- /dev/null +++ b/Zend/tests/closure_invoke_ref_warning.phpt @@ -0,0 +1,13 @@ +--TEST-- +Argument name for Closure::__invoke via call_user_func reference warning +--FILE-- +<?php + +$test = function(&$arg) {}; +call_user_func([$test, '__invoke'], null); + +?> +--EXPECTF-- +Warning: Closure::__invoke(): Argument #1 ($arg) must be passed by reference, value given in %s on line %d + +Warning: {closure}(): Argument #1 ($arg) must be passed by reference, value given in %s on line %d diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index a646bceb0b..ab5766af27 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -507,13 +507,10 @@ ZEND_API const char *get_function_arg_name(const zend_function *func, uint32_t a return NULL; } - switch (func->type) { - case ZEND_USER_FUNCTION: - return ZSTR_VAL(func->common.arg_info[arg_num - 1].name); - case ZEND_INTERNAL_FUNCTION: - return ((zend_internal_arg_info*) func->common.arg_info)[arg_num - 1].name; - default: - return NULL; + if (func->type == ZEND_USER_FUNCTION || (func->common.fn_flags & ZEND_ACC_USER_ARG_INFO)) { + return ZSTR_VAL(func->common.arg_info[arg_num - 1].name); + } else { + return ((zend_internal_arg_info*) func->common.arg_info)[arg_num - 1].name; } } /* }}} */ |