On Wed, Aug 14, 2024 at 10:42:28AM +0200, Alice Ryhl wrote: > > +#[macro_export] > > +macro_rules! kvec { > > + () => ( > > + { > > + $crate::alloc::KVec::new() > > + } > > + ); > > + ($elem:expr; $n:expr) => ( > > + { > > + $crate::alloc::KVec::from_elem($elem, $n, GFP_KERNEL) > > + } > > + ); > > + ($($x:expr),+ $(,)?) => ( > > + { > > + match $crate::alloc::KBox::new([$($x),+], GFP_KERNEL) { > > + Ok(b) => Ok($crate::alloc::KBox::into_vec(b)), > > + Err(e) => Err(e), > > Hmm. This currently generates code that: > > 1. Creates the array. > 2. Allocates the memory. > 3. Moves the array into the box. > > Whereas the stdlib macro swaps step 1 and 2. Isn't stdlib [1] doing the same thing I do? [1] https://doc.rust-lang.org/1.80.1/src/alloc/macros.rs.html#49 > You can do the same by utilizing new_uninit. A sketch: > > match KBox::<[_; _]>::new_uninit(GFP_KERNEL) { How do we get the size here? `#![feature(generic_arg_infer)]` seems to be unstable. > Ok(b) => Ok(KVec::from(KBox::write(b, [$($x),+]))), > Err(e) => Err(e), > }