Skip to content

Commit 020c5d7

Browse files
committed
Encapsulate unsafe in _cssparser_internal_to_lowercase macro
This allows it to be used in codebases with #[forbid(unsafe)]. Also document the safety invariant for the unsafe block
1 parent 3e1bd05 commit 020c5d7

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

src/macros.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,19 @@ macro_rules! ascii_case_insensitive_phf_map {
121121
#[doc(hidden)]
122122
macro_rules! _cssparser_internal_to_lowercase {
123123
($input: expr, $BUFFER_SIZE: expr => $output: ident) => {
124-
#[allow(unsafe_code)]
125-
let mut buffer = unsafe {
126-
::std::mem::MaybeUninit::<[::std::mem::MaybeUninit<u8>; $BUFFER_SIZE]>::uninit()
127-
.assume_init()
128-
};
124+
/// Create a new array of MaybeUninit<T> items, in an uninitialized state.
125+
#[inline(always)]
126+
fn create_uninit_array<const N: usize>() -> [::std::mem::MaybeUninit<u8>; N] {
127+
unsafe {
128+
// SAFETY: An uninitialized `[MaybeUninit<_>; LEN]` is valid.
129+
// See: https://doc.rust-lang.org/stable/core/mem/union.MaybeUninit.html#method.uninit_array
130+
::std::mem::MaybeUninit::<[::std::mem::MaybeUninit<u8>; N]>::uninit()
131+
.assume_init()
132+
}
133+
}
134+
135+
const BUFFER_SIZE: usize = $BUFFER_SIZE as usize;
136+
let mut buffer = create_uninit_array::<BUFFER_SIZE>();
129137
let input: &str = $input;
130138
let $output = $crate::_cssparser_internal_to_lowercase(&mut buffer, input);
131139
};

0 commit comments

Comments
 (0)