summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-06-23 20:13:25 +0200
committerNikita Popov <nikic@php.net>2015-06-23 20:17:30 +0200
commitea5c66ec9310430111b48d4589e56cea5c0b5ab0 (patch)
treed4a4981ade3a28a11328f6f2e45eec2e738ffcaa /Zend/zend_generators.c
parentf4d08d8e5cb413f4d70a1f64f16b6b0ce1808e21 (diff)
downloadphp-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.c9
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);