]> granicus.if.org Git - php/commitdiff
Fixed bug #70965 (yield from with a common iterator primes too much)
authorBob Weinand <bobwei9@hotmail.com>
Wed, 25 Nov 2015 08:49:39 +0000 (09:49 +0100)
committerBob Weinand <bobwei9@hotmail.com>
Wed, 25 Nov 2015 08:54:24 +0000 (09:54 +0100)
Zend/tests/generators/bug70965.phpt [new file with mode: 0644]
Zend/zend_generators.c

diff --git a/Zend/tests/generators/bug70965.phpt b/Zend/tests/generators/bug70965.phpt
new file mode 100644 (file)
index 0000000..4ed34fd
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Bug #70965 (yield from with a common iterator primes too much)
+--FILE--
+<?php
+
+function it() {
+    yield from [1, 2, 3, 4, 5];
+}
+
+function bar($g) {
+    yield from $g;
+}
+
+$gen = it();
+$gens[] = bar($gen);
+$gens[] = bar($gen);
+
+do {
+    foreach($gens as $g) {
+        var_dump($g->current());
+        $gen->next();
+    }
+} while ($gen->valid());
+
+?>
+--EXPECT--
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(5)
index 55026335709905c9987bafcc83a57cc2609fad66..9ef63df8d640647113a6aea06bda7dca1ec3923c 100644 (file)
@@ -621,6 +621,11 @@ try_again:
                return;
        }
 
+       if (UNEXPECTED((orig_generator->flags & ZEND_GENERATOR_DO_INIT) != 0 && !Z_ISUNDEF(generator->value))) {
+               /* We must not advance Generator if we yield from a Generator being currently run */
+               return;
+       }
+
        if (UNEXPECTED(!Z_ISUNDEF(generator->values))) {
                if (EXPECTED(zend_generator_get_next_delegated_value(generator) == SUCCESS)) {
                        return;
@@ -629,11 +634,6 @@ try_again:
                 * after the "yield from" expression. */
        }
 
-       if (UNEXPECTED((orig_generator->flags & ZEND_GENERATOR_DO_INIT) != 0 && !Z_ISUNDEF(generator->value))) {
-               /* We must not advance Generator if we yield from a Generator being currently run */
-               return;
-       }
-
        /* Drop the AT_FIRST_YIELD flag */
        orig_generator->flags &= ~ZEND_GENERATOR_AT_FIRST_YIELD;