Skip to content

Commit e77c2b6

Browse files
committed
Reuse extra_named_params if possible
1 parent 3e45549 commit e77c2b6

File tree

2 files changed

+58
-26
lines changed

2 files changed

+58
-26
lines changed

Zend/zend_vm_def.h

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5431,17 +5431,26 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED, CACHE_SLOT)
54315431
if (EX_CALL_INFO() & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
54325432
zend_string *name;
54335433
zval *param;
5434-
5435-
SEPARATE_ARRAY(params);
5436-
ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
5437-
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
5438-
if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
5434+
zend_arg_info *arg_info = &EX(func)->common.arg_info[EX(func)->common.num_args];
5435+
if (ZEND_TYPE_IS_SET(arg_info->type)) {
5436+
SEPARATE_ARRAY(params);
5437+
ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
5438+
if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_info, arg_num, param, CACHE_ADDR(opline->extended_value)))) {
54395439
HANDLE_EXCEPTION();
54405440
}
5441-
}
5442-
Z_TRY_ADDREF_P(param);
5443-
zend_hash_add_new(Z_ARRVAL_P(params), name, param);
5444-
} ZEND_HASH_FOREACH_END();
5441+
Z_TRY_ADDREF_P(param);
5442+
zend_hash_add_new(Z_ARRVAL_P(params), name, param);
5443+
} ZEND_HASH_FOREACH_END();
5444+
} else if (zend_hash_num_elements(Z_ARRVAL_P(params)) == 0) {
5445+
GC_ADDREF(EX(extra_named_params));
5446+
ZVAL_ARR(params, EX(extra_named_params));
5447+
} else {
5448+
SEPARATE_ARRAY(params);
5449+
ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
5450+
Z_TRY_ADDREF_P(param);
5451+
zend_hash_add_new(Z_ARRVAL_P(params), name, param);
5452+
} ZEND_HASH_FOREACH_END();
5453+
}
54455454
}
54465455

54475456
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -8388,14 +8397,21 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
83888397
ZEND_CALL_NUM_ARGS(call) = 2;
83898398

83908399
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
8400+
8401+
zval *call_args = ZEND_CALL_ARG(call, 2);
83918402
if (args) {
8392-
ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
8403+
ZVAL_ARR(call_args, args);
83938404
} else {
8394-
ZVAL_EMPTY_ARRAY(ZEND_CALL_ARG(call, 2));
8405+
ZVAL_EMPTY_ARRAY(call_args);
83958406
}
83968407
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
8397-
SEPARATE_ARRAY(ZEND_CALL_ARG(call, 2));
8398-
zend_hash_copy(Z_ARRVAL_P(ZEND_CALL_ARG(call, 2)), call->extra_named_params, zval_add_ref);
8408+
if (zend_hash_num_elements(Z_ARRVAL_P(call_args)) == 0) {
8409+
GC_ADDREF(call->extra_named_params);
8410+
ZVAL_ARR(call_args, call->extra_named_params);
8411+
} else {
8412+
SEPARATE_ARRAY(call_args);
8413+
zend_hash_copy(Z_ARRVAL_P(call_args), call->extra_named_params, zval_add_ref);
8414+
}
83998415
}
84008416
zend_free_trampoline(fbc);
84018417
fbc = call->func;

Zend/zend_vm_execute.h

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2815,14 +2815,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
28152815
ZEND_CALL_NUM_ARGS(call) = 2;
28162816

28172817
ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
2818+
2819+
zval *call_args = ZEND_CALL_ARG(call, 2);
28182820
if (args) {
2819-
ZVAL_ARR(ZEND_CALL_ARG(call, 2), args);
2821+
ZVAL_ARR(call_args, args);
28202822
} else {
2821-
ZVAL_EMPTY_ARRAY(ZEND_CALL_ARG(call, 2));
2823+
ZVAL_EMPTY_ARRAY(call_args);
28222824
}
28232825
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
2824-
SEPARATE_ARRAY(ZEND_CALL_ARG(call, 2));
2825-
zend_hash_copy(Z_ARRVAL_P(ZEND_CALL_ARG(call, 2)), call->extra_named_params, zval_add_ref);
2826+
if (zend_hash_num_elements(Z_ARRVAL_P(call_args)) == 0) {
2827+
GC_ADDREF(call->extra_named_params);
2828+
ZVAL_ARR(call_args, call->extra_named_params);
2829+
} else {
2830+
SEPARATE_ARRAY(call_args);
2831+
zend_hash_copy(Z_ARRVAL_P(call_args), call->extra_named_params, zval_add_ref);
2832+
}
28262833
}
28272834
zend_free_trampoline(fbc);
28282835
fbc = call->func;
@@ -3243,17 +3250,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_UNUSED_HAND
32433250
if (EX_CALL_INFO() & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
32443251
zend_string *name;
32453252
zval *param;
3246-
3247-
SEPARATE_ARRAY(params);
3248-
ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
3249-
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
3250-
if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
3253+
zend_arg_info *arg_info = &EX(func)->common.arg_info[EX(func)->common.num_args];
3254+
if (ZEND_TYPE_IS_SET(arg_info->type)) {
3255+
SEPARATE_ARRAY(params);
3256+
ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
3257+
if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_info, arg_num, param, CACHE_ADDR(opline->extended_value)))) {
32513258
HANDLE_EXCEPTION();
32523259
}
3253-
}
3254-
Z_TRY_ADDREF_P(param);
3255-
zend_hash_add_new(Z_ARRVAL_P(params), name, param);
3256-
} ZEND_HASH_FOREACH_END();
3260+
Z_TRY_ADDREF_P(param);
3261+
zend_hash_add_new(Z_ARRVAL_P(params), name, param);
3262+
} ZEND_HASH_FOREACH_END();
3263+
} else if (zend_hash_num_elements(Z_ARRVAL_P(params)) == 0) {
3264+
GC_ADDREF(EX(extra_named_params));
3265+
ZVAL_ARR(params, EX(extra_named_params));
3266+
} else {
3267+
SEPARATE_ARRAY(params);
3268+
ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
3269+
Z_TRY_ADDREF_P(param);
3270+
zend_hash_add_new(Z_ARRVAL_P(params), name, param);
3271+
} ZEND_HASH_FOREACH_END();
3272+
}
32573273
}
32583274

32593275
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

0 commit comments

Comments
 (0)