summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-02-19 20:17:37 +0100
committerNikita Popov <nikic@php.net>2015-03-17 21:51:53 +0100
commit5c230baf75fb17d1d0b8ec407a7479d02b25068a (patch)
tree866ca1a75f62398d13996c383f403a5e942a319e /Zend/zend_generators.c
parentf1a6c06f14834c0f3ef7769aef3917538f1f693b (diff)
downloadphp-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.c32
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
};