diff options
author | Anatol Belski <ab@php.net> | 2014-08-20 23:27:26 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2014-08-20 23:27:26 +0200 |
commit | cd18b5884b97d265f7719e351f5b12d18315e4c9 (patch) | |
tree | 80cde978899567b7a3e258e7442518a3c47ad961 /Zend/zend_API.c | |
parent | 888ef26cc5e03b19729c1e5fa4993fd6a9febb3f (diff) | |
parent | 6b5b5094d37035a15ddbf3a63319d569614d3dfd (diff) | |
download | php-git-cd18b5884b97d265f7719e351f5b12d18315e4c9.tar.gz |
Merge remote-tracking branch 'php/master'
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r-- | Zend/zend_API.c | 19 |
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; |