Skip to content

Commit 3e45549

Browse files
committed
Prepare for extra named params reuse
Use a helper and release the array rather than destroying it, as it may have rc>1 in the future.
1 parent 077886d commit 3e45549

File tree

7 files changed

+33
-42
lines changed

7 files changed

+33
-42
lines changed

Zend/zend_execute.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3830,9 +3830,7 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o
38303830
if (ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS) {
38313831
OBJ_RELEASE(Z_OBJ(call->This));
38323832
}
3833-
if (ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
3834-
zend_array_destroy(call->extra_named_params);
3835-
}
3833+
zend_free_extra_named_params(call);
38363834
if (call->func->common.fn_flags & ZEND_ACC_CLOSURE) {
38373835
zend_object_release(ZEND_CLOSURE_OBJECT(call->func));
38383836
} else if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
@@ -4547,6 +4545,12 @@ ZEND_API int ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *call) {
45474545
return SUCCESS;
45484546
}
45494547

4548+
ZEND_API void ZEND_FASTCALL zend_free_extra_named_params_ex(zend_array *extra_named_params)
4549+
{
4550+
/* Extra named params may be shared. */
4551+
zend_array_release(extra_named_params);
4552+
}
4553+
45504554
#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
45514555
/* Special versions of functions that sets EX(opline) before calling zend_vm_stack_extend() */
45524556
static zend_always_inline zend_execute_data *_zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, void *object_or_called_scope) /* {{{ */

Zend/zend_execute.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,13 @@ static zend_always_inline void zend_vm_stack_extend_call_frame(
304304
}
305305
}
306306

307+
ZEND_API void ZEND_FASTCALL zend_free_extra_named_params_ex(zend_array *extra_named_params);
308+
static zend_always_inline void zend_free_extra_named_params(zend_execute_data *call) {
309+
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
310+
zend_free_extra_named_params_ex(call->extra_named_params);
311+
}
312+
}
313+
307314
/* services */
308315
ZEND_API const char *get_active_class_name(const char **space);
309316
ZEND_API const char *get_active_function_name(void);

Zend/zend_generators.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,9 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
125125
if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
126126
zend_clean_and_cache_symbol_table(execute_data->symbol_table);
127127
}
128-
if (EX_CALL_INFO() & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
129-
zend_array_destroy(execute_data->extra_named_params);
130-
}
131128
/* always free the CV's, in the symtable are only not-free'd IS_INDIRECT's */
132129
zend_free_compiled_variables(execute_data);
130+
zend_free_extra_named_params(execute_data);
133131

134132
if (EX_CALL_INFO() & ZEND_CALL_RELEASE_THIS) {
135133
OBJ_RELEASE(Z_OBJ(execute_data->This));

Zend/zend_vm_def.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2795,7 +2795,7 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
27952795
}
27962796

27972797
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
2798-
zend_array_destroy(EX(extra_named_params));
2798+
zend_free_extra_named_params_ex(EX(extra_named_params));
27992799
}
28002800

28012801
/* Free extra args before releasing the closure,
@@ -2851,7 +2851,7 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
28512851
}
28522852
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
28532853
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
2854-
zend_array_destroy(EX(extra_named_params));
2854+
zend_free_extra_named_params_ex(EX(extra_named_params));
28552855
}
28562856
}
28572857
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
@@ -3903,9 +3903,7 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
39033903

39043904
EG(current_execute_data) = execute_data;
39053905
zend_vm_stack_free_args(call);
3906-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
3907-
zend_array_destroy(call->extra_named_params);
3908-
}
3906+
zend_free_extra_named_params(call);
39093907
zend_vm_stack_free_call_frame(call);
39103908

39113909
if (!RETURN_VALUE_USED(opline)) {
@@ -4010,9 +4008,7 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
40104008

40114009
ZEND_VM_C_LABEL(fcall_by_name_end):
40124010
zend_vm_stack_free_args(call);
4013-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
4014-
zend_array_destroy(call->extra_named_params);
4015-
}
4011+
zend_free_extra_named_params(call);
40164012
zend_vm_stack_free_call_frame(call);
40174013

40184014
if (!RETURN_VALUE_USED(opline)) {
@@ -4107,9 +4103,7 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
41074103

41084104
ZEND_VM_C_LABEL(fcall_end):
41094105
zend_vm_stack_free_args(call);
4110-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
4111-
zend_array_destroy(call->extra_named_params);
4112-
}
4106+
zend_free_extra_named_params(call);
41134107
if (!RETURN_VALUE_USED(opline)) {
41144108
i_zval_ptr_dtor(ret);
41154109
}

Zend/zend_vm_execute.h

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,7 +1119,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper
11191119
}
11201120

11211121
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1122-
zend_array_destroy(EX(extra_named_params));
1122+
zend_free_extra_named_params_ex(EX(extra_named_params));
11231123
}
11241124

11251125
/* Free extra args before releasing the closure,
@@ -1175,7 +1175,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper
11751175
}
11761176
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
11771177
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1178-
zend_array_destroy(EX(extra_named_params));
1178+
zend_free_extra_named_params_ex(EX(extra_named_params));
11791179
}
11801180
}
11811181
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
@@ -1246,9 +1246,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
12461246

12471247
EG(current_execute_data) = execute_data;
12481248
zend_vm_stack_free_args(call);
1249-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1250-
zend_array_destroy(call->extra_named_params);
1251-
}
1249+
zend_free_extra_named_params(call);
12521250
zend_vm_stack_free_call_frame(call);
12531251

12541252
if (!0) {
@@ -1301,9 +1299,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
13011299

13021300
EG(current_execute_data) = execute_data;
13031301
zend_vm_stack_free_args(call);
1304-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1305-
zend_array_destroy(call->extra_named_params);
1306-
}
1302+
zend_free_extra_named_params(call);
13071303
zend_vm_stack_free_call_frame(call);
13081304

13091305
if (!1) {
@@ -1431,9 +1427,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
14311427

14321428
fcall_by_name_end:
14331429
zend_vm_stack_free_args(call);
1434-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1435-
zend_array_destroy(call->extra_named_params);
1436-
}
1430+
zend_free_extra_named_params(call);
14371431
zend_vm_stack_free_call_frame(call);
14381432

14391433
if (!0) {
@@ -1515,9 +1509,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
15151509

15161510
fcall_by_name_end:
15171511
zend_vm_stack_free_args(call);
1518-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1519-
zend_array_destroy(call->extra_named_params);
1520-
}
1512+
zend_free_extra_named_params(call);
15211513
zend_vm_stack_free_call_frame(call);
15221514

15231515
if (!1) {
@@ -1612,9 +1604,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
16121604

16131605
fcall_end:
16141606
zend_vm_stack_free_args(call);
1615-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1616-
zend_array_destroy(call->extra_named_params);
1617-
}
1607+
zend_free_extra_named_params(call);
16181608
if (!0) {
16191609
i_zval_ptr_dtor(ret);
16201610
}
@@ -1713,9 +1703,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
17131703

17141704
fcall_end:
17151705
zend_vm_stack_free_args(call);
1716-
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
1717-
zend_array_destroy(call->extra_named_params);
1718-
}
1706+
zend_free_extra_named_params(call);
17191707
if (!1) {
17201708
i_zval_ptr_dtor(ret);
17211709
}
@@ -53389,7 +53377,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5338953377
}
5339053378

5339153379
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
53392-
zend_array_destroy(EX(extra_named_params));
53380+
zend_free_extra_named_params_ex(EX(extra_named_params));
5339353381
}
5339453382

5339553383
/* Free extra args before releasing the closure,
@@ -53445,7 +53433,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5344553433
}
5344653434
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
5344753435
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
53448-
zend_array_destroy(EX(extra_named_params));
53436+
zend_free_extra_named_params_ex(EX(extra_named_params));
5344953437
}
5345053438
}
5345153439
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {

ext/opcache/jit/zend_jit_vm_helpers.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_nested_func_helper(uint32_t
5858
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
5959
}
6060
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
61-
zend_array_destroy(EX(extra_named_params));
61+
zend_free_extra_named_params_ex(EX(extra_named_params));
6262
}
6363

6464
old_execute_data = execute_data;
@@ -93,7 +93,7 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_top_func_helper(uint32_t ca
9393
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
9494
}
9595
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
96-
zend_array_destroy(EX(extra_named_params));
96+
zend_free_extra_named_params_ex(EX(extra_named_params));
9797
}
9898
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
9999
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9036,7 +9036,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
90369036
|.cold_code
90379037
|1:
90389038
| mov FCARG1a, aword [RX + offsetof(zend_execute_data, extra_named_params)]
9039-
| EXT_CALL zend_array_destroy, r0
9039+
| EXT_CALL zend_free_extra_named_params_ex, r0
90409040
| jmp >2
90419041
|.code
90429042
|2:

0 commit comments

Comments
 (0)