@@ -2347,7 +2347,8 @@ function visitAsyncNodeImpl(
23472347// The technique for debugging the effects of uncached data on the render is to simply uncache it.
23482348return null ;
23492349}
2350- let previousIONode = null;
2350+
2351+ let previousIONode: void | null | PromiseNode | IONode = null;
23512352 // First visit anything that blocked this sequence to start in the first place.
23522353 if (node.previous !== null) {
23532354previousIONode = visitAsyncNode (
@@ -2363,12 +2364,20 @@ function visitAsyncNodeImpl(
23632364return undefined ;
23642365}
23652366}
2367+
2368+ // `found` represents the return value of the following switch statement.
2369+ // We can't use multiple `return` statements in the switch statement
2370+ // since that prevents Closure compiler from inlining `visitAsyncImpl`
2371+ // thus doubling the call stack size.
2372+ let found : void | null | PromiseNode | IONode ;
23662373switch ( node . tag ) {
23672374case IO_NODE : {
2368- return node ;
2375+ found = node ;
2376+ break ;
23692377}
23702378 case UNRESOLVED_PROMISE_NODE: {
2371- return previousIONode ;
2379+ found = previousIONode ;
2380+ break ;
23722381}
23732382 case PROMISE_NODE: {
23742383const awaited = node . awaited ;
@@ -2379,7 +2388,8 @@ function visitAsyncNodeImpl(
23792388if ( ioNode === undefined ) {
23802389// Undefined is used as a signal that we found a suitable aborted node and we don't have to find
23812390// further aborted nodes.
2382- return undefined ;
2391+ found = undefined ;
2392+ break ;
23832393} else if ( ioNode !== null ) {
23842394// This Promise was blocked on I/O. That's a signal that this Promise is interesting to log.
23852395// We don't log it yet though. We return it to be logged by the point where it's awaited.
@@ -2436,10 +2446,12 @@ function visitAsyncNodeImpl(
24362446forwardDebugInfo ( request , task , debugInfo ) ;
24372447}
24382448}
2439- return match ;
2449+ found = match ;
2450+ break ;
24402451}
24412452case UNRESOLVED_AWAIT_NODE : {
2442- return previousIONode ;
2453+ found = previousIONode ;
2454+ break ;
24432455}
24442456 case AWAIT_NODE: {
24452457const awaited = node . awaited ;
@@ -2449,7 +2461,8 @@ function visitAsyncNodeImpl(
24492461if ( ioNode === undefined ) {
24502462// Undefined is used as a signal that we found a suitable aborted node and we don't have to find
24512463// further aborted nodes.
2452- return undefined ;
2464+ found = undefined ;
2465+ break ;
24532466} else if ( ioNode !== null ) {
24542467const startTime : number = node . start ;
24552468const endTime : number = node . end ;
@@ -2545,13 +2558,15 @@ function visitAsyncNodeImpl(
25452558forwardDebugInfo ( request , task , debugInfo ) ;
25462559}
25472560}
2548- return match ;
2561+ found = match ;
2562+ break ;
25492563}
25502564default : {
25512565// eslint-disable-next-line react-internal/prod-error-codes
25522566throw new Error ( 'Unknown AsyncSequence tag. This is a bug in React.' ) ;
25532567}
25542568}
2569+ return found ;
25552570}
25562571
25572572function emitAsyncSequence (
0 commit comments