php-src/Zend/tests/generators/generator_rewind.phpt
Nikita Popov bef79588d5 Fix segfault when traversing a by-ref generator twice
If you try to traverse an already closed generator an exception will now be
thrown.

Furthermore this changes the error for traversing a by-val generator by-ref
from an E_ERROR to an Exception.
2012-08-29 20:46:56 +02:00

63 lines
960 B
PHP

--TEST--
A generator can only be rewinded before or at the first yield
--FILE--
<?php
function gen() {
echo "before yield\n";
yield;
echo "after yield\n";
yield;
}
$gen = gen();
$gen->rewind();
$gen->rewind();
$gen->next();
try {
$gen->rewind();
} catch (Exception $e) {
echo "\n", $e, "\n\n";
}
function &gen2() {
$foo = 'bar';
yield $foo;
yield $foo;
}
$gen = gen2();
foreach ($gen as $v) { }
try {
foreach ($gen as $v) { }
} catch (Exception $e) {
echo $e, "\n\n";
}
function gen3() {
echo "in generator\n";
if (false) yield;
}
$gen = gen3();
$gen->rewind();
?>
--EXPECTF--
before yield
after yield
exception 'Exception' with message 'Cannot rewind a generator that was already run' in %s:%d
Stack trace:
#0 %s(%d): Generator->rewind()
#1 {main}
exception 'Exception' with message 'Cannot traverse an already closed generator' in %s:%d
Stack trace:
#0 %s(%d): unknown()
#1 {main}
in generator