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-02-19 20:25:49 +0100
commit79f26e9ca562cc4e692913432299cb9bbf906478 (patch)
treed333901d478f18e628d9cd1884c097e69fe64053 /Zend/zend_generators.c
parentd428bf2d4edab232690b64977aaf0a3b15585843 (diff)
downloadphp-git-79f26e9ca562cc4e692913432299cb9bbf906478.tar.gz
Implement Generator::getReturn()
Diffstat (limited to 'Zend/zend_generators.c')
-rw-r--r--Zend/zend_generators.c35
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
};