Skip to content

Commit b0c1761

Browse files
authored
Auto merge of #335 - nicoburns:encapsulate-unsafe-in-macro, r=SimonSapin
Encapsulate unsafe in `_cssparser_internal_to_lowercase` macro # Objective - Allow the `_cssparser_internal_to_lowercase` macro to be used in crates that set `#[forbid(unsafe)]`. - Document the safety invariant for this unsafe block ## Changes made - Wrap the `unsafe` block in the `_cssparser_internal_to_lowercase` macro in an `#[inline(always)]` function. - Add comments ## Context - DioxusLabs/taffy#460 (comment)
2 parents 3e1bd05 + 39ea1b0 commit b0c1761

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

src/lib.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ pub use crate::color::{
7575
pub use crate::cow_rc_str::CowRcStr;
7676
pub use crate::from_bytes::{stylesheet_encoding, EncodingSupport};
7777
#[doc(hidden)]
78-
pub use crate::macros::_cssparser_internal_to_lowercase;
78+
pub use crate::macros::{
79+
_cssparser_internal_create_uninit_array, _cssparser_internal_to_lowercase,
80+
};
7981
pub use crate::nth::parse_nth;
8082
pub use crate::parser::{BasicParseError, BasicParseErrorKind, ParseError, ParseErrorKind};
8183
pub use crate::parser::{Delimiter, Delimiters, Parser, ParserInput, ParserState};

src/macros.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,16 @@ macro_rules! ascii_case_insensitive_phf_map {
110110
}
111111
}
112112

113+
/// Create a new array of MaybeUninit<T> items, in an uninitialized state.
114+
#[inline(always)]
115+
pub fn _cssparser_internal_create_uninit_array<const N: usize>() -> [MaybeUninit<u8>; N] {
116+
unsafe {
117+
// SAFETY: An uninitialized `[MaybeUninit<_>; LEN]` is valid.
118+
// See: https://doc.rust-lang.org/stable/core/mem/union.MaybeUninit.html#method.uninit_array
119+
MaybeUninit::<[MaybeUninit<u8>; N]>::uninit().assume_init()
120+
}
121+
}
122+
113123
/// Implementation detail of match_ignore_ascii_case! and ascii_case_insensitive_phf_map! macros.
114124
///
115125
/// **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 {
121131
#[doc(hidden)]
122132
macro_rules! _cssparser_internal_to_lowercase {
123133
($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-
};
134+
let mut buffer = $crate::_cssparser_internal_create_uninit_array::<{ $BUFFER_SIZE }>();
129135
let input: &str = $input;
130136
let $output = $crate::_cssparser_internal_to_lowercase(&mut buffer, input);
131137
};

0 commit comments

Comments
 (0)