@@ -750,22 +750,30 @@ impl<A: Array> SmallVec<A> {
750
750
self . data = SmallVecData :: from_inline ( MaybeUninit :: uninit ( ) ) ;
751
751
ptr:: copy_nonoverlapping ( ptr, self . data . inline_mut ( ) , len) ;
752
752
self . capacity = len;
753
+ deallocate ( ptr, cap) ;
753
754
} else if new_cap != cap {
754
755
let layout = layout_array :: < A :: Item > ( new_cap) ?;
755
- let new_alloc = NonNull :: new ( alloc:: alloc:: alloc ( layout) )
756
- . ok_or ( CollectionAllocErr :: AllocErr { layout } ) ?
757
- . cast ( )
758
- . as_ptr ( ) ;
759
- ptr:: copy_nonoverlapping ( ptr, new_alloc, len) ;
760
- self . data = SmallVecData :: from_heap ( new_alloc, len) ;
761
- self . capacity = new_cap;
756
+ let new_alloc;
762
757
if unspilled {
763
- return Ok ( ( ) ) ;
758
+ new_alloc = NonNull :: new ( alloc:: alloc:: alloc ( layout) )
759
+ . ok_or ( CollectionAllocErr :: AllocErr { layout } ) ?
760
+ . cast ( )
761
+ . as_ptr ( ) ;
762
+ ptr:: copy_nonoverlapping ( ptr, new_alloc, len) ;
763
+ } else {
764
+ // This should never fail since the same succeeded
765
+ // when previously allocating `ptr`.
766
+ let old_layout = layout_array :: < A :: Item > ( cap) ?;
767
+
768
+ let new_ptr = alloc:: alloc:: realloc ( ptr as * mut u8 , old_layout, layout. size ( ) ) ;
769
+ new_alloc = NonNull :: new ( new_ptr)
770
+ . ok_or ( CollectionAllocErr :: AllocErr { layout } ) ?
771
+ . cast ( )
772
+ . as_ptr ( ) ;
764
773
}
765
- } else {
766
- return Ok ( ( ) ) ;
774
+ self . data = SmallVecData :: from_heap ( new_alloc , len ) ;
775
+ self . capacity = new_cap ;
767
776
}
768
- deallocate ( ptr, cap) ;
769
777
Ok ( ( ) )
770
778
}
771
779
}
0 commit comments