Use boxed slices instead ovecs in decl macros

This commit is contained in:
Lukas Wirth 2023-05-02 17:04:53 +02:00
parent 3fdff0ae4b
commit 90499d4390
3 changed files with 6 additions and 6 deletions

View file

@ -79,7 +79,7 @@ fn invocation_fixtures(rules: &FxHashMap<String, DeclarativeMacro>) -> Vec<(Stri
let mut res = Vec::new(); let mut res = Vec::new();
for (name, it) in rules { for (name, it) in rules {
for rule in &it.rules { for rule in it.rules.iter() {
// Generate twice // Generate twice
for _ in 0..2 { for _ in 0..2 {
// The input are generated by filling the `Op` randomly. // The input are generated by filling the `Op` randomly.

View file

@ -104,7 +104,7 @@ impl fmt::Display for ExpandError {
/// and `$()*` have special meaning (see `Var` and `Repeat` data structures) /// and `$()*` have special meaning (see `Var` and `Repeat` data structures)
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Clone, Debug, PartialEq, Eq)]
pub struct DeclarativeMacro { pub struct DeclarativeMacro {
rules: Vec<Rule>, rules: Box<[Rule]>,
/// Highest id of the token we have in TokenMap /// Highest id of the token we have in TokenMap
shift: Shift, shift: Shift,
// This is used for correctly determining the behavior of the pat fragment // This is used for correctly determining the behavior of the pat fragment
@ -217,7 +217,7 @@ impl DeclarativeMacro {
validate(lhs)?; validate(lhs)?;
} }
Ok(DeclarativeMacro { rules, shift: Shift::new(tt), is_2021 }) Ok(DeclarativeMacro { rules: rules.into_boxed_slice(), shift: Shift::new(tt), is_2021 })
} }
/// The new, unstable `macro m {}` flavor. /// The new, unstable `macro m {}` flavor.
@ -250,7 +250,7 @@ impl DeclarativeMacro {
validate(lhs)?; validate(lhs)?;
} }
Ok(DeclarativeMacro { rules, shift: Shift::new(tt), is_2021 }) Ok(DeclarativeMacro { rules: rules.into_boxed_slice(), shift: Shift::new(tt), is_2021 })
} }
pub fn expand(&self, tt: &tt::Subtree) -> ExpandResult<tt::Subtree> { pub fn expand(&self, tt: &tt::Subtree) -> ExpandResult<tt::Subtree> {

View file

@ -20,7 +20,7 @@ use crate::{tt, tt_iter::TtIter, ParseError};
/// Stuff to the right is a [`MetaTemplate`] template which is used to produce /// Stuff to the right is a [`MetaTemplate`] template which is used to produce
/// output. /// output.
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) struct MetaTemplate(pub(crate) Vec<Op>); pub(crate) struct MetaTemplate(pub(crate) Box<[Op]>);
impl MetaTemplate { impl MetaTemplate {
pub(crate) fn parse_pattern(pattern: &tt::Subtree) -> Result<MetaTemplate, ParseError> { pub(crate) fn parse_pattern(pattern: &tt::Subtree) -> Result<MetaTemplate, ParseError> {
@ -44,7 +44,7 @@ impl MetaTemplate {
res.push(op); res.push(op);
} }
Ok(MetaTemplate(res)) Ok(MetaTemplate(res.into_boxed_slice()))
} }
} }