diff options
author | Nikita Popov <nikic@php.net> | 2015-02-19 20:17:37 +0100 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-03-17 21:51:53 +0100 |
commit | 5c230baf75fb17d1d0b8ec407a7479d02b25068a (patch) | |
tree | 866ca1a75f62398d13996c383f403a5e942a319e /Zend/zend_generators.c | |
parent | f1a6c06f14834c0f3ef7769aef3917538f1f693b (diff) | |
download | php-git-5c230baf75fb17d1d0b8ec407a7479d02b25068a.tar.gz |
Implement Generator::getReturn()
Conflicts:
Zend/zend_vm_execute.h
Diffstat (limited to 'Zend/zend_generators.c')
-rw-r--r-- | Zend/zend_generators.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index f0aab0428d..1ec0539a71 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -186,6 +186,7 @@ static void zend_generator_free_storage(zend_object *object) /* {{{ */ zend_generator_close(generator, 0); + zval_ptr_dtor(&generator->retval); zend_object_std_dtor(&generator->std); if (generator->iterator) { @@ -204,6 +205,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; @@ -537,6 +540,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) @@ -670,6 +701,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 }; |