Skip to content

Commit cf70e19

Browse files
committed
Merge branch 'PHP-7.1' into PHP-7.2
2 parents d00f52b + 8c07170 commit cf70e19

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Generator GC when the yield from parent chain does not reach the root
3+
--FILE--
4+
<?php
5+
6+
function root() {
7+
yield 1;
8+
yield 2;
9+
}
10+
11+
function delegate($gen) {
12+
yield from $gen;
13+
}
14+
15+
$gen = delegate(delegate(root()));
16+
$gen1 = delegate(delegate($gen));
17+
$gen2 = delegate(delegate($gen));
18+
var_dump($gen1->current());
19+
var_dump($gen2->current());
20+
$gen1->next();
21+
$gen1->next();
22+
gc_collect_cycles();
23+
24+
?>
25+
--EXPECT--
26+
int(1)
27+
int(1)

Zend/zend_generators.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,9 @@ static uint32_t calc_gc_buffer_size(zend_generator *generator) /* {{{ */
276276

277277
/* Yield from root references */
278278
if (generator->node.children == 0) {
279-
zend_generator *child = generator, *root = generator->node.ptr.root;
280-
while (root != child) {
281-
child = child->node.parent;
279+
zend_generator *root = generator->node.ptr.root;
280+
while (root != generator) {
281+
root = zend_generator_get_child(&root->node, generator);
282282
size++;
283283
}
284284
}
@@ -341,10 +341,10 @@ static HashTable *zend_generator_get_gc(zval *object, zval **table, int *n) /* {
341341
}
342342

343343
if (generator->node.children == 0) {
344-
zend_generator *child = generator, *root = generator->node.ptr.root;
345-
while (root != child) {
346-
child = child->node.parent;
347-
ZVAL_OBJ(gc_buffer++, &child->std);
344+
zend_generator *root = generator->node.ptr.root;
345+
while (root != generator) {
346+
ZVAL_OBJ(gc_buffer++, &root->std);
347+
root = zend_generator_get_child(&root->node, generator);
348348
}
349349
}
350350

0 commit comments

Comments
 (0)