summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-07-06 11:49:56 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-07-06 11:51:10 +0200
commit75c4e613e4522a4895d68009d789563a539fec95 (patch)
tree6db0338040e130d7bb4a4a2a37a47ab7586389f1
parent8d1a1120bf7347a216fbcfebd23a5336d00483e9 (diff)
downloadphp-git-75c4e613e4522a4895d68009d789563a539fec95.tar.gz
Correctly determine arg name of USER_ARG_INFO functions
-rw-r--r--Zend/tests/closure_invoke_ref_warning.phpt13
-rw-r--r--Zend/zend_execute_API.c11
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;
}
}
/* }}} */