diff options
| author | Nikita Popov <nikic@php.net> | 2015-06-23 20:13:25 +0200 |
|---|---|---|
| committer | Nikita Popov <nikic@php.net> | 2015-06-23 20:17:30 +0200 |
| commit | ea5c66ec9310430111b48d4589e56cea5c0b5ab0 (patch) | |
| tree | d4a4981ade3a28a11328f6f2e45eec2e738ffcaa /Zend/zend_generators.c | |
| parent | f4d08d8e5cb413f4d70a1f64f16b6b0ce1808e21 (diff) | |
| download | php-git-ea5c66ec9310430111b48d4589e56cea5c0b5ab0.tar.gz | |
Avoid op_num = -1 in unfinished generator cleanup
Also add two tests showing that the -1 substraction in the
computation of op_num is really necessary.
Diffstat (limited to 'Zend/zend_generators.c')
| -rw-r--r-- | Zend/zend_generators.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 6a04ebd123..96592fa95d 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -34,15 +34,16 @@ static zend_object *zend_generator_create(zend_class_entry *class_type); static void zend_generator_cleanup_unfinished_execution(zend_generator *generator) /* {{{ */ { zend_execute_data *execute_data = generator->execute_data; - /* -1 required because we want the last run opcode, not the next to-be-run one. */ - uint32_t op_num = execute_data->opline - execute_data->func->op_array.opcodes - 1; if (generator->send_target) { - if (Z_REFCOUNTED_P(generator->send_target)) Z_DELREF_P(generator->send_target); + Z_TRY_DELREF_P(generator->send_target); generator->send_target = NULL; } - { + if (execute_data->opline != execute_data->func->op_array.opcodes) { + /* -1 required because we want the last run opcode, not the next to-be-run one. */ + uint32_t op_num = execute_data->opline - execute_data->func->op_array.opcodes - 1; + /* There may be calls to zend_vm_stack_free_call_frame(), which modifies the VM stack * globals, so need to load/restore those. */ zend_vm_stack original_stack = EG(vm_stack); |
