Skip to content

Commit 34edd4a

Browse files
committed
Merge branch 'PHP-7.2' into PHP-7.3
2 parents 195b8ae + ed749ed commit 34edd4a

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
@@ -2430,6 +2430,11 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
24302430
zend_clean_and_cache_symbol_table(EX(symbol_table));
24312431
}
24322432
EG(current_execute_data) = EX(prev_execute_data);
2433+
2434+
/* Free extra args before releasing the closure,
2435+
* as that may free the op_array. */
2436+
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
2437+
24332438
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
24342439
zend_object *object = Z_OBJ(execute_data->This);
24352440
#if 0
@@ -2445,7 +2450,6 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY)
24452450
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
24462451
}
24472452

2448-
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
24492453
old_execute_data = execute_data;
24502454
execute_data = EX(prev_execute_data);
24512455
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
@@ -541,6 +541,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
541541
zend_clean_and_cache_symbol_table(EX(symbol_table));
542542
}
543543
EG(current_execute_data) = EX(prev_execute_data);
544+
545+
/* Free extra args before releasing the closure,
546+
* as that may free the op_array. */
547+
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
548+
544549
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
545550
zend_object *object = Z_OBJ(execute_data->This);
546551
#if 0
@@ -556,7 +561,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_
556561
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
557562
}
558563

559-
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
560564
old_execute_data = execute_data;
561565
execute_data = EX(prev_execute_data);
562566
zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
@@ -55375,6 +55379,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5537555379
zend_clean_and_cache_symbol_table(EX(symbol_table));
5537655380
}
5537755381
EG(current_execute_data) = EX(prev_execute_data);
55382+
55383+
/* Free extra args before releasing the closure,
55384+
* as that may free the op_array. */
55385+
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
55386+
5537855387
if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
5537955388
zend_object *object = Z_OBJ(execute_data->This);
5538055389
#if 0
@@ -55390,7 +55399,6 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5539055399
OBJ_RELEASE(ZEND_CLOSURE_OBJECT(EX(func)));
5539155400
}
5539255401

55393-
zend_vm_stack_free_extra_args_ex(call_info, execute_data);
5539455402
old_execute_data = execute_data;
5539555403
execute_data = EX(prev_execute_data);
5539655404
zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);

0 commit comments

Comments
 (0)