@@ -250,29 +250,48 @@ impl<B: ByteViewType> InProgressByteViewArray<B> {
250250 ) ;
251251 }
252252
253- // Copy the views, updating the buffer index and copying the data as needed
254- let new_views = views. iter ( ) . map ( |v| {
255- let mut b: ByteView = ByteView :: from ( * v) ;
253+ // Single-pass: rewrite views and copy string data together.
254+ // Uses a manual loop with raw pointers so all state lives in
255+ // registers (no closure captures that force reloads).
256+ let dst_ptr = dst_buffer. as_mut_ptr ( ) ;
257+ let mut dst_len = dst_buffer. len ( ) ;
258+
259+ let views_ptr = self . views . as_mut_ptr ( ) ;
260+ let mut views_len = self . views . len ( ) ;
261+ self . views . reserve ( views. len ( ) ) ;
262+
263+ for v in views {
264+ let mut b = ByteView :: from ( * v) ;
256265 if b. length > MAX_INLINE_VIEW_LEN {
257266 let buffer_index = b. buffer_index as usize ;
258267 let buffer_offset = b. offset as usize ;
259268 let str_len = b. length as usize ;
260269
261- // Update view to location in current
262- b. offset = dst_buffer. len ( ) as u32 ;
270+ b. offset = dst_len as u32 ;
263271 b. buffer_index = new_buffer_index;
264272
265- // safety: input views are validly constructed
266- let src = unsafe {
267- buffers
273+ // safety: input views are validly constructed and
274+ // dst_buffer has sufficient capacity
275+ unsafe {
276+ let src_ptr = buffers
268277 . get_unchecked ( buffer_index)
269- . get_unchecked ( buffer_offset..buffer_offset + str_len)
270- } ;
271- dst_buffer. extend_from_slice ( src) ;
278+ . as_ptr ( )
279+ . add ( buffer_offset) ;
280+ std:: ptr:: copy_nonoverlapping ( src_ptr, dst_ptr. add ( dst_len) , str_len) ;
281+ }
282+ dst_len += str_len;
283+ }
284+ // Safety: we reserved capacity above
285+ unsafe {
286+ views_ptr. add ( views_len) . write ( b. as_u128 ( ) ) ;
272287 }
273- b. as_u128 ( )
274- } ) ;
275- self . views . extend ( new_views) ;
288+ views_len += 1 ;
289+ }
290+
291+ unsafe {
292+ self . views . set_len ( views_len) ;
293+ dst_buffer. set_len ( dst_len) ;
294+ }
276295 self . current = Some ( dst_buffer) ;
277296 }
278297}
0 commit comments