Message ID | 20240816001216.26575-24-dakr@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Generic `Allocator` support for Rust | expand |
On 16.08.24 02:11, Danilo Krummrich wrote: > The current implementation of tests in str.rs use `format!` to format > strings for comparison, which, internally, creates a new `String`. > > In order to prepare for getting rid of Rust's alloc crate, we have to > cut this dependency. Instead, implement `format!` for `CString`. > > Note that for userspace tests, `Kmalloc`, which is backing `CString`'s > memory, is just a type alias to `Cmalloc`. > > Reviewed-by: Alice Ryhl <aliceryhl@google.com> > Signed-off-by: Danilo Krummrich <dakr@kernel.org> Reviewed-by: Benno Lossin <benno.lossin@proton.me> --- Cheers, Benno > --- > rust/kernel/str.rs | 23 ++++++++++++++++++++++- > 1 file changed, 22 insertions(+), 1 deletion(-) > > diff --git a/rust/kernel/str.rs b/rust/kernel/str.rs > index 209ad1bb1a49..726329530338 100644 > --- a/rust/kernel/str.rs > +++ b/rust/kernel/str.rs > @@ -523,7 +523,28 @@ macro_rules! c_str { > #[cfg(test)] > mod tests { > use super::*; > - use alloc::format; > + > + struct String(CString); > + > + impl String { > + fn from_fmt(args: fmt::Arguments<'_>) -> Self { > + String(CString::try_from_fmt(args).unwrap()) > + } > + } > + > + impl Deref for String { > + type Target = str; > + > + fn deref(&self) -> &str { > + self.0.to_str().unwrap() > + } > + } > + > + macro_rules! format { > + ($($f:tt)*) => ({ > + &*String::from_fmt(kernel::fmt!($($f)*)) > + }) > + } > > const ALL_ASCII_CHARS: &'static str = > "\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\ > -- > 2.46.0 >
diff --git a/rust/kernel/str.rs b/rust/kernel/str.rs index 209ad1bb1a49..726329530338 100644 --- a/rust/kernel/str.rs +++ b/rust/kernel/str.rs @@ -523,7 +523,28 @@ macro_rules! c_str { #[cfg(test)] mod tests { use super::*; - use alloc::format; + + struct String(CString); + + impl String { + fn from_fmt(args: fmt::Arguments<'_>) -> Self { + String(CString::try_from_fmt(args).unwrap()) + } + } + + impl Deref for String { + type Target = str; + + fn deref(&self) -> &str { + self.0.to_str().unwrap() + } + } + + macro_rules! format { + ($($f:tt)*) => ({ + &*String::from_fmt(kernel::fmt!($($f)*)) + }) + } const ALL_ASCII_CHARS: &'static str = "\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\