@@ -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