summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-08-20 23:27:26 +0200
committerAnatol Belski <ab@php.net>2014-08-20 23:27:26 +0200
commitcd18b5884b97d265f7719e351f5b12d18315e4c9 (patch)
tree80cde978899567b7a3e258e7442518a3c47ad961 /Zend/zend_API.c
parent888ef26cc5e03b19729c1e5fa4993fd6a9febb3f (diff)
parent6b5b5094d37035a15ddbf3a63319d569614d3dfd (diff)
downloadphp-git-cd18b5884b97d265f7719e351f5b12d18315e4c9.tar.gz
Merge remote-tracking branch 'php/master'
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 4bd8760e6a..1f7004267a 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -3546,9 +3546,10 @@ ZEND_API void zend_fcall_info_args_restore(zend_fcall_info *fci, int param_count
}
/* }}} */
-ZEND_API int zend_fcall_info_args(zend_fcall_info *fci, zval *args TSRMLS_DC) /* {{{ */
+ZEND_API int zend_fcall_info_args_ex(zend_fcall_info *fci, zend_function *func, zval *args TSRMLS_DC) /* {{{ */
{
zval *arg, *params;
+ int n = 1;
zend_fcall_info_args_clear(fci, !args);
@@ -3564,14 +3565,28 @@ ZEND_API int zend_fcall_info_args(zend_fcall_info *fci, zval *args TSRMLS_DC) /*
fci->params = params = (zval *) erealloc(fci->params, fci->param_count * sizeof(zval));
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args), arg) {
- ZVAL_COPY(params, arg);
+ if (func && !Z_ISREF_P(arg) && ARG_SHOULD_BE_SENT_BY_REF(func, n)) {
+ ZVAL_NEW_REF(params, arg);
+ if (Z_REFCOUNTED_P(arg)) {
+ Z_ADDREF_P(arg);
+ }
+ } else {
+ ZVAL_COPY(params, arg);
+ }
params++;
+ n++;
} ZEND_HASH_FOREACH_END();
return SUCCESS;
}
/* }}} */
+ZEND_API int zend_fcall_info_args(zend_fcall_info *fci, zval *args TSRMLS_DC) /* {{{ */
+{
+ return zend_fcall_info_args_ex(fci, NULL, args TSRMLS_CC);
+}
+/* }}} */
+
ZEND_API int zend_fcall_info_argp(zend_fcall_info *fci TSRMLS_DC, int argc, zval *argv) /* {{{ */
{
int i;