diff options
Diffstat (limited to 'Zend/zend_generators.c')
-rw-r--r-- | Zend/zend_generators.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 971d4e7bc8..7ebbca1030 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -186,6 +186,10 @@ static void zend_generator_free_storage(zend_object *object) /* {{{ */ zend_generator_close(generator, 0); + if (!Z_ISUNDEF(generator->retval)) { + zval_ptr_dtor(&generator->retval); + } + zend_object_std_dtor(&generator->std); if (generator->iterator) { @@ -204,6 +208,8 @@ static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ * /* The key will be incremented on first use, so it'll start at 0 */ generator->largest_used_integer_key = -1; + ZVAL_UNDEF(&generator->retval); + zend_object_std_init(&generator->std, class_type); generator->std.handlers = &zend_generator_handlers; @@ -535,6 +541,34 @@ ZEND_METHOD(Generator, throw) } /* }}} */ +/* {{{ proto mixed Generator::getReturn() + * Retrieves the return value of the generator */ +ZEND_METHOD(Generator, getReturn) +{ + zend_generator *generator; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + generator = (zend_generator *) Z_OBJ_P(getThis()); + + zend_generator_ensure_initialized(generator); + if (EG(exception)) { + return; + } + + if (Z_ISUNDEF(generator->retval)) { + /* Generator hasn't returned yet -> error! */ + zend_throw_exception(NULL, + "Cannot get return value of a generator that hasn't returned", 0); + return; + } + + ZVAL_COPY(return_value, &generator->retval); +} +/* }}} */ + /* {{{ proto void Generator::__wakeup() * Throws an Exception as generators can't be serialized */ ZEND_METHOD(Generator, __wakeup) @@ -668,6 +702,7 @@ static const zend_function_entry generator_functions[] = { ZEND_ME(Generator, next, arginfo_generator_void, ZEND_ACC_PUBLIC) ZEND_ME(Generator, send, arginfo_generator_send, ZEND_ACC_PUBLIC) ZEND_ME(Generator, throw, arginfo_generator_throw, ZEND_ACC_PUBLIC) + ZEND_ME(Generator, getReturn,arginfo_generator_void, ZEND_ACC_PUBLIC) ZEND_ME(Generator, __wakeup, arginfo_generator_void, ZEND_ACC_PUBLIC) ZEND_FE_END }; |