diff options
author | Nikita Popov <nikic@php.net> | 2012-08-29 20:31:34 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2012-08-29 20:31:34 +0200 |
commit | cc07038fa9b2a59893c52fb0c515a1fb03e56d5c (patch) | |
tree | 088e88b4ea619572178652be6330149ddc1fb6fd | |
parent | d60e3c6ef53986e82178bb657ad907edc16d2c34 (diff) | |
download | php-git-cc07038fa9b2a59893c52fb0c515a1fb03e56d5c.tar.gz |
Make sure that exception is thrown on rewind() after closing too
-rw-r--r-- | Zend/tests/generators/generator_rewind.phpt | 16 | ||||
-rw-r--r-- | Zend/zend_generators.c | 2 |
2 files changed, 17 insertions, 1 deletions
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; } |