@@ -2480,21 +2480,26 @@ function readableStreamDefaultControllerClose(controller) {
24802480}
24812481
24822482function readableStreamDefaultControllerEnqueue ( controller , chunk ) {
2483- if ( ! readableStreamDefaultControllerCanCloseOrEnqueue ( controller ) )
2483+ // Equivalent to readableStreamDefaultControllerCanCloseOrEnqueue()
2484+ // followed by isReadableStreamLocked() and
2485+ // readableStreamGetNumReadRequests(), but with the state loaded once:
2486+ // this runs for every enqueued chunk.
2487+ const controllerState = controller [ kState ] ;
2488+ const stream = controllerState . stream ;
2489+ if ( controllerState . closeRequested || stream [ kState ] . state !== 'readable' )
24842490 return ;
24852491
2486- const {
2487- stream,
2488- } = controller [ kState ] ;
2489-
2490- if ( isReadableStreamLocked ( stream ) &&
2491- readableStreamGetNumReadRequests ( stream ) ) {
2492+ const reader = stream [ kState ] . reader ;
2493+ if ( reader !== undefined &&
2494+ reader [ kState ] !== undefined &&
2495+ reader [ kType ] === 'ReadableStreamDefaultReader' &&
2496+ reader [ kState ] . readRequests . length ) {
24922497 readableStreamFulfillReadRequest ( stream , chunk , false ) ;
24932498 } else {
24942499 try {
24952500 const chunkSize =
24962501 FunctionPrototypeCall (
2497- controller [ kState ] . sizeAlgorithm ,
2502+ controllerState . sizeAlgorithm ,
24982503 undefined ,
24992504 chunk ) ;
25002505 enqueueValueWithSize ( controller , chunk , chunkSize ) ;
@@ -2533,22 +2538,27 @@ function readableStreamDefaultControllerGetDesiredSize(controller) {
25332538}
25342539
25352540function readableStreamDefaultControllerShouldCallPull ( controller ) {
2536- const {
2537- stream,
2538- } = controller [ kState ] ;
2539- if ( ! readableStreamDefaultControllerCanCloseOrEnqueue ( controller ) ||
2540- ! controller [ kState ] . started )
2541+ // Single-pass version of the spec's predicate chain (CanCloseOrEnqueue,
2542+ // IsLocked, HasDefaultReader, GetNumReadRequests, GetDesiredSize): this
2543+ // runs at least once per chunk on every default-stream path. The
2544+ // desired-size computation is inlined because the stream state is
2545+ // already known to be 'readable' here.
2546+ const controllerState = controller [ kState ] ;
2547+ const stream = controllerState . stream ;
2548+ if ( controllerState . closeRequested ||
2549+ stream [ kState ] . state !== 'readable' ||
2550+ ! controllerState . started )
25412551 return false ;
25422552
2543- if ( isReadableStreamLocked ( stream ) &&
2544- readableStreamGetNumReadRequests ( stream ) ) {
2553+ const reader = stream [ kState ] . reader ;
2554+ if ( reader !== undefined &&
2555+ reader [ kState ] !== undefined &&
2556+ reader [ kType ] === 'ReadableStreamDefaultReader' &&
2557+ reader [ kState ] . readRequests . length ) {
25452558 return true ;
25462559 }
25472560
2548- const desiredSize = readableStreamDefaultControllerGetDesiredSize ( controller ) ;
2549- assert ( desiredSize !== null ) ;
2550-
2551- return desiredSize > 0 ;
2561+ return controllerState . highWaterMark - controllerState . queueTotalSize > 0 ;
25522562}
25532563
25542564function readableStreamDefaultControllerCallPullIfNeeded ( controller ) {
@@ -2798,28 +2808,29 @@ function readableByteStreamControllerGetDesiredSize(controller) {
27982808}
27992809
28002810function readableByteStreamControllerShouldCallPull ( controller ) {
2801- const {
2802- stream,
2803- } = controller [ kState ] ;
2811+ // Single-pass version of the spec's predicate chain (HasDefaultReader,
2812+ // GetNumReadRequests, HasBYOBReader, GetNumReadIntoRequests,
2813+ // GetDesiredSize): this runs at least once per chunk on every byte
2814+ // stream path. The desired-size computation is inlined because the
2815+ // stream state is already known to be 'readable' here.
2816+ const controllerState = controller [ kState ] ;
2817+ const stream = controllerState . stream ;
28042818 if ( stream [ kState ] . state !== 'readable' ||
2805- controller [ kState ] . closeRequested ||
2806- ! controller [ kState ] . started ) {
2819+ controllerState . closeRequested ||
2820+ ! controllerState . started ) {
28072821 return false ;
28082822 }
2809- if ( readableStreamHasDefaultReader ( stream ) &&
2810- readableStreamGetNumReadRequests ( stream ) > 0 ) {
2811- return true ;
2812- }
2813-
2814- if ( readableStreamHasBYOBReader ( stream ) &&
2815- readableStreamGetNumReadIntoRequests ( stream ) > 0 ) {
2816- return true ;
2823+ const reader = stream [ kState ] . reader ;
2824+ if ( reader !== undefined && reader [ kState ] !== undefined ) {
2825+ const type = reader [ kType ] ;
2826+ if ( type === 'ReadableStreamDefaultReader' ) {
2827+ if ( reader [ kState ] . readRequests . length ) return true ;
2828+ } else if ( type === 'ReadableStreamBYOBReader' ) {
2829+ if ( reader [ kState ] . readIntoRequests . length ) return true ;
2830+ }
28172831 }
28182832
2819- const desiredSize = readableByteStreamControllerGetDesiredSize ( controller ) ;
2820- assert ( desiredSize !== null ) ;
2821-
2822- return desiredSize > 0 ;
2833+ return controllerState . highWaterMark - controllerState . queueTotalSize > 0 ;
28232834}
28242835
28252836function readableByteStreamControllerHandleQueueDrain ( controller ) {
0 commit comments