Skip to content

Commit 15040b4

Browse files
committed
Merge branch 'PHP-7.1'
* PHP-7.1: Improved GENERATOR_CREATE opcode handler.
2 parents f2f70cf + 9a159f3 commit 15040b4

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

Zend/zend_vm_def.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3962,8 +3962,14 @@ ZEND_VM_HANDLER(41, ZEND_GENERATOR_CREATE, ANY, ANY)
39623962
* is allocated on heap.
39633963
*/
39643964
num_args = EX_NUM_ARGS();
3965-
used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - MIN(EX(func)->op_array.num_args, num_args)) * sizeof(zval);
3966-
gen_execute_data = (zend_execute_data*)emalloc(used_stack);
3965+
if (EXPECTED(num_args <= EX(func)->op_array.last_var)) {
3966+
used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var + EX(func)->op_array.T) * sizeof(zval);
3967+
gen_execute_data = (zend_execute_data*)emalloc(used_stack);
3968+
used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var) * sizeof(zval);
3969+
} else {
3970+
used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - EX(func)->op_array.num_args) * sizeof(zval);
3971+
gen_execute_data = (zend_execute_data*)emalloc(used_stack);
3972+
}
39673973
memcpy(gen_execute_data, execute_data, used_stack);
39683974

39693975
/* Save execution context in generator object. */

Zend/zend_vm_execute.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,8 +1159,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_CREATE_SPEC_HANDLER(
11591159
* is allocated on heap.
11601160
*/
11611161
num_args = EX_NUM_ARGS();
1162-
used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - MIN(EX(func)->op_array.num_args, num_args)) * sizeof(zval);
1163-
gen_execute_data = (zend_execute_data*)emalloc(used_stack);
1162+
if (EXPECTED(num_args <= EX(func)->op_array.last_var)) {
1163+
used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var + EX(func)->op_array.T) * sizeof(zval);
1164+
gen_execute_data = (zend_execute_data*)emalloc(used_stack);
1165+
used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var) * sizeof(zval);
1166+
} else {
1167+
used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - EX(func)->op_array.num_args) * sizeof(zval);
1168+
gen_execute_data = (zend_execute_data*)emalloc(used_stack);
1169+
}
11641170
memcpy(gen_execute_data, execute_data, used_stack);
11651171

11661172
/* Save execution context in generator object. */

0 commit comments

Comments
 (0)