@@ -196,15 +196,29 @@ const visitLoop = (
196196 restoreContextMap ( traversalMap . pop ( ) )
197197 restoreContextStore ( traversalStore . pop ( ) )
198198 }
199- }
200199
201- if ( Date . now ( ) - start > YIELD_AFTER_MS ) {
202- return true
200+ if ( Date . now ( ) - start > YIELD_AFTER_MS ) {
201+ return true
202+ }
203203 }
204204
205205 return false
206206}
207207
208+ const makeYieldFrame = (
209+ traversalChildren : AbstractElement [ ] [ ] ,
210+ traversalMap : Array < void | ContextMap > ,
211+ traversalStore : Array < void | ContextEntry >
212+ ) : Frame => ( {
213+ contextMap : getCurrentContextMap ( ) ,
214+ contextStore : getCurrentContextStore ( ) ,
215+ thenable : Promise . resolve ( ) ,
216+ kind : 'frame.yield' ,
217+ children : traversalChildren ,
218+ map : traversalMap ,
219+ store : traversalStore
220+ } )
221+
208222export const visitChildren = (
209223 init : AbstractElement [ ] ,
210224 queue : Frame [ ] ,
@@ -213,6 +227,7 @@ export const visitChildren = (
213227 const traversalChildren : AbstractElement [ ] [ ] = [ init ]
214228 const traversalMap : Array < void | ContextMap > = [ flushPrevContextMap ( ) ]
215229 const traversalStore : Array < void | ContextEntry > = [ flushPrevContextStore ( ) ]
230+
216231 const hasYielded = visitLoop (
217232 traversalChildren ,
218233 traversalMap ,
@@ -222,15 +237,9 @@ export const visitChildren = (
222237 )
223238
224239 if ( hasYielded ) {
225- queue . unshift ( {
226- contextMap : getCurrentContextMap ( ) ,
227- contextStore : getCurrentContextStore ( ) ,
228- thenable : Promise . resolve ( ) ,
229- kind : 'frame.yield' ,
230- children : traversalChildren ,
231- map : traversalMap ,
232- store : traversalStore
233- } )
240+ queue . unshift (
241+ makeYieldFrame ( traversalChildren , traversalMap , traversalStore )
242+ )
234243 }
235244}
236245
@@ -243,5 +252,15 @@ export const resumeVisitChildren = (
243252 setCurrentContextMap ( frame . contextMap )
244253 setCurrentContextStore ( frame . contextStore )
245254
246- visitLoop ( frame . children , frame . map , frame . store , queue , visitor )
255+ const hasYielded = visitLoop (
256+ frame . children ,
257+ frame . map ,
258+ frame . store ,
259+ queue ,
260+ visitor
261+ )
262+
263+ if ( hasYielded ) {
264+ queue . unshift ( makeYieldFrame ( frame . children , frame . map , frame . store ) )
265+ }
247266}
0 commit comments