diff --git a/Cargo.toml b/Cargo.toml index 220f8b2..f77070f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "smallvec" -version = "2.0.0-alpha.9" +version = "2.0.0-alpha.10" edition = "2021" rust-version = "1.57" authors = ["The Servo Project Developers"] diff --git a/src/lib.rs b/src/lib.rs index 42c04c3..37c2123 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -500,6 +500,11 @@ pub struct IntoIter { _marker: PhantomData, } +// SAFETY: IntoIter has unique ownership of its contents. Sending (or sharing) an `IntoIter` +// is equivalent to sending (or sharing) a `SmallVec`. +unsafe impl Send for IntoIter where T: Send {} +unsafe impl Sync for IntoIter where T: Sync {} + impl IntoIter { #[inline] const fn is_zst() -> bool { @@ -1502,11 +1507,11 @@ impl SmallVec { let mut iter = iter.fuse(); let (lower_bound, _) = iter.size_hint(); self.reserve(lower_bound); - let mut len = self.len(); let mut capacity = self.capacity(); let mut ptr = self.as_mut_ptr(); unsafe { loop { + let mut len = self.len(); // SAFETY: ptr is valid for `capacity - len` writes ptr = ptr.add(len); let mut guard = DropGuard { ptr, len: 0 }; @@ -1520,7 +1525,6 @@ impl SmallVec { // At this point we either consumed all capacity or the iterator is exhausted (fused) if let Some(item) = iter.next() { self.push(item); - len += 1; } else { return; }