Skip to content

Commit d00036e

Browse files
committed
Merge branch 'PHP-7.4'
2 parents 70e604e + a12fe30 commit d00036e

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

Zend/tests/closure_extra_args.phpt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
--TEST--
2+
Immediately invoked closure with extra args
3+
--FILE--
4+
<?php
5+
6+
(function() {})(new stdClass);
7+
8+
?>
9+
===DONE===
10+
--EXPECT--
11+
===DONE===

Zend/zend_vm_def.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2935,13 +2935,17 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
29352935
zend_clean_and_cache_symbol_table(EX(symbol_table));
29362936
}
29372937
EG(current_execute_data) = EX(prev_execute_data);
2938+
2939+
/* Free extra args before releasing the closure,
2940+
* as that may free the op_array. */
2941+
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
2942+
29382943
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
29392944
OBJ_RELEASE(Z_OBJ(execute_data->This));
29402945
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
29412946
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
29422947
}
29432948

2944-
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
29452949
old_execute_data = execute_data;
29462950
execute_data = EX(prev_execute_data);
29472951
zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);

Zend/zend_vm_execute.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,13 +1167,17 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper
11671167
zend_clean_and_cache_symbol_table(EX(symbol_table));
11681168
}
11691169
EG(current_execute_data) = EX(prev_execute_data);
1170+
1171+
/* Free extra args before releasing the closure,
1172+
* as that may free the op_array. */
1173+
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
1174+
11701175
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
11711176
OBJ_RELEASE(Z_OBJ(execute_data->This));
11721177
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
11731178
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
11741179
}
11751180

1176-
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
11771181
old_execute_data = execute_data;
11781182
execute_data = EX(prev_execute_data);
11791183
zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
@@ -54140,13 +54144,17 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5414054144
zend_clean_and_cache_symbol_table(EX(symbol_table));
5414154145
}
5414254146
EG(current_execute_data) = EX(prev_execute_data);
54147+
54148+
/* Free extra args before releasing the closure,
54149+
* as that may free the op_array. */
54150+
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
54151+
5414354152
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
5414454153
OBJ_RELEASE(Z_OBJ(execute_data->This));
5414554154
} else if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
5414654155
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
5414754156
}
5414854157

54149-
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
5415054158
old_execute_data = execute_data;
5415154159
execute_data = EX(prev_execute_data);
5415254160
zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);

0 commit comments

Comments
 (0)