@@ -94,6 +94,7 @@ const {
9494  ArrayBufferViewGetByteLength, 
9595  ArrayBufferViewGetByteOffset, 
9696  AsyncIterator, 
97+   canCopyArrayBuffer, 
9798  cloneAsUint8Array, 
9899  copyArrayBuffer, 
99100  createPromiseCallback, 
@@ -2552,6 +2553,15 @@ function readableByteStreamControllerCommitPullIntoDescriptor(stream, desc) {
25522553  } 
25532554} 
25542555
2556+ function  readableByteStreamControllerCommitPullIntoDescriptors ( stream ,  descriptors )  { 
2557+   for  ( let  i  =  0 ;  i  <  descriptors . length ;  ++ i )  { 
2558+     readableByteStreamControllerCommitPullIntoDescriptor ( 
2559+       stream , 
2560+       descriptors [ i ] , 
2561+     ) ; 
2562+   } 
2563+ } 
2564+ 
25552565function  readableByteStreamControllerInvalidateBYOBRequest ( controller )  { 
25562566  if  ( controller [ kState ] . byobRequest  ===  null ) 
25572567    return ; 
@@ -2758,11 +2768,11 @@ function readableByteStreamControllerRespondInClosedState(controller, desc) {
27582768    stream, 
27592769  }  =  controller [ kState ] ; 
27602770  if  ( readableStreamHasBYOBReader ( stream ) )  { 
2761-     while  ( readableStreamGetNumReadIntoRequests ( stream )  >  0 )  { 
2762-       readableByteStreamControllerCommitPullIntoDescriptor ( 
2763-         stream , 
2764-         readableByteStreamControllerShiftPendingPullInto ( controller ) ) ; 
2771+     const  filledPullIntos  =  [ ] ; 
2772+     for  ( let  i  =  0 ;  i  <  readableStreamGetNumReadIntoRequests ( stream ) ;  ++ i )  { 
2773+       ArrayPrototypePush ( filledPullIntos ,  readableByteStreamControllerShiftPendingPullInto ( controller ) ) ; 
27652774    } 
2775+     readableByteStreamControllerCommitPullIntoDescriptors ( stream ,  filledPullIntos ) ; 
27662776  } 
27672777} 
27682778
@@ -2843,8 +2853,9 @@ function readableByteStreamControllerEnqueue(controller, chunk) {
28432853      transferredBuffer , 
28442854      byteOffset , 
28452855      byteLength ) ; 
2846-     readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue ( 
2856+     const   filledPullIntos   =   readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue ( 
28472857      controller ) ; 
2858+     readableByteStreamControllerCommitPullIntoDescriptors ( stream ,  filledPullIntos ) ; 
28482859  }  else  { 
28492860    assert ( ! isReadableStreamLocked ( stream ) ) ; 
28502861    readableByteStreamControllerEnqueueChunkToQueue ( 
@@ -2937,6 +2948,7 @@ function readableByteStreamControllerFillPullIntoDescriptorFromQueue(
29372948  const  maxAlignedBytes  =  maxBytesFilled  -  ( maxBytesFilled  %  elementSize ) ; 
29382949  let  totalBytesToCopyRemaining  =  maxBytesToCopy ; 
29392950  let  ready  =  false ; 
2951+   assert ( ! ArrayBufferPrototypeGetDetached ( buffer ) ) ; 
29402952  assert ( bytesFilled  <  minimumFill ) ; 
29412953  if  ( maxAlignedBytes  >=  minimumFill )  { 
29422954    totalBytesToCopyRemaining  =  maxAlignedBytes  -  bytesFilled ; 
@@ -2952,12 +2964,12 @@ function readableByteStreamControllerFillPullIntoDescriptorFromQueue(
29522964      totalBytesToCopyRemaining , 
29532965      headOfQueue . byteLength ) ; 
29542966    const  destStart  =  byteOffset  +  desc . bytesFilled ; 
2955-     const   arrayBufferByteLength   =   ArrayBufferPrototypeGetByteLength ( buffer ) ; 
2956-     if   ( arrayBufferByteLength   -   destStart   <   bytesToCopy )   { 
2957-       throw   new   ERR_INVALID_STATE . RangeError ( 
2958-          'view ArrayBuffer size is invalid' ) ; 
2959-     } 
2960-     assert ( arrayBufferByteLength   -   destStart   >=   bytesToCopy ) ; 
2967+     assert ( canCopyArrayBuffer ( 
2968+        buffer , 
2969+       destStart , 
2970+       headOfQueue . buffer , 
2971+        headOfQueue . byteOffset , 
2972+        bytesToCopy ) ) ; 
29612973    copyArrayBuffer ( 
29622974      buffer , 
29632975      destStart , 
@@ -2991,26 +3003,30 @@ function readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(
29913003  const  { 
29923004    closeRequested, 
29933005    pendingPullIntos, 
2994-     stream, 
29953006  }  =  controller [ kState ] ; 
29963007  assert ( ! closeRequested ) ; 
3008+   const  filledPullIntos  =  [ ] ; 
29973009  while  ( pendingPullIntos . length )  { 
29983010    if  ( ! controller [ kState ] . queueTotalSize ) 
2999-       return ; 
3011+       break ; 
30003012    const  desc  =  pendingPullIntos [ 0 ] ; 
30013013    if  ( readableByteStreamControllerFillPullIntoDescriptorFromQueue ( 
30023014      controller , 
30033015      desc ) )  { 
30043016      readableByteStreamControllerShiftPendingPullInto ( controller ) ; 
3005-       readableByteStreamControllerCommitPullIntoDescriptor ( stream ,  desc ) ; 
3017+       ArrayPrototypePush ( filledPullIntos ,  desc ) ; 
30063018    } 
30073019  } 
3020+   return  filledPullIntos ; 
30083021} 
30093022
30103023function  readableByteStreamControllerRespondInReadableState ( 
30113024  controller , 
30123025  bytesWritten , 
30133026  desc )  { 
3027+   const  { 
3028+     stream, 
3029+   }  =  controller [ kState ] ; 
30143030  const  { 
30153031    buffer, 
30163032    bytesFilled, 
@@ -3031,9 +3047,10 @@ function readableByteStreamControllerRespondInReadableState(
30313047      controller , 
30323048      desc , 
30333049    ) ; 
3034-     readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue ( 
3050+     const   filledPullIntos   =   readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue ( 
30353051      controller , 
30363052    ) ; 
3053+     readableByteStreamControllerCommitPullIntoDescriptors ( stream ,  filledPullIntos ) ; 
30373054    return ; 
30383055  } 
30393056
@@ -3059,10 +3076,10 @@ function readableByteStreamControllerRespondInReadableState(
30593076      ArrayBufferPrototypeGetByteLength ( remainder ) ) ; 
30603077  } 
30613078  desc . bytesFilled  -=  remainderSize ; 
3062-   readableByteStreamControllerCommitPullIntoDescriptor ( 
3063-      controller [ kState ] . stream , 
3064-      desc ) ; 
3065-   readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue ( controller ) ; 
3079+   const   filledPullIntos   =   readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue ( controller ) ; 
3080+ 
3081+   readableByteStreamControllerCommitPullIntoDescriptor ( stream ,  desc ) ; 
3082+   readableByteStreamControllerCommitPullIntoDescriptors ( stream ,   filledPullIntos ) ; 
30663083} 
30673084
30683085function  readableByteStreamControllerRespondWithNewView ( controller ,  view )  { 
0 commit comments