@@ -492,15 +492,13 @@ impl<'a, 'b> Serialize for DisplayItemRef<'a, 'b> {
492
492
// }
493
493
//
494
494
495
- struct UnsafeVecWriter < ' a > ( & ' a mut Vec < u8 > ) ;
495
+ struct UnsafeVecWriter ( * mut u8 ) ;
496
496
497
- impl < ' a > Write for UnsafeVecWriter < ' a > {
497
+ impl Write for UnsafeVecWriter {
498
498
fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
499
499
unsafe {
500
- let old_len = self . 0 . len ( ) ;
501
- self . 0 . set_len ( old_len + buf. len ( ) ) ;
502
- debug_assert ! ( self . 0 . len( ) <= self . 0 . capacity( ) ) ;
503
- ptr:: copy_nonoverlapping ( buf. as_ptr ( ) , self . 0 . as_mut_ptr ( ) . offset ( old_len as isize ) , buf. len ( ) ) ;
500
+ ptr:: copy_nonoverlapping ( buf. as_ptr ( ) , self . 0 , buf. len ( ) ) ;
501
+ self . 0 = self . 0 . offset ( buf. len ( ) as isize ) ;
504
502
}
505
503
Ok ( buf. len ( ) )
506
504
}
@@ -523,7 +521,16 @@ fn serialize_fast<T: Serialize>(vec: &mut Vec<u8>, e: &T) {
523
521
bincode:: serialize_into ( & mut size, e , bincode:: Infinite ) . unwrap ( ) ;
524
522
vec. reserve ( size. 0 ) ;
525
523
526
- bincode:: serialize_into ( & mut UnsafeVecWriter ( vec) , e, bincode:: Infinite ) . unwrap ( ) ;
524
+ let old_len = vec. len ( ) ;
525
+ let ptr = unsafe { vec. as_mut_ptr ( ) . offset ( old_len as isize ) } ;
526
+ let mut w = UnsafeVecWriter ( ptr) ;
527
+ bincode:: serialize_into ( & mut w, e, bincode:: Infinite ) . unwrap ( ) ;
528
+
529
+ // fix up the length
530
+ unsafe { vec. set_len ( old_len + size. 0 ) ; }
531
+
532
+ // make sure we wrote the right amount
533
+ debug_assert ! ( ( ( w. 0 as usize ) - ( vec. as_ptr( ) as usize ) ) == vec. len( ) ) ;
527
534
}
528
535
529
536
#[ derive( Clone ) ]
0 commit comments