Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions crates/oxc_parser/src/modifiers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,22 +53,25 @@ mod modifiers {
/// Stored as a fixed-size array of start offsets indexed by [`ModifierKind`] discriminant.
/// The `kinds` bitfield tracks which entries are populated.
/// Full `Span`s are reconstructed on demand, since each modifier keyword has a fixed length.
///
/// `#[repr(C)]` to make `kinds` field first. This is preferable as it is the most commonly accessed field.
#[repr(C)]
pub struct Modifiers {
/// Bitfield of which modifier kinds are present.
kinds: ModifierKinds,
/// Start offset for each modifier, indexed by `ModifierKind` discriminant.
/// Entries whose corresponding bit is set in `kinds` are initialized, other entries may not be.
/// Therefore it is only safe to assume that `offsets[kind as usize]` is initialized if `kinds.contains(kind)`.
offsets: [MaybeUninit<u32>; ModifierKind::VARIANTS.len()],
/// Bitfield of which modifier kinds are present.
kinds: ModifierKinds,
}

impl Modifiers {
/// Create an empty set of modifiers.
#[inline]
pub const fn empty() -> Self {
Self {
offsets: [MaybeUninit::uninit(); ModifierKind::VARIANTS.len()],
kinds: ModifierKinds::none(),
offsets: [MaybeUninit::uninit(); ModifierKind::VARIANTS.len()],
}
}

Expand Down
Loading