Skip to content

Commit bdfc429

Browse files
committed
Use realloc when possible
1 parent 62a3622 commit bdfc429

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

lib.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -750,22 +750,30 @@ impl<A: Array> SmallVec<A> {
750750
self.data = SmallVecData::from_inline(MaybeUninit::uninit());
751751
ptr::copy_nonoverlapping(ptr, self.data.inline_mut(), len);
752752
self.capacity = len;
753+
deallocate(ptr, cap);
753754
} else if new_cap != cap {
754755
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;
762757
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();
764773
}
765-
} else {
766-
return Ok(());
774+
self.data = SmallVecData::from_heap(new_alloc, len);
775+
self.capacity = new_cap;
767776
}
768-
deallocate(ptr, cap);
769777
Ok(())
770778
}
771779
}

0 commit comments

Comments
 (0)