mirror of
https://github.com/php/php-src.git
synced 2024-11-27 11:53:33 +08:00
Remove most usages of zend_fcall_info_args()
This reallocates the PHP array when one can just use the named_params fields to pass the positional arguments instead. Only usage of zend_fcall_info_args(_ex) remains in PDO.
This commit is contained in:
parent
3641f824fd
commit
66661ae682
@ -749,11 +749,11 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
|
|||||||
MYSQL_RES *result;
|
MYSQL_RES *result;
|
||||||
zval *mysql_result;
|
zval *mysql_result;
|
||||||
zend_long fetchtype;
|
zend_long fetchtype;
|
||||||
zval *ctor_params = NULL;
|
HashTable *ctor_params = NULL;
|
||||||
zend_class_entry *ce = NULL;
|
zend_class_entry *ce = NULL;
|
||||||
|
|
||||||
if (into_object) {
|
if (into_object) {
|
||||||
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|Ca", &mysql_result, mysqli_result_class_entry, &ce, &ctor_params) == FAILURE) {
|
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|Ch", &mysql_result, mysqli_result_class_entry, &ce, &ctor_params) == FAILURE) {
|
||||||
RETURN_THROWS();
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
if (ce == NULL) {
|
if (ce == NULL) {
|
||||||
@ -810,13 +810,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
|
|||||||
fci.retval = &retval;
|
fci.retval = &retval;
|
||||||
fci.params = NULL;
|
fci.params = NULL;
|
||||||
fci.param_count = 0;
|
fci.param_count = 0;
|
||||||
fci.named_params = NULL;
|
fci.named_params = ctor_params;
|
||||||
|
|
||||||
if (ctor_params) {
|
|
||||||
if (zend_fcall_info_args(&fci, ctor_params) == FAILURE) {
|
|
||||||
ZEND_UNREACHABLE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fcc.function_handler = ce->constructor;
|
fcc.function_handler = ce->constructor;
|
||||||
fcc.called_scope = Z_OBJCE_P(return_value);
|
fcc.called_scope = Z_OBJCE_P(return_value);
|
||||||
@ -827,8 +821,8 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
|
|||||||
} else {
|
} else {
|
||||||
zval_ptr_dtor(&retval);
|
zval_ptr_dtor(&retval);
|
||||||
}
|
}
|
||||||
zend_fcall_info_args_clear(&fci, 1);
|
} else if (ctor_params && zend_hash_num_elements(ctor_params) > 0) {
|
||||||
} else if (ctor_params && zend_hash_num_elements(Z_ARRVAL_P(ctor_params)) > 0) {
|
/* TODO Convert this to a ValueError */
|
||||||
zend_argument_error(zend_ce_exception, ERROR_ARG_POS(3),
|
zend_argument_error(zend_ce_exception, ERROR_ARG_POS(3),
|
||||||
"must be empty when the specified class (%s) does not have a constructor",
|
"must be empty when the specified class (%s) does not have a constructor",
|
||||||
ZSTR_VAL(ce->name)
|
ZSTR_VAL(ce->name)
|
||||||
|
@ -1756,11 +1756,11 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
|
|||||||
zend_long row;
|
zend_long row;
|
||||||
bool row_is_null = 1;
|
bool row_is_null = 1;
|
||||||
char *field_name;
|
char *field_name;
|
||||||
zval *ctor_params = NULL;
|
HashTable *ctor_params = NULL;
|
||||||
zend_class_entry *ce = NULL;
|
zend_class_entry *ce = NULL;
|
||||||
|
|
||||||
if (into_object) {
|
if (into_object) {
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l!Ca", &result, pgsql_result_ce, &row, &row_is_null, &ce, &ctor_params) == FAILURE) {
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|l!Ch", &result, pgsql_result_ce, &row, &row_is_null, &ce, &ctor_params) == FAILURE) {
|
||||||
RETURN_THROWS();
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
if (!ce) {
|
if (!ce) {
|
||||||
@ -1853,13 +1853,7 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
|
|||||||
fci.retval = &retval;
|
fci.retval = &retval;
|
||||||
fci.params = NULL;
|
fci.params = NULL;
|
||||||
fci.param_count = 0;
|
fci.param_count = 0;
|
||||||
fci.named_params = NULL;
|
fci.named_params = ctor_params;
|
||||||
|
|
||||||
if (ctor_params) {
|
|
||||||
if (zend_fcall_info_args(&fci, ctor_params) == FAILURE) {
|
|
||||||
ZEND_UNREACHABLE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fcc.function_handler = ce->constructor;
|
fcc.function_handler = ce->constructor;
|
||||||
fcc.called_scope = Z_OBJCE_P(return_value);
|
fcc.called_scope = Z_OBJCE_P(return_value);
|
||||||
@ -1870,10 +1864,8 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
|
|||||||
} else {
|
} else {
|
||||||
zval_ptr_dtor(&retval);
|
zval_ptr_dtor(&retval);
|
||||||
}
|
}
|
||||||
if (fci.params) {
|
} else if (ctor_params && zend_hash_num_elements(ctor_params) > 0) {
|
||||||
efree(fci.params);
|
/* TODO Convert this to a ValueError */
|
||||||
}
|
|
||||||
} else if (ctor_params && zend_hash_num_elements(Z_ARRVAL_P(ctor_params)) > 0) {
|
|
||||||
zend_argument_error(zend_ce_exception, 3,
|
zend_argument_error(zend_ce_exception, 3,
|
||||||
"must be empty when the specified class (%s) does not have a constructor",
|
"must be empty when the specified class (%s) does not have a constructor",
|
||||||
ZSTR_VAL(ce->name)
|
ZSTR_VAL(ce->name)
|
||||||
|
@ -3208,7 +3208,6 @@ PHP_FUNCTION(iterator_count)
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
zval *obj;
|
zval *obj;
|
||||||
zval *args;
|
|
||||||
zend_long count;
|
zend_long count;
|
||||||
zend_fcall_info fci;
|
zend_fcall_info fci;
|
||||||
zend_fcall_info_cache fcc;
|
zend_fcall_info_cache fcc;
|
||||||
@ -3233,19 +3232,16 @@ PHP_FUNCTION(iterator_apply)
|
|||||||
{
|
{
|
||||||
spl_iterator_apply_info apply_info;
|
spl_iterator_apply_info apply_info;
|
||||||
|
|
||||||
apply_info.args = NULL;
|
/* The HashTable is used to determine positional arguments */
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Of|a!", &apply_info.obj, zend_ce_traversable, &apply_info.fci, &apply_info.fcc, &apply_info.args) == FAILURE) {
|
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Of|h!", &apply_info.obj, zend_ce_traversable,
|
||||||
|
&apply_info.fci, &apply_info.fcc, &apply_info.fci.named_params) == FAILURE) {
|
||||||
RETURN_THROWS();
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
|
|
||||||
apply_info.count = 0;
|
apply_info.count = 0;
|
||||||
zend_fcall_info_args(&apply_info.fci, apply_info.args);
|
|
||||||
if (spl_iterator_apply(apply_info.obj, spl_iterator_func_apply, (void*)&apply_info) == FAILURE) {
|
if (spl_iterator_apply(apply_info.obj, spl_iterator_func_apply, (void*)&apply_info) == FAILURE) {
|
||||||
zend_fcall_info_args(&apply_info.fci, NULL);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
zend_fcall_info_args(&apply_info.fci, NULL);
|
|
||||||
RETURN_LONG(apply_info.count);
|
RETURN_LONG(apply_info.count);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@ -1566,18 +1566,20 @@ PHP_FUNCTION(forward_static_call)
|
|||||||
/* {{{ Call a static method which is the first parameter with the arguments contained in array */
|
/* {{{ Call a static method which is the first parameter with the arguments contained in array */
|
||||||
PHP_FUNCTION(forward_static_call_array)
|
PHP_FUNCTION(forward_static_call_array)
|
||||||
{
|
{
|
||||||
zval *params, retval;
|
zval retval;
|
||||||
|
HashTable *params;
|
||||||
zend_fcall_info fci;
|
zend_fcall_info fci;
|
||||||
zend_fcall_info_cache fci_cache;
|
zend_fcall_info_cache fci_cache;
|
||||||
zend_class_entry *called_scope;
|
zend_class_entry *called_scope;
|
||||||
|
|
||||||
ZEND_PARSE_PARAMETERS_START(2, 2)
|
ZEND_PARSE_PARAMETERS_START(2, 2)
|
||||||
Z_PARAM_FUNC(fci, fci_cache)
|
Z_PARAM_FUNC(fci, fci_cache)
|
||||||
Z_PARAM_ARRAY(params)
|
Z_PARAM_ARRAY_HT(params)
|
||||||
ZEND_PARSE_PARAMETERS_END();
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
|
||||||
zend_fcall_info_args(&fci, params);
|
|
||||||
fci.retval = &retval;
|
fci.retval = &retval;
|
||||||
|
/* Add positional arguments */
|
||||||
|
fci.named_params = params;
|
||||||
|
|
||||||
called_scope = zend_get_called_scope(execute_data);
|
called_scope = zend_get_called_scope(execute_data);
|
||||||
if (called_scope && fci_cache.calling_scope &&
|
if (called_scope && fci_cache.calling_scope &&
|
||||||
@ -1591,8 +1593,6 @@ PHP_FUNCTION(forward_static_call_array)
|
|||||||
}
|
}
|
||||||
ZVAL_COPY_VALUE(return_value, &retval);
|
ZVAL_COPY_VALUE(return_value, &retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
zend_fcall_info_args_clear(&fci, 1);
|
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
@ -114,12 +114,14 @@ static inline int phpdbg_call_register(phpdbg_param_t *stack) /* {{{ */
|
|||||||
|
|
||||||
ZVAL_STRINGL(&fci.function_name, lc_name, name->len);
|
ZVAL_STRINGL(&fci.function_name, lc_name, name->len);
|
||||||
fci.size = sizeof(zend_fcall_info);
|
fci.size = sizeof(zend_fcall_info);
|
||||||
//???fci.symbol_table = zend_rebuild_symbol_table();
|
|
||||||
fci.object = NULL;
|
fci.object = NULL;
|
||||||
fci.retval = &fretval;
|
fci.retval = &fretval;
|
||||||
|
fci.param_count = 0;
|
||||||
|
fci.params = NULL;
|
||||||
|
fci.named_params = NULL;
|
||||||
|
|
||||||
|
zval params;
|
||||||
if (name->next) {
|
if (name->next) {
|
||||||
zval params;
|
|
||||||
phpdbg_param_t *next = name->next;
|
phpdbg_param_t *next = name->next;
|
||||||
|
|
||||||
array_init(¶ms);
|
array_init(¶ms);
|
||||||
@ -170,11 +172,8 @@ static inline int phpdbg_call_register(phpdbg_param_t *stack) /* {{{ */
|
|||||||
|
|
||||||
next = next->next;
|
next = next->next;
|
||||||
}
|
}
|
||||||
|
/* Add positional arguments */
|
||||||
zend_fcall_info_args(&fci, ¶ms);
|
fci.named_params = Z_ARRVAL(params);
|
||||||
} else {
|
|
||||||
fci.params = NULL;
|
|
||||||
fci.param_count = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
phpdbg_activate_err_buf(0);
|
phpdbg_activate_err_buf(0);
|
||||||
|
Loading…
Reference in New Issue
Block a user