From 238f1c50e5b27a8655e10ac2b2be723b62233931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Wed, 19 Jun 2024 09:43:57 +0900 Subject: [PATCH] perf(es/lexer): Add a fast-path to template literal lexer (#9080) **Description:** We don't need to allocate at all in the fast path. --- crates/swc_ecma_parser/src/lexer/mod.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/swc_ecma_parser/src/lexer/mod.rs b/crates/swc_ecma_parser/src/lexer/mod.rs index cb553589eddf..aaaab140a060 100644 --- a/crates/swc_ecma_parser/src/lexer/mod.rs +++ b/crates/swc_ecma_parser/src/lexer/mod.rs @@ -1257,7 +1257,21 @@ impl<'a> Lexer<'a> { } } - consume_cooked!(); + // If we don't have any escape + let cooked = if cooked_slice_start == raw_slice_start { + let last_pos = self.cur_pos(); + let s = unsafe { + // Safety: Both of start and last_pos are valid position because we got them + // from `self.input` + self.input.slice(cooked_slice_start, last_pos) + }; + + Ok(self.atoms.atom(s)) + } else { + consume_cooked!(); + + cooked.map(|s| self.atoms.atom(s)) + }; // TODO: Handle error let end = self.input.cur_pos(); @@ -1267,7 +1281,7 @@ impl<'a> Lexer<'a> { self.input.slice(raw_slice_start, end) }; return Ok(Token::Template { - cooked: cooked.map(Atom::from), + cooked, raw: self.atoms.atom(raw), }); }