summaryrefslogtreecommitdiff
path: root/Zend/tests/generators/yield_from_multi_tree_exception.phpt
blob: 4ff2e4e41f5a8fc322867031dec69204788cabb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
--TEST--
yield from on multiple trees needing merge
--FILE--
<?php

function from($levels) {
	foreach (range(0, 2 << $levels) as $v) {
		yield $v;
		if ($v == (1 << ($levels - 1)) - 2) {
			throw new Exception();
		}
	}
}

function gen($gen, $level) {
	yield from $gen;
}

$levels = 5;

print "$levels levels\n\n";

$all = array();
$all[] = $gens[0][0] = from($levels);

for ($level = 1; $level < $levels; $level++) {
	for ($i = 0; $i < (1 << $level); $i++) {
		$all[] = $gens[$level][$i] = gen($gens[$level-1][$i >> 1], $level);
	}
}

for ($i = 0; $i < 2; $i++) {
	try {
		foreach ($all as $gen) {
			var_dump($gen->current());
			$gen->next();
			if (!$gen->valid()) {
				break;
			}
		}
	} catch(Exception $e) {
		print "$e\n";
		unset($all[array_search($gen, $all)]);
	}
}
?>
--EXPECTF--
5 levels

int(0)
int(1)
int(2)
int(3)
int(4)
int(5)
int(6)
int(7)
int(8)
int(9)
int(10)
int(11)
int(12)
int(13)
int(14)
Exception in %s:%d
Stack trace:
#0 %s(%d): from(5)
#1 %s(%d): gen(Object(Generator), 1)
#2 %s(%d): gen(Object(Generator), 2)
#3 [internal function]: gen(Object(Generator), 3)
#4 %s(%d): Generator->next()
#5 {main}
ClosedGeneratorException: Generator yielded from aborted, no return value available in %s:%d
Stack trace:
#0 [internal function]: gen(Object(Generator), 1)
#1 %s(%d): Generator->current()
#2 {main}