Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
424f0b6
Partial named params implementation
nikic Apr 6, 2020
4afe5b4
Check for duplicate parameter names in internal functions
nikic Jul 24, 2020
a8e7462
Add AST export support
nikic Jul 27, 2020
8b14583
Fix test name
nikic Jul 27, 2020
75964c0
Add tests for Attribut(flags: )
nikic Jul 27, 2020
e550f4a
Only check for undef in RECV(_INIT)
nikic Jul 27, 2020
d346bbd
Check for undef in recv jit
nikic Jul 27, 2020
8bdd1a9
Add flag to distinguish named fcalls
nikic Jul 27, 2020
883c0a5
SEND may throw for named params
nikic Jul 27, 2020
3683f0e
For unpacks, we should also assume there may be named args
nikic Jul 27, 2020
368500b
Free extra named args in jit
nikic Jul 27, 2020
d0492b1
Initialize icall undef args in jit
nikic Jul 27, 2020
bb79eed
Always emit type check in RECV_INIT
nikic Jul 28, 2020
268b69c
Fix attribtue tests for new syntax
nikic Jul 28, 2020
fc37bc0
WIP
nikic Jul 30, 2020
5fddc6f
Fixes
nikic Jul 30, 2020
06a4ab7
Cleanup
nikic Jul 30, 2020
a46694c
jit
nikic Jul 30, 2020
1aec287
Fix windows?
nikic Jul 30, 2020
a164e5d
Rename opcode to be more precise
nikic Jul 30, 2020
90dac08
Make flag meaning more precise
nikic Jul 31, 2020
a9a0252
Make compiler code a bit smarter
nikic Jul 31, 2020
2700037
Move function back to where it was
nikic Jul 31, 2020
0f9131e
Rename function to match opcode name
nikic Jul 31, 2020
141ded0
jit cleanup
nikic Jul 31, 2020
077886d
Support extra named params in backtraces
nikic Jul 31, 2020
3e45549
Prepare for extra named params reuse
nikic Jul 31, 2020
e77c2b6
Reuse extra_named_params if possible
nikic Jul 31, 2020
e31838a
Combine check for extra named params and allocated call
nikic Jul 31, 2020
ed108d4
Drop one of the free extra named params helpers
nikic Jul 31, 2020
a6b566d
Revert an incorrect change
nikic Jul 31, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Drop one of the free extra named params helpers
Most places now need a custom call_info check, this is not
worthwhile.
  • Loading branch information
nikic committed Jul 31, 2020
commit ed108d49ba74b717844ff2265b26a6209a5cb3bd
6 changes: 4 additions & 2 deletions Zend/zend_execute.c
Original file line number Diff line number Diff line change
Expand Up @@ -3830,7 +3830,9 @@ static void cleanup_unfinished_calls(zend_execute_data *execute_data, uint32_t o
if (ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS) {
OBJ_RELEASE(Z_OBJ(call->This));
}
zend_free_extra_named_params(call);
if (ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params(call->extra_named_params);
}
if (call->func->common.fn_flags & ZEND_ACC_CLOSURE) {
zend_object_release(ZEND_CLOSURE_OBJECT(call->func));
} else if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
Expand Down Expand Up @@ -4545,7 +4547,7 @@ ZEND_API int ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *call) {
return SUCCESS;
}

ZEND_API void ZEND_FASTCALL zend_free_extra_named_params_ex(zend_array *extra_named_params)
ZEND_API void ZEND_FASTCALL zend_free_extra_named_params(zend_array *extra_named_params)
{
/* Extra named params may be shared. */
zend_array_release(extra_named_params);
Expand Down
7 changes: 1 addition & 6 deletions Zend/zend_execute.h
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,7 @@ static zend_always_inline void zend_vm_stack_extend_call_frame(
}
}

ZEND_API void ZEND_FASTCALL zend_free_extra_named_params_ex(zend_array *extra_named_params);
static zend_always_inline void zend_free_extra_named_params(zend_execute_data *call) {
if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(call->extra_named_params);
}
}
ZEND_API void ZEND_FASTCALL zend_free_extra_named_params(zend_array *extra_named_params);

/* services */
ZEND_API const char *get_active_class_name(const char **space);
Expand Down
4 changes: 3 additions & 1 deletion Zend/zend_generators.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,9 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished
}
/* always free the CV's, in the symtable are only not-free'd IS_INDIRECT's */
zend_free_compiled_variables(execute_data);
zend_free_extra_named_params(execute_data);
if (EX_CALL_INFO() & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params(execute_data->extra_named_params);
}

if (EX_CALL_INFO() & ZEND_CALL_RELEASE_THIS) {
OBJ_RELEASE(Z_OBJ(execute_data->This));
Expand Down
10 changes: 5 additions & 5 deletions Zend/zend_vm_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -2795,7 +2795,7 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
}

if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(EX(extra_named_params));
zend_free_extra_named_params(EX(extra_named_params));
}

/* Free extra args before releasing the closure,
Expand Down Expand Up @@ -2851,7 +2851,7 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
}
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(EX(extra_named_params));
zend_free_extra_named_params(EX(extra_named_params));
}
}
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
Expand Down Expand Up @@ -3907,7 +3907,7 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down Expand Up @@ -4020,7 +4020,7 @@ ZEND_VM_C_LABEL(fcall_by_name_end):
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down Expand Up @@ -4123,7 +4123,7 @@ ZEND_VM_C_LABEL(fcall_end):
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down
20 changes: 10 additions & 10 deletions Zend/zend_vm_execute.h
Original file line number Diff line number Diff line change
Expand Up @@ -1119,7 +1119,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper
}

if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(EX(extra_named_params));
zend_free_extra_named_params(EX(extra_named_params));
}

/* Free extra args before releasing the closure,
Expand Down Expand Up @@ -1175,7 +1175,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper
}
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(EX(extra_named_params));
zend_free_extra_named_params(EX(extra_named_params));
}
}
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
Expand Down Expand Up @@ -1250,7 +1250,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down Expand Up @@ -1311,7 +1311,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down Expand Up @@ -1447,7 +1447,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down Expand Up @@ -1537,7 +1537,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down Expand Up @@ -1640,7 +1640,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down Expand Up @@ -1749,7 +1749,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV
uint32_t call_info = ZEND_CALL_INFO(call);
if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
zend_free_extra_named_params_ex(call->extra_named_params);
zend_free_extra_named_params(call->extra_named_params);
}
zend_vm_stack_free_call_frame_ex(call_info, call);
} else {
Expand Down Expand Up @@ -53445,7 +53445,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
}

if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(EX(extra_named_params));
zend_free_extra_named_params(EX(extra_named_params));
}

/* Free extra args before releasing the closure,
Expand Down Expand Up @@ -53501,7 +53501,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
}
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(EX(extra_named_params));
zend_free_extra_named_params(EX(extra_named_params));
}
}
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
Expand Down
4 changes: 2 additions & 2 deletions ext/opcache/jit/zend_jit_vm_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_nested_func_helper(uint32_t
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
}
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(EX(extra_named_params));
zend_free_extra_named_params(EX(extra_named_params));
}

old_execute_data = execute_data;
Expand Down Expand Up @@ -93,7 +93,7 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_leave_top_func_helper(uint32_t ca
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
}
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
zend_free_extra_named_params_ex(EX(extra_named_params));
zend_free_extra_named_params(EX(extra_named_params));
}
if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
Expand Down
2 changes: 1 addition & 1 deletion ext/opcache/jit/zend_jit_x86.dasc
Original file line number Diff line number Diff line change
Expand Up @@ -9036,7 +9036,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
|.cold_code
|1:
| mov FCARG1a, aword [RX + offsetof(zend_execute_data, extra_named_params)]
| EXT_CALL zend_free_extra_named_params_ex, r0
| EXT_CALL zend_free_extra_named_params, r0
| jmp >2
|.code
|2:
Expand Down