diff options
Diffstat (limited to 'Zend/zend_generators.c')
| -rw-r--r-- | Zend/zend_generators.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index d6b4a3b0ad..78cb346eb7 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -35,7 +35,7 @@ static void zend_generator_cleanup_unfinished_execution(zend_generator *generato zend_op_array *op_array = execute_data->op_array; if (generator->send_target) { - Z_DELREF_P(generator->send_target); + if (Z_REFCOUNTED_P(generator->send_target)) Z_DELREF_P(generator->send_target); generator->send_target = NULL; } @@ -302,6 +302,9 @@ ZEND_API void zend_generator_create_zval(zend_op_array *op_array, zval *return_v generator->execute_data = execute_data; generator->stack = EG(argument_stack); EG(argument_stack) = current_stack; + + /* EX(return_value) keeps pointer to zend_object (not a real zval) */ + execute_data->return_value = (zval*)generator; } /* }}} */ @@ -515,9 +518,8 @@ ZEND_METHOD(Generator, send) /* Put sent value in the target VAR slot, if it is used */ if (generator->send_target) { - Z_DELREF_P(generator->send_target); - Z_ADDREF_P(value); - ZVAL_COPY_VALUE(generator->send_target, value); + if (Z_REFCOUNTED_P(generator->send_target)) Z_DELREF_P(generator->send_target); + ZVAL_COPY(generator->send_target, value); } zend_generator_resume(generator TSRMLS_CC); @@ -672,6 +674,9 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob } iterator = &generator->iterator; + + zend_iterator_init(&iterator->intern TSRMLS_CC); + iterator->intern.funcs = &zend_generator_iterator_functions; iterator->intern.data = (void *) generator; |
