From cc07038fa9b2a59893c52fb0c515a1fb03e56d5c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 29 Aug 2012 20:31:34 +0200 Subject: [PATCH] Make sure that exception is thrown on rewind() after closing too --- Zend/tests/generators/generator_rewind.phpt | 16 ++++++++++++++++ Zend/zend_generators.c | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Zend/tests/generators/generator_rewind.phpt b/Zend/tests/generators/generator_rewind.phpt index 3224f6a9b6..af885ef382 100644 --- a/Zend/tests/generators/generator_rewind.phpt +++ b/Zend/tests/generators/generator_rewind.phpt @@ -21,6 +21,14 @@ try { echo "\n", $e, "\n\n"; } +$gen = gen(); +foreach ($gen as $v) { } +try { + foreach ($gen as $v) { } +} catch (Exception $e) { + echo "\n", $e, "\n\n"; +} + function gen2() { echo "in generator\n"; @@ -40,4 +48,12 @@ Stack trace: #0 %s(%d): Generator->rewind() #1 {main} +before yield +after yield + +exception 'Exception' with message 'Cannot rewind a generator that was already run' in %s:%d +Stack trace: +#0 %s(%d): unknown() +#1 {main} + in generator diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 03294f7f0e..0eb17d0293 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -500,7 +500,7 @@ void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{ */ static void zend_generator_ensure_initialized(zend_generator *generator TSRMLS_DC) /* {{{ */ { - if (!generator->value) { + if (generator->execute_data && !generator->value) { zend_generator_resume(generator TSRMLS_CC); generator->flags |= ZEND_GENERATOR_AT_FIRST_YIELD; } -- 2.40.0