Skip to content

Commit 53f44a5

Browse files
committed
Fix for strange generator trampoline issue
1 parent c9d1bcf commit 53f44a5

File tree

3 files changed

+9
-0
lines changed

3 files changed

+9
-0
lines changed

src/Analyser/Generator/GeneratorNodeScopeResolver.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ private function runTrampoline(
182182
if ($pendingFibersGen->valid()) {
183183
$stack[] = $gen;
184184
$gen = new IdentifiedGeneratorInStack($pendingFibersGen, new Stmt\Expression(new Node\Scalar\String_('pendingFibers')), null, null);
185+
$gen->sendResultOnComplete = false;
185186
}
186187

187188
if ($gen->generator->valid()) {
@@ -293,6 +294,7 @@ private function runTrampoline(
293294
}
294295

295296
$result = $gen->generator->getReturn();
297+
$sendResult = $gen->sendResultOnComplete;
296298
if (count($stack) === 0) {
297299
foreach ($fibersStorage->pendingFibers as $pending) {
298300
$request = $pending['request'];
@@ -320,6 +322,10 @@ private function runTrampoline(
320322
}
321323

322324
$gen = array_pop($stack);
325+
if (!$sendResult) {
326+
continue;
327+
}
328+
323329
$gen->generator->send($result);
324330
}
325331
}

src/Analyser/Generator/IdentifiedGeneratorInStack.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
final class IdentifiedGeneratorInStack
1717
{
1818

19+
public bool $sendResultOnComplete = true;
20+
1921
/**
2022
* @param (
2123
* Generator<int, GeneratorTValueType, GeneratorTSendType, StmtAnalysisResult>| // analyseStmt

tests/PHPStan/Analyser/Generator/GeneratorNodeScopeResolverRuleTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ static function (Node $node, Scope $scope) {
160160
[
161161
['exit through', 666],
162162
['Called on GeneratorNodeScopeResolverRule\\Foo, arg: 1', 21],
163+
['exit through', 666],
163164
['Virtual node invoked: \'foo\', 3', 23],
164165
['Called on GeneratorNodeScopeResolverRule\\Foo, arg: \'foo\'', 23],
165166
],

0 commit comments

Comments
 (0)