1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Zend: make zend_copy_parameters_array() private (#20265)

And slightly refactor implementation.
This commit is contained in:
Gina Peter Banyard
2025-10-25 22:36:09 +01:00
committed by GitHub
parent bac62bf31a
commit 275ec6f335
4 changed files with 16 additions and 27 deletions

View File

@@ -34,6 +34,7 @@ PHP 8.6 INTERNALS UPGRADE NOTES
printf family.
. The zval_dtor() alias of zval_ptr_dtor_nogc() has been removed.
Call zval_ptr_dtor_nogc() directly instead.
. The internal zend_copy_parameters_array() function is no longer exposed.
========================
2. Build system changes

View File

@@ -76,28 +76,6 @@ ZEND_API zend_result zend_get_parameters_array_ex(uint32_t param_count, zval *ar
}
/* }}} */
ZEND_API zend_result zend_copy_parameters_array(uint32_t param_count, zval *argument_array) /* {{{ */
{
zval *param_ptr;
uint32_t arg_count;
param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data));
if (param_count>arg_count) {
return FAILURE;
}
while (param_count-->0) {
Z_TRY_ADDREF_P(param_ptr);
zend_hash_next_index_insert_new(Z_ARRVAL_P(argument_array), param_ptr);
param_ptr++;
}
return SUCCESS;
}
/* }}} */
ZEND_API ZEND_COLD void zend_wrong_param_count(void) /* {{{ */
{
const char *space;

View File

@@ -347,9 +347,6 @@ ZEND_API void zend_set_dl_use_deepbind(bool use_deepbind);
ZEND_API zend_result zend_get_parameters_array_ex(uint32_t param_count, zval *argument_array);
/* internal function to efficiently copy parameters when executing __call() */
ZEND_API zend_result zend_copy_parameters_array(uint32_t param_count, zval *argument_array);
#define zend_get_parameters_array(ht, param_count, argument_array) \
zend_get_parameters_array_ex(param_count, argument_array)
#define zend_parse_parameters_none() \

View File

@@ -287,6 +287,19 @@ ZEND_METHOD(Closure, bindTo)
do_closure_bind(return_value, ZEND_THIS, newthis, scope_obj, scope_str);
}
static void zend_copy_parameters_array(const uint32_t param_count, HashTable *argument_array) /* {{{ */
{
zval *param_ptr = ZEND_CALL_ARG(EG(current_execute_data), 1);
ZEND_ASSERT(param_count <= ZEND_CALL_NUM_ARGS(EG(current_execute_data)));
for (uint32_t i = 0; i < param_count; i++) {
Z_TRY_ADDREF_P(param_ptr);
zend_hash_next_index_insert_new(argument_array, param_ptr);
param_ptr++;
}
}
static ZEND_NAMED_FUNCTION(zend_closure_call_magic) /* {{{ */ {
zend_fcall_info fci;
zend_fcall_info_cache fcc;
@@ -310,14 +323,14 @@ static ZEND_NAMED_FUNCTION(zend_closure_call_magic) /* {{{ */ {
array_init_size(&fci.params[1], ZEND_NUM_ARGS() + zend_hash_num_elements(EX(extra_named_params)));
/* Avoid conversion from packed to mixed later. */
zend_hash_real_init_mixed(Z_ARRVAL(fci.params[1]));
zend_copy_parameters_array(ZEND_NUM_ARGS(), &fci.params[1]);
zend_copy_parameters_array(ZEND_NUM_ARGS(), Z_ARRVAL(fci.params[1]));
ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, named_param_zval) {
Z_TRY_ADDREF_P(named_param_zval);
zend_hash_add_new(Z_ARRVAL(fci.params[1]), name, named_param_zval);
} ZEND_HASH_FOREACH_END();
} else if (ZEND_NUM_ARGS()) {
array_init_size(&fci.params[1], ZEND_NUM_ARGS());
zend_copy_parameters_array(ZEND_NUM_ARGS(), &fci.params[1]);
zend_copy_parameters_array(ZEND_NUM_ARGS(), Z_ARRVAL(fci.params[1]));
} else {
ZVAL_EMPTY_ARRAY(&fci.params[1]);
}