diff --git a/src/Analyser/Fiber/FiberNodeScopeResolver.php b/src/Analyser/Fiber/FiberNodeScopeResolver.php index 2236f3237f..aebb3328ce 100644 --- a/src/Analyser/Fiber/FiberNodeScopeResolver.php +++ b/src/Analyser/Fiber/FiberNodeScopeResolver.php @@ -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); @@ -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; } }