@@ -186,6 +186,7 @@ static void zend_generator_free_storage(zend_object *object) /* {{{ */
186186
187187 zend_generator_close (generator , 0 );
188188
189+ zval_ptr_dtor (& generator -> retval );
189190 zend_object_std_dtor (& generator -> std );
190191
191192 if (generator -> iterator ) {
@@ -204,6 +205,8 @@ static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ *
204205 /* The key will be incremented on first use, so it'll start at 0 */
205206 generator -> largest_used_integer_key = -1 ;
206207
208+ ZVAL_UNDEF (& generator -> retval );
209+
207210 zend_object_std_init (& generator -> std , class_type );
208211 generator -> std .handlers = & zend_generator_handlers ;
209212
@@ -537,6 +540,34 @@ ZEND_METHOD(Generator, throw)
537540}
538541/* }}} */
539542
543+ /* {{{ proto mixed Generator::getReturn()
544+ * Retrieves the return value of the generator */
545+ ZEND_METHOD (Generator , getReturn )
546+ {
547+ zend_generator * generator ;
548+
549+ if (zend_parse_parameters_none () == FAILURE ) {
550+ return ;
551+ }
552+
553+ generator = (zend_generator * ) Z_OBJ_P (getThis ());
554+
555+ zend_generator_ensure_initialized (generator );
556+ if (EG (exception )) {
557+ return ;
558+ }
559+
560+ if (Z_ISUNDEF (generator -> retval )) {
561+ /* Generator hasn't returned yet -> error! */
562+ zend_throw_exception (NULL ,
563+ "Cannot get return value of a generator that hasn't returned" , 0 );
564+ return ;
565+ }
566+
567+ ZVAL_COPY (return_value , & generator -> retval );
568+ }
569+ /* }}} */
570+
540571/* {{{ proto void Generator::__wakeup()
541572 * Throws an Exception as generators can't be serialized */
542573ZEND_METHOD (Generator , __wakeup )
@@ -670,6 +701,7 @@ static const zend_function_entry generator_functions[] = {
670701 ZEND_ME (Generator , next , arginfo_generator_void , ZEND_ACC_PUBLIC )
671702 ZEND_ME (Generator , send , arginfo_generator_send , ZEND_ACC_PUBLIC )
672703 ZEND_ME (Generator , throw , arginfo_generator_throw , ZEND_ACC_PUBLIC )
704+ ZEND_ME (Generator , getReturn ,arginfo_generator_void , ZEND_ACC_PUBLIC )
673705 ZEND_ME (Generator , __wakeup , arginfo_generator_void , ZEND_ACC_PUBLIC )
674706 ZEND_FE_END
675707};
0 commit comments