Skip to content

Commit e74da56

Browse files
committed
Call pending fibers about the analysed expr right after analyseExpr
1 parent 4384cea commit e74da56

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

src/Analyser/Generator/GeneratorNodeScopeResolver.php

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private function runTrampoline(
204204
} elseif ($yielded instanceof ExprAnalysisRequest) {
205205
$stack[] = $gen;
206206
$gen = new IdentifiedGeneratorInStack(
207-
$this->analyseExpr($exprAnalysisResultStorage, $yielded->stmt, $yielded->expr, $yielded->scope, $yielded->context, $yielded->alternativeNodeCallback, $stack, $yielded->originFile, $yielded->originLine),
207+
$this->analyseExpr($fibersStorage, $exprAnalysisResultStorage, $yielded->stmt, $yielded->expr, $yielded->scope, $yielded->context, $yielded->alternativeNodeCallback, $stack, $yielded->originFile, $yielded->originLine),
208208
$yielded->expr,
209209
$yielded->originFile,
210210
$yielded->originLine,
@@ -292,7 +292,7 @@ private function runTrampoline(
292292

293293
$stack[] = $gen;
294294
$gen = new IdentifiedGeneratorInStack(
295-
$this->analyseExpr($exprAnalysisResultStorage, $request->stmt, $request->expr, $request->scope, $request->context, $request->alternativeNodeCallback, $stack, $request->originFile, $request->originLine),
295+
$this->analyseExpr(null, $exprAnalysisResultStorage, $request->stmt, $request->expr, $request->scope, $request->context, $request->alternativeNodeCallback, $stack, $request->originFile, $request->originLine),
296296
$request->expr,
297297
$request->originFile,
298298
$request->originLine,
@@ -421,7 +421,7 @@ private function runInFiber(callable $callback): Generator
421421
* @param list<IdentifiedGeneratorInStack> $stack
422422
* @return Generator<int, GeneratorTValueType, GeneratorTSendType, ExprAnalysisResult>
423423
*/
424-
private function analyseExpr(ExprAnalysisResultStorage $storage, Stmt $stmt, Expr $expr, GeneratorScope $scope, ExpressionContext $context, ?callable $alternativeNodeCallback, array $stack, ?string $file, ?int $line): Generator
424+
private function analyseExpr(?PendingFibersStorage $fibersStorage, ExprAnalysisResultStorage $storage, Stmt $stmt, Expr $expr, GeneratorScope $scope, ExpressionContext $context, ?callable $alternativeNodeCallback, array $stack, ?string $file, ?int $line): Generator
425425
{
426426
$foundExprAnalysisResult = $storage->findExprAnalysisResult($expr);
427427
if ($foundExprAnalysisResult !== null) {
@@ -459,7 +459,7 @@ private function analyseExpr(ExprAnalysisResultStorage $storage, Stmt $stmt, Exp
459459
throw new ShouldNotHappenException();
460460
}
461461

462-
$exprGen = $this->analyseExpr($storage, $stmt, $newExpr, $scope, $context, $alternativeNodeCallback, $stack, $file, $line);
462+
$exprGen = $this->analyseExpr($fibersStorage, $storage, $stmt, $newExpr, $scope, $context, $alternativeNodeCallback, $stack, $file, $line);
463463
yield from $exprGen;
464464

465465
return $exprGen->getReturn();
@@ -481,6 +481,10 @@ private function analyseExpr(ExprAnalysisResultStorage $storage, Stmt $stmt, Exp
481481
$exprAnalysisResult = $gen->getReturn();
482482
$storage->storeExprAnalysisResult($expr, $exprAnalysisResult, $stack, $file, $line);
483483

484+
if ($fibersStorage !== null) {
485+
yield from $this->processPendingFibersForRequestedExpr($fibersStorage, $storage, $expr, $exprAnalysisResult);
486+
}
487+
484488
return $exprAnalysisResult;
485489
}
486490

@@ -598,4 +602,33 @@ private function processPendingFibers(PendingFibersStorage $fibersStorage, ExprA
598602
}
599603
}
600604

605+
/**
606+
* @return Generator<int, GeneratorTValueType, GeneratorTSendType, void>
607+
*/
608+
private function processPendingFibersForRequestedExpr(PendingFibersStorage $fibersStorage, ExprAnalysisResultStorage $exprAnalysisResultStorage, Expr $expr, ExprAnalysisResult $result): Generator
609+
{
610+
$restartLoop = true;
611+
612+
while ($restartLoop) {
613+
$restartLoop = false;
614+
615+
foreach ($fibersStorage->pendingFibers as $key => $pending) {
616+
$request = $pending['request'];
617+
if ($request->expr !== $expr) {
618+
continue;
619+
}
620+
621+
unset($fibersStorage->pendingFibers[$key]);
622+
$restartLoop = true;
623+
624+
$fiber = $pending['fiber'];
625+
$request = $fiber->resume($result);
626+
yield from $this->runFiberForNodeCallback($fibersStorage, $exprAnalysisResultStorage, $fiber, $request);
627+
628+
// Break and restart the loop since the array may have been modified
629+
break;
630+
}
631+
}
632+
}
633+
601634
}

0 commit comments

Comments
 (0)