summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2012-08-29 20:31:34 +0200
committerNikita Popov <nikic@php.net>2012-08-29 20:31:34 +0200
commitcc07038fa9b2a59893c52fb0c515a1fb03e56d5c (patch)
tree088e88b4ea619572178652be6330149ddc1fb6fd
parentd60e3c6ef53986e82178bb657ad907edc16d2c34 (diff)
downloadphp-git-cc07038fa9b2a59893c52fb0c515a1fb03e56d5c.tar.gz
Make sure that exception is thrown on rewind() after closing too
-rw-r--r--Zend/tests/generators/generator_rewind.phpt16
-rw-r--r--Zend/zend_generators.c2
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;
}