Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 15 additions & 19 deletions src/Analyser/Fiber/FiberNodeScopeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ private function runFiberForNodeCallback(

protected function processPendingFibers(ExpressionResultStorage $storage): void
{
start:

foreach ($storage->pendingFibers as $pending) {
$request = $pending['request'];
$beforeScope = $storage->findBeforeScope($request->expr);
Expand All @@ -99,36 +101,30 @@ protected function processPendingFibers(ExpressionResultStorage $storage): void
if ($storage->findBeforeScope($request->expr) === null) {
throw new ShouldNotHappenException(sprintf('processExprNode should have stored the beforeScope of %s on line %s', get_class($request->expr), $request->expr->getStartLine()));
}
$this->processPendingFibers($storage);

// Break and restart the loop since the array may have been modified
return;
goto start;
}
}

protected function processPendingFibersForRequestedExpr(ExpressionResultStorage $storage, Expr $expr, Scope $result): void
{
$restartLoop = true;

while ($restartLoop) {
$restartLoop = false;
start:

foreach ($storage->pendingFibers as $key => $pending) {
$request = $pending['request'];
if ($request->expr !== $expr) {
continue;
}
foreach ($storage->pendingFibers as $key => $pending) {
$request = $pending['request'];
if ($request->expr !== $expr) {
continue;
}

unset($storage->pendingFibers[$key]);
$restartLoop = true;
unset($storage->pendingFibers[$key]);

$fiber = $pending['fiber'];
$request = $fiber->resume($result);
$this->runFiberForNodeCallback($storage, $fiber, $request);
$fiber = $pending['fiber'];
$request = $fiber->resume($result);
$this->runFiberForNodeCallback($storage, $fiber, $request);

// Break and restart the loop since the array may have been modified
break;
}
// Break and restart the loop since the array may have been modified
goto start;
}
}

Expand Down
Loading