From 3ead0dd60852493b1d7696a7efaf91ea02cb132a Mon Sep 17 00:00:00 2001 From: camc314 <18101008+camc314@users.noreply.github.com> Date: Tue, 2 Sep 2025 16:45:42 +0000 Subject: [PATCH] perf(parser): store Option for lexer errors (#13520) partially addresses the perf regression in https://github.com/oxc-project/oxc/pull/13494 Not quite as fast as originally, but a little bit faster --- crates/oxc_parser/src/lexer/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/oxc_parser/src/lexer/mod.rs b/crates/oxc_parser/src/lexer/mod.rs index 2bbc1ff0529c9..33173e14a5a63 100644 --- a/crates/oxc_parser/src/lexer/mod.rs +++ b/crates/oxc_parser/src/lexer/mod.rs @@ -44,7 +44,7 @@ use trivia_builder::TriviaBuilder; pub struct LexerCheckpoint<'a> { source_position: SourcePosition<'a>, token: Token, - errors: Vec, + errors: Option>, } #[derive(Debug, Copy, Clone, Eq, PartialEq)] @@ -140,13 +140,13 @@ impl<'a> Lexer<'a> { LexerCheckpoint { source_position: self.source.position(), token: self.token, - errors: self.errors.clone(), + errors: { if self.errors.is_empty() { None } else { Some(self.errors.clone()) } }, } } /// Rewinds the lexer to the same state as when the passed in `checkpoint` was created. pub fn rewind(&mut self, checkpoint: LexerCheckpoint<'a>) { - self.errors = checkpoint.errors; + self.errors = checkpoint.errors.unwrap_or_default(); self.source.set_position(checkpoint.source_position); self.token = checkpoint.token; }