perf: Remove ErrMode overhead

This commit is contained in:
Ed Page 2025-01-30 15:05:14 -06:00
parent 60452b5a81
commit ba04a1a0fd

View file

@ -140,12 +140,13 @@ mod parser {
use winnow::stream::Stream; use winnow::stream::Stream;
use winnow::stream::StreamIsPartial; use winnow::stream::StreamIsPartial;
use winnow::token::{one_of, take_while}; use winnow::token::{one_of, take_while};
use winnow::Result;
/// Avoid worst-case parse times by limiting how much a `take_while` can take if something /// Avoid worst-case parse times by limiting how much a `take_while` can take if something
/// later may cause it to fail. /// later may cause it to fail.
const NON_TERMINATING_CAP: usize = 1024; const NON_TERMINATING_CAP: usize = 1024;
pub(crate) fn next_identifier<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> pub(crate) fn next_identifier<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -155,7 +156,7 @@ mod parser {
preceded(ignore, identifier).parse_next(input) preceded(ignore, identifier).parse_next(input)
} }
fn identifier<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn identifier<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -173,7 +174,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn ignore<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn ignore<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -204,7 +205,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn sep1<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn sep1<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -217,7 +218,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn other<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn other<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -234,7 +235,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn ordinal_literal<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn ordinal_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -260,7 +261,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn dec_literal<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn dec_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -269,7 +270,7 @@ mod parser {
trace("dec_literal", take_while(1.., is_dec_digit_with_sep)).parse_next(input) trace("dec_literal", take_while(1.., is_dec_digit_with_sep)).parse_next(input)
} }
fn hex_literal<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn hex_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -281,7 +282,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn css_color<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn css_color<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -302,7 +303,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn jwt<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn jwt<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -337,7 +338,7 @@ mod parser {
|| c == '-' || c == '-'
} }
fn uuid_literal<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn uuid_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -375,7 +376,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn hash_literal<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn hash_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -401,7 +402,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn base64_literal<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn base64_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -425,7 +426,8 @@ mod parser {
.iter() .iter()
.all(|c| !['/', '+'].contains(&c.as_char())) .all(|c| !['/', '+'].contains(&c.as_char()))
{ {
return Err(winnow::error::ErrMode::from_input(input)); #[allow(clippy::unit_arg)]
return Err(ParserError::from_input(input));
} }
take_while(padding_len..=padding_len, is_base64_padding).parse_next(input)?; take_while(padding_len..=padding_len, is_base64_padding).parse_next(input)?;
@ -437,7 +439,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn email_literal<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn email_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -456,7 +458,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn url_literal<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn url_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -489,7 +491,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn url_userinfo<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn url_userinfo<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -507,7 +509,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn c_escape<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn c_escape<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -528,7 +530,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn printf<T>(input: &mut T) -> ModalResult<<T as Stream>::Slice, ()> fn printf<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -538,10 +540,10 @@ mod parser {
trace("printf", ('%', take_while(1.., is_xid_continue)).take()).parse_next(input) trace("printf", ('%', take_while(1.., is_xid_continue)).take()).parse_next(input)
} }
fn take_many0<I, E, F>(mut f: F) -> impl ModalParser<I, <I as Stream>::Slice, E> fn take_many0<I, E, F>(mut f: F) -> impl Parser<I, <I as Stream>::Slice, E>
where where
I: Stream, I: Stream,
F: ModalParser<I, <I as Stream>::Slice, E>, F: Parser<I, <I as Stream>::Slice, E>,
E: ParserError<I>, E: ParserError<I>,
{ {
move |i: &mut I| repeat(0.., f.by_ref()).map(|()| ()).take().parse_next(i) move |i: &mut I| repeat(0.., f.by_ref()).map(|()| ()).take().parse_next(i)