Skip to content

Commit 2d217f7

Browse files
committed
Fix crashes with unproper cleaning of repeated yield from
1 parent 71de8fe commit 2d217f7

File tree

3 files changed

+439
-11
lines changed

3 files changed

+439
-11
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
A generator can be yielded from multiple times, testing immediate release of the yield from'ing generator
3+
--FILE--
4+
<?php
5+
6+
function gen() {
7+
yield 42;
8+
}
9+
function yield_from($gen) {
10+
yield from $gen;
11+
}
12+
$gen = gen();
13+
var_dump(yield_from($gen)->current());
14+
var_dump(yield_from($gen)->current());
15+
16+
?>
17+
--EXPECT--
18+
int(42)
19+
int(42)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
--TEST--
2+
yield from on multiple trees needing merge, with intermediary nodes having only one child
3+
--FILE--
4+
<?php
5+
6+
function from($levels) {
7+
foreach (range(0, 2 << $levels) as $v) {
8+
yield $v;
9+
}
10+
}
11+
12+
function gen($gen, $level) {
13+
yield from (function() use ($gen) { yield from $gen; })();
14+
}
15+
16+
foreach (range(0, 6) as $levels) {
17+
print "$levels level".($levels == 1 ? "" : "s")."\n\n";
18+
19+
$all = array();
20+
$all[] = $gens[0][0] = from($levels);
21+
22+
for ($level = 1; $level < $levels; $level++) {
23+
for ($i = 0; $i < (1 << $level); $i++) {
24+
$all[] = $gens[$level][$i] = gen($gens[$level-1][$i >> 1], $level);
25+
}
26+
}
27+
28+
while (1) {
29+
foreach ($all as $gen) {
30+
var_dump($gen->current());
31+
$gen->next();
32+
if (!$gen->valid()) {
33+
break 2;
34+
}
35+
}
36+
}
37+
38+
print "\n\n";
39+
}
40+
?>
41+
--EXPECT--
42+
0 levels
43+
44+
int(0)
45+
int(1)
46+
int(2)
47+
48+
49+
1 level
50+
51+
int(0)
52+
int(1)
53+
int(2)
54+
int(3)
55+
int(4)
56+
57+
58+
2 levels
59+
60+
int(0)
61+
int(1)
62+
int(2)
63+
int(3)
64+
int(4)
65+
int(5)
66+
int(6)
67+
int(7)
68+
int(8)
69+
70+
71+
3 levels
72+
73+
int(0)
74+
int(1)
75+
int(2)
76+
int(3)
77+
int(4)
78+
int(5)
79+
int(6)
80+
int(7)
81+
int(8)
82+
int(9)
83+
int(10)
84+
int(11)
85+
int(12)
86+
int(13)
87+
int(14)
88+
int(15)
89+
int(16)
90+
91+
92+
4 levels
93+
94+
int(0)
95+
int(1)
96+
int(2)
97+
int(3)
98+
int(4)
99+
int(5)
100+
int(6)
101+
int(7)
102+
int(8)
103+
int(9)
104+
int(10)
105+
int(11)
106+
int(12)
107+
int(13)
108+
int(14)
109+
int(15)
110+
int(16)
111+
int(17)
112+
int(18)
113+
int(19)
114+
int(20)
115+
int(21)
116+
int(22)
117+
int(23)
118+
int(24)
119+
int(25)
120+
int(26)
121+
int(27)
122+
int(28)
123+
int(29)
124+
int(30)
125+
int(31)
126+
int(32)
127+
128+
129+
5 levels
130+
131+
int(0)
132+
int(1)
133+
int(2)
134+
int(3)
135+
int(4)
136+
int(5)
137+
int(6)
138+
int(7)
139+
int(8)
140+
int(9)
141+
int(10)
142+
int(11)
143+
int(12)
144+
int(13)
145+
int(14)
146+
int(15)
147+
int(16)
148+
int(17)
149+
int(18)
150+
int(19)
151+
int(20)
152+
int(21)
153+
int(22)
154+
int(23)
155+
int(24)
156+
int(25)
157+
int(26)
158+
int(27)
159+
int(28)
160+
int(29)
161+
int(30)
162+
int(31)
163+
int(32)
164+
int(33)
165+
int(34)
166+
int(35)
167+
int(36)
168+
int(37)
169+
int(38)
170+
int(39)
171+
int(40)
172+
int(41)
173+
int(42)
174+
int(43)
175+
int(44)
176+
int(45)
177+
int(46)
178+
int(47)
179+
int(48)
180+
int(49)
181+
int(50)
182+
int(51)
183+
int(52)
184+
int(53)
185+
int(54)
186+
int(55)
187+
int(56)
188+
int(57)
189+
int(58)
190+
int(59)
191+
int(60)
192+
int(61)
193+
int(62)
194+
int(63)
195+
int(64)
196+
197+
198+
6 levels
199+
200+
int(0)
201+
int(1)
202+
int(2)
203+
int(3)
204+
int(4)
205+
int(5)
206+
int(6)
207+
int(7)
208+
int(8)
209+
int(9)
210+
int(10)
211+
int(11)
212+
int(12)
213+
int(13)
214+
int(14)
215+
int(15)
216+
int(16)
217+
int(17)
218+
int(18)
219+
int(19)
220+
int(20)
221+
int(21)
222+
int(22)
223+
int(23)
224+
int(24)
225+
int(25)
226+
int(26)
227+
int(27)
228+
int(28)
229+
int(29)
230+
int(30)
231+
int(31)
232+
int(32)
233+
int(33)
234+
int(34)
235+
int(35)
236+
int(36)
237+
int(37)
238+
int(38)
239+
int(39)
240+
int(40)
241+
int(41)
242+
int(42)
243+
int(43)
244+
int(44)
245+
int(45)
246+
int(46)
247+
int(47)
248+
int(48)
249+
int(49)
250+
int(50)
251+
int(51)
252+
int(52)
253+
int(53)
254+
int(54)
255+
int(55)
256+
int(56)
257+
int(57)
258+
int(58)
259+
int(59)
260+
int(60)
261+
int(61)
262+
int(62)
263+
int(63)
264+
int(64)
265+
int(65)
266+
int(66)
267+
int(67)
268+
int(68)
269+
int(69)
270+
int(70)
271+
int(71)
272+
int(72)
273+
int(73)
274+
int(74)
275+
int(75)
276+
int(76)
277+
int(77)
278+
int(78)
279+
int(79)
280+
int(80)
281+
int(81)
282+
int(82)
283+
int(83)
284+
int(84)
285+
int(85)
286+
int(86)
287+
int(87)
288+
int(88)
289+
int(89)
290+
int(90)
291+
int(91)
292+
int(92)
293+
int(93)
294+
int(94)
295+
int(95)
296+
int(96)
297+
int(97)
298+
int(98)
299+
int(99)
300+
int(100)
301+
int(101)
302+
int(102)
303+
int(103)
304+
int(104)
305+
int(105)
306+
int(106)
307+
int(107)
308+
int(108)
309+
int(109)
310+
int(110)
311+
int(111)
312+
int(112)
313+
int(113)
314+
int(114)
315+
int(115)
316+
int(116)
317+
int(117)
318+
int(118)
319+
int(119)
320+
int(120)
321+
int(121)
322+
int(122)
323+
int(123)
324+
int(124)
325+
int(125)
326+
int(126)
327+
int(127)
328+
int(128)

0 commit comments

Comments
 (0)