diff --git a/src/lib.rs b/src/lib.rs index 2c580a61..bac46221 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -75,7 +75,9 @@ pub use crate::color::{ pub use crate::cow_rc_str::CowRcStr; pub use crate::from_bytes::{stylesheet_encoding, EncodingSupport}; #[doc(hidden)] -pub use crate::macros::_cssparser_internal_to_lowercase; +pub use crate::macros::{ + _cssparser_internal_create_uninit_array, _cssparser_internal_to_lowercase, +}; pub use crate::nth::parse_nth; pub use crate::parser::{BasicParseError, BasicParseErrorKind, ParseError, ParseErrorKind}; pub use crate::parser::{Delimiter, Delimiters, Parser, ParserInput, ParserState}; diff --git a/src/macros.rs b/src/macros.rs index 1dfacbb5..882b0bbc 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -110,6 +110,16 @@ macro_rules! ascii_case_insensitive_phf_map { } } +/// Create a new array of MaybeUninit items, in an uninitialized state. +#[inline(always)] +pub fn _cssparser_internal_create_uninit_array() -> [MaybeUninit; N] { + unsafe { + // SAFETY: An uninitialized `[MaybeUninit<_>; LEN]` is valid. + // See: https://doc.rust-lang.org/stable/core/mem/union.MaybeUninit.html#method.uninit_array + MaybeUninit::<[MaybeUninit; N]>::uninit().assume_init() + } +} + /// Implementation detail of match_ignore_ascii_case! and ascii_case_insensitive_phf_map! macros. /// /// **This macro is not part of the public API. It can change or be removed between any versions.** @@ -121,11 +131,7 @@ macro_rules! ascii_case_insensitive_phf_map { #[doc(hidden)] macro_rules! _cssparser_internal_to_lowercase { ($input: expr, $BUFFER_SIZE: expr => $output: ident) => { - #[allow(unsafe_code)] - let mut buffer = unsafe { - ::std::mem::MaybeUninit::<[::std::mem::MaybeUninit; $BUFFER_SIZE]>::uninit() - .assume_init() - }; + let mut buffer = $crate::_cssparser_internal_create_uninit_array::<{ $BUFFER_SIZE }>(); let input: &str = $input; let $output = $crate::_cssparser_internal_to_lowercase(&mut buffer, input); };