Skip to content

Commit 8ba6a83

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fixed bug #78434
2 parents 3709e74 + 823a956 commit 8ba6a83

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

Zend/tests/generators/bug78434.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Bug #78434: Generator skips first item after valid() call
3+
--FILE--
4+
<?php
5+
6+
$function = function () {
7+
yield 0;
8+
};
9+
10+
$wrapper = function () use ($function) {
11+
$generator = $function();
12+
$generator->valid();
13+
yield from $generator;
14+
15+
$generator = $function();
16+
$generator->valid();
17+
yield from $generator;
18+
};
19+
20+
foreach ($wrapper() as $value) {
21+
echo $value, "\n";
22+
}
23+
24+
?>
25+
--EXPECT--
26+
0
27+
0

Zend/tests/generators/yield_from_multi_tree.phpt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ function from($levels) {
1010
}
1111

1212
function gen($gen, $level) {
13-
if ($level % 2) {
14-
yield $gen->current();
15-
}
1613
yield from $gen;
1714
}
1815

Zend/zend_generators.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ void zend_generator_yield_from(zend_generator *generator, zend_generator *from)
610610
generator->node.parent = from;
611611
zend_generator_get_current(generator);
612612
GC_DELREF(&from->std);
613+
generator->flags |= ZEND_GENERATOR_DO_INIT;
613614
}
614615

615616
ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator, zend_generator *leaf)
@@ -786,6 +787,7 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
786787

787788
if (UNEXPECTED((orig_generator->flags & ZEND_GENERATOR_DO_INIT) != 0 && !Z_ISUNDEF(generator->value))) {
788789
/* We must not advance Generator if we yield from a Generator being currently run */
790+
orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT;
789791
return;
790792
}
791793

@@ -865,15 +867,15 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
865867
goto try_again;
866868
}
867869
}
870+
871+
orig_generator->flags &= ~ZEND_GENERATOR_DO_INIT;
868872
}
869873
/* }}} */
870874

871875
static inline void zend_generator_ensure_initialized(zend_generator *generator) /* {{{ */
872876
{
873877
if (UNEXPECTED(Z_TYPE(generator->value) == IS_UNDEF) && EXPECTED(generator->execute_data) && EXPECTED(generator->node.parent == NULL)) {
874-
generator->flags |= ZEND_GENERATOR_DO_INIT;
875878
zend_generator_resume(generator);
876-
generator->flags &= ~ZEND_GENERATOR_DO_INIT;
877879
generator->flags |= ZEND_GENERATOR_AT_FIRST_YIELD;
878880
}
879881
}

0 commit comments

Comments
 (0)