@@ -1095,7 +1095,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper
10951095 uint32_t call_info = EX_CALL_INFO();
10961096 SAVE_OPLINE();
10971097
1098- if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) {
1098+ if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS )) == 0)) {
10991099 EG(current_execute_data) = EX(prev_execute_data);
11001100 i_free_compiled_variables(execute_data);
11011101
@@ -1128,6 +1128,10 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper
11281128 zend_clean_and_cache_symbol_table(EX(symbol_table));
11291129 }
11301130
1131+ if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1132+ zend_array_destroy(EX(extra_named_params));
1133+ }
1134+
11311135 /* Free extra args before releasing the closure,
11321136 * as that may free the op_array. */
11331137 zend_vm_stack_free_extra_args_ex(call_info, execute_data);
@@ -3196,6 +3200,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_UNUSED_HAND
31963200 ZVAL_EMPTY_ARRAY(params);
31973201 }
31983202
3203+ if (EX_CALL_INFO() & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
3204+ zend_string *name;
3205+ zval *param;
3206+
3207+ SEPARATE_ARRAY(params);
3208+ ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
3209+ if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
3210+ if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
3211+ HANDLE_EXCEPTION();
3212+ }
3213+ }
3214+ Z_TRY_ADDREF_P(param);
3215+ zend_hash_add_new(Z_ARRVAL_P(params), name, param);
3216+ } ZEND_HASH_FOREACH_END();
3217+ }
3218+
31993219 ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
32003220}
32013221
@@ -52984,7 +53004,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5298453004 uint32_t call_info = EX_CALL_INFO();
5298553005 SAVE_OPLINE();
5298653006
52987- if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED)) == 0)) {
53007+ if (EXPECTED((call_info & (ZEND_CALL_CODE|ZEND_CALL_TOP|ZEND_CALL_HAS_SYMBOL_TABLE|ZEND_CALL_FREE_EXTRA_ARGS|ZEND_CALL_ALLOCATED|ZEND_CALL_HAS_EXTRA_NAMED_PARAMS )) == 0)) {
5298853008 EG(current_execute_data) = EX(prev_execute_data);
5298953009 i_free_compiled_variables(execute_data);
5299053010
@@ -53017,6 +53037,10 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5301753037 zend_clean_and_cache_symbol_table(EX(symbol_table));
5301853038 }
5301953039
53040+ if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
53041+ zend_array_destroy(EX(extra_named_params));
53042+ }
53043+
5302053044 /* Free extra args before releasing the closure,
5302153045 * as that may free the op_array. */
5302253046 zend_vm_stack_free_extra_args_ex(call_info, execute_data);
0 commit comments