diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 26d6a740158..f3f4a20f3f4 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -749,11 +749,11 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags MYSQL_RES *result; zval *mysql_result; zend_long fetchtype; - zval *ctor_params = NULL; + HashTable *ctor_params = NULL; zend_class_entry *ce = NULL; 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(); } if (ce == NULL) { @@ -810,13 +810,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags fci.retval = &retval; fci.params = NULL; fci.param_count = 0; - fci.named_params = NULL; - - if (ctor_params) { - if (zend_fcall_info_args(&fci, ctor_params) == FAILURE) { - ZEND_UNREACHABLE(); - } - } + fci.named_params = ctor_params; fcc.function_handler = ce->constructor; 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 { zval_ptr_dtor(&retval); } - zend_fcall_info_args_clear(&fci, 1); - } else if (ctor_params && zend_hash_num_elements(Z_ARRVAL_P(ctor_params)) > 0) { + } else if (ctor_params && zend_hash_num_elements(ctor_params) > 0) { + /* TODO Convert this to a ValueError */ zend_argument_error(zend_ce_exception, ERROR_ARG_POS(3), "must be empty when the specified class (%s) does not have a constructor", ZSTR_VAL(ce->name) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index aeaa5db70f1..7ea624e4c8c 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -1756,11 +1756,11 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_ zend_long row; bool row_is_null = 1; char *field_name; - zval *ctor_params = NULL; + HashTable *ctor_params = NULL; zend_class_entry *ce = NULL; 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(); } if (!ce) { @@ -1853,13 +1853,7 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_ fci.retval = &retval; fci.params = NULL; fci.param_count = 0; - fci.named_params = NULL; - - if (ctor_params) { - if (zend_fcall_info_args(&fci, ctor_params) == FAILURE) { - ZEND_UNREACHABLE(); - } - } + fci.named_params = ctor_params; fcc.function_handler = ce->constructor; 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 { zval_ptr_dtor(&retval); } - if (fci.params) { - efree(fci.params); - } - } else if (ctor_params && zend_hash_num_elements(Z_ARRVAL_P(ctor_params)) > 0) { + } else if (ctor_params && zend_hash_num_elements(ctor_params) > 0) { + /* TODO Convert this to a ValueError */ zend_argument_error(zend_ce_exception, 3, "must be empty when the specified class (%s) does not have a constructor", ZSTR_VAL(ce->name) diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 8761314ba05..2aebc233848 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -3208,7 +3208,6 @@ PHP_FUNCTION(iterator_count) typedef struct { zval *obj; - zval *args; zend_long count; zend_fcall_info fci; zend_fcall_info_cache fcc; @@ -3233,19 +3232,16 @@ PHP_FUNCTION(iterator_apply) { spl_iterator_apply_info apply_info; - apply_info.args = NULL; - 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) { + /* The HashTable is used to determine positional arguments */ + 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(); } 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) { - zend_fcall_info_args(&apply_info.fci, NULL); return; } - - zend_fcall_info_args(&apply_info.fci, NULL); RETURN_LONG(apply_info.count); } /* }}} */ diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 5d5eafd10d0..b3b643cec7e 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -1566,18 +1566,20 @@ PHP_FUNCTION(forward_static_call) /* {{{ Call a static method which is the first parameter with the arguments contained in array */ PHP_FUNCTION(forward_static_call_array) { - zval *params, retval; + zval retval; + HashTable *params; zend_fcall_info fci; zend_fcall_info_cache fci_cache; zend_class_entry *called_scope; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_FUNC(fci, fci_cache) - Z_PARAM_ARRAY(params) + Z_PARAM_ARRAY_HT(params) ZEND_PARSE_PARAMETERS_END(); - zend_fcall_info_args(&fci, params); fci.retval = &retval; + /* Add positional arguments */ + fci.named_params = params; called_scope = zend_get_called_scope(execute_data); if (called_scope && fci_cache.calling_scope && @@ -1591,8 +1593,6 @@ PHP_FUNCTION(forward_static_call_array) } ZVAL_COPY_VALUE(return_value, &retval); } - - zend_fcall_info_args_clear(&fci, 1); } /* }}} */ diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c index a7003473727..4c8c273f242 100644 --- a/sapi/phpdbg/phpdbg_prompt.c +++ b/sapi/phpdbg/phpdbg_prompt.c @@ -114,12 +114,14 @@ static inline int phpdbg_call_register(phpdbg_param_t *stack) /* {{{ */ ZVAL_STRINGL(&fci.function_name, lc_name, name->len); fci.size = sizeof(zend_fcall_info); - //???fci.symbol_table = zend_rebuild_symbol_table(); fci.object = NULL; fci.retval = &fretval; + fci.param_count = 0; + fci.params = NULL; + fci.named_params = NULL; + zval params; if (name->next) { - zval params; phpdbg_param_t *next = name->next; array_init(¶ms); @@ -170,11 +172,8 @@ static inline int phpdbg_call_register(phpdbg_param_t *stack) /* {{{ */ next = next->next; } - - zend_fcall_info_args(&fci, ¶ms); - } else { - fci.params = NULL; - fci.param_count = 0; + /* Add positional arguments */ + fci.named_params = Z_ARRVAL(params); } phpdbg_activate_err_buf(0);