From 4f072ac04eec9da78fdc2e6b2635fbf53567b29f Mon Sep 17 00:00:00 2001 From: Ankit-cs Date: Fri, 16 Oct 2026 10:32:42 +0530 Subject: [PATCH 1/2] fix(#710): expand allocator support in specialization.rs --- src/allocator/global.rs | 2 +- src/lib.rs | 30 +++++++++++++++++------------- src/specialization.rs | 20 ++++++++++++++------ 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/allocator/global.rs b/src/allocator/global.rs index 67af50c6..381bce1b 100644 --- a/src/allocator/global.rs +++ b/src/allocator/global.rs @@ -1,5 +1,5 @@ #[cfg(not(feature = "allocator-api"))] -#[derive(Clone)] +#[derive(Clone, Copy, Default)] pub struct Global; #[cfg(all(feature = "allocator-api", not(feature = "allocator-api2")))] pub use alloc::alloc::Global; diff --git a/src/lib.rs b/src/lib.rs index a1e4bae5..142962d1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -116,10 +116,12 @@ unsafe impl Sync { } -impl Default for SmallVec { +impl Default + for SmallVec +{ #[inline] fn default() -> Self { - Self::new() + Self::new_in(Heap::default()) } } @@ -1551,7 +1553,7 @@ pub fn from_elem( /// Fallback functions for various specialized methods. These are kept in /// a separate implementation block for easy access whenever specialization is /// disabled. -impl SmallVec { +impl SmallVec { /// Creates a `Smallvec` value where `elem` is repeated `n` times. /// This will use the inline storage, not the heap. /// @@ -1560,7 +1562,7 @@ impl SmallVec { /// The caller must ensure that `n <= Self::inline_size()`. unsafe fn from_elem_fallback(elem: Item, n: usize) -> Self where Item: Clone { - let mut result = Self::new(); + let mut result = Self::new_in(Heap::default()); if n > 0 { let ptr = result.raw.as_mut_ptr_inline(); @@ -1590,14 +1592,6 @@ impl SmallVec { result } - fn from_iter_fallback(iter: I) -> Self - where I: Iterator { - let (size, _) = iter.size_hint(); - let mut v = Self::with_capacity(size); - v.extend_fallback(iter); - v - } - /// Creates a `SmallVec` value based on the contents of `slice`. /// This will use the inline storage, not the heap. /// @@ -1606,7 +1600,7 @@ impl SmallVec { /// The caller must ensure that `slice.len() <= Self::inline_size()`. unsafe fn from_slice_fallback(slice: &[Item]) -> Self where Item: Clone { - let mut v = Self::new(); + let mut v = Self::new_in(Heap::default()); let source = slice.as_ptr(); let length = slice.len(); @@ -1636,6 +1630,16 @@ impl SmallVec { } } +impl SmallVec { + fn from_iter_fallback(iter: I) -> Self + where I: Iterator { + let (size, _) = iter.size_hint(); + let mut v = Self::with_capacity(size); + v.extend_fallback(iter); + v + } +} + impl SmallVec { fn extend_fallback(&mut self, iter: I) where I: IntoIterator { diff --git a/src/specialization.rs b/src/specialization.rs index ced0487f..0b7f1543 100644 --- a/src/specialization.rs +++ b/src/specialization.rs @@ -22,7 +22,9 @@ pub trait SpecFromElem { unsafe fn spec_from_elem(elem: Item, n: usize) -> Self; } -impl SpecFromElem for SmallVec { +impl SpecFromElem + for SmallVec +{ #[inline] default unsafe fn spec_from_elem(elem: Item, n: usize) -> Self { // SAFETY: Safety conditions are identical. @@ -30,9 +32,11 @@ impl SpecFromElem for SmallVec SpecFromElem for SmallVec { +impl SpecFromElem + for SmallVec +{ unsafe fn spec_from_elem(elem: Item, n: usize) -> Self { - let mut result = Self::new(); + let mut result = Self::new_in(Heap::default()); if n > 0 { let ptr = result.raw.as_mut_ptr_inline(); @@ -298,16 +302,20 @@ pub trait SpecFromSlice { unsafe fn spec_from(slice: &[Item]) -> Self; } -impl SpecFromSlice for SmallVec { +impl SpecFromSlice + for SmallVec +{ default unsafe fn spec_from(slice: &[Item]) -> Self { // SAFETY: Safety conditions are identical. unsafe { Self::from_slice_fallback(slice) } } } -impl SpecFromSlice for SmallVec { +impl SpecFromSlice + for SmallVec +{ unsafe fn spec_from(slice: &[Item]) -> Self { - let mut v = Self::new(); + let mut v = Self::new_in(Heap::default()); let source = slice.as_ptr(); let length = slice.len(); From 751df214b111f59bedf8b914abece1fca015c09d Mon Sep 17 00:00:00 2001 From: Ankit-cs Date: Fri, 16 Oct 2026 19:07:23 +0530 Subject: [PATCH 2/2] fix(#710): address review feedback, revert Global allocator specialization --- src/allocator/global.rs | 2 +- src/lib.rs | 30 +++++++++++++----------------- src/specialization.rs | 20 ++++++-------------- 3 files changed, 20 insertions(+), 32 deletions(-) diff --git a/src/allocator/global.rs b/src/allocator/global.rs index 381bce1b..67af50c6 100644 --- a/src/allocator/global.rs +++ b/src/allocator/global.rs @@ -1,5 +1,5 @@ #[cfg(not(feature = "allocator-api"))] -#[derive(Clone, Copy, Default)] +#[derive(Clone)] pub struct Global; #[cfg(all(feature = "allocator-api", not(feature = "allocator-api2")))] pub use alloc::alloc::Global; diff --git a/src/lib.rs b/src/lib.rs index 142962d1..a1e4bae5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -116,12 +116,10 @@ unsafe impl Sync { } -impl Default - for SmallVec -{ +impl Default for SmallVec { #[inline] fn default() -> Self { - Self::new_in(Heap::default()) + Self::new() } } @@ -1553,7 +1551,7 @@ pub fn from_elem( /// Fallback functions for various specialized methods. These are kept in /// a separate implementation block for easy access whenever specialization is /// disabled. -impl SmallVec { +impl SmallVec { /// Creates a `Smallvec` value where `elem` is repeated `n` times. /// This will use the inline storage, not the heap. /// @@ -1562,7 +1560,7 @@ impl SmallVec Self where Item: Clone { - let mut result = Self::new_in(Heap::default()); + let mut result = Self::new(); if n > 0 { let ptr = result.raw.as_mut_ptr_inline(); @@ -1592,6 +1590,14 @@ impl SmallVec(iter: I) -> Self + where I: Iterator { + let (size, _) = iter.size_hint(); + let mut v = Self::with_capacity(size); + v.extend_fallback(iter); + v + } + /// Creates a `SmallVec` value based on the contents of `slice`. /// This will use the inline storage, not the heap. /// @@ -1600,7 +1606,7 @@ impl SmallVec Self where Item: Clone { - let mut v = Self::new_in(Heap::default()); + let mut v = Self::new(); let source = slice.as_ptr(); let length = slice.len(); @@ -1630,16 +1636,6 @@ impl SmallVec SmallVec { - fn from_iter_fallback(iter: I) -> Self - where I: Iterator { - let (size, _) = iter.size_hint(); - let mut v = Self::with_capacity(size); - v.extend_fallback(iter); - v - } -} - impl SmallVec { fn extend_fallback(&mut self, iter: I) where I: IntoIterator { diff --git a/src/specialization.rs b/src/specialization.rs index 0b7f1543..ced0487f 100644 --- a/src/specialization.rs +++ b/src/specialization.rs @@ -22,9 +22,7 @@ pub trait SpecFromElem { unsafe fn spec_from_elem(elem: Item, n: usize) -> Self; } -impl SpecFromElem - for SmallVec -{ +impl SpecFromElem for SmallVec { #[inline] default unsafe fn spec_from_elem(elem: Item, n: usize) -> Self { // SAFETY: Safety conditions are identical. @@ -32,11 +30,9 @@ impl SpecFromElem SpecFromElem - for SmallVec -{ +impl SpecFromElem for SmallVec { unsafe fn spec_from_elem(elem: Item, n: usize) -> Self { - let mut result = Self::new_in(Heap::default()); + let mut result = Self::new(); if n > 0 { let ptr = result.raw.as_mut_ptr_inline(); @@ -302,20 +298,16 @@ pub trait SpecFromSlice { unsafe fn spec_from(slice: &[Item]) -> Self; } -impl SpecFromSlice - for SmallVec -{ +impl SpecFromSlice for SmallVec { default unsafe fn spec_from(slice: &[Item]) -> Self { // SAFETY: Safety conditions are identical. unsafe { Self::from_slice_fallback(slice) } } } -impl SpecFromSlice - for SmallVec -{ +impl SpecFromSlice for SmallVec { unsafe fn spec_from(slice: &[Item]) -> Self { - let mut v = Self::new_in(Heap::default()); + let mut v = Self::new(); let source = slice.as_ptr(); let length = slice.len();