fixing an incredible edge case

this basically only happens if the Vc oscilates between 7 and 8 elemenst

Signed-off-by: Jakub Doka <jakub.doka2@gmail.com>
This commit is contained in:
Jakub Doka 2024-12-16 14:27:23 +01:00
parent a1e692eac7
commit 04680c8b7c
No known key found for this signature in database
GPG key ID: C6E9A89936B8C143

View file

@ -381,9 +381,8 @@ impl Vc {
} }
pub fn push(&mut self, value: Nid) { pub fn push(&mut self, value: Nid) {
if let Some(layout) = self.layout() if let Some(layout) = self.layout() {
&& unsafe { self.alloced.len == self.alloced.cap } if unsafe { self.alloced.len == self.alloced.cap } {
{
unsafe { unsafe {
self.alloced.cap *= 2; self.alloced.cap *= 2;
self.alloced.base = Unique::new_unchecked( self.alloced.base = Unique::new_unchecked(
@ -395,11 +394,13 @@ impl Vc {
.cast(), .cast(),
); );
} }
}
} else if self.len() == INLINE_ELEMS { } else if self.len() == INLINE_ELEMS {
unsafe { unsafe {
let mut allcd = let mut allcd =
Self::alloc((self.inline.cap + 1).next_power_of_two() as _, self.len()); Self::alloc((self.inline.cap + 1).next_power_of_two() as _, self.len());
core::ptr::copy_nonoverlapping(self.as_ptr(), allcd.as_mut_ptr(), self.len()); core::ptr::copy_nonoverlapping(self.as_ptr(), allcd.as_mut_ptr(), self.len());
debug_assert!(!allcd.is_inline());
*self = allcd; *self = allcd;
} }
} }