Skip to content

Commit e66b4d6

Browse files
authored
perf(es/parser): Remove redundant is_ascii calls (#10334)
1 parent 5970f93 commit e66b4d6

File tree

3 files changed

+31
-16
lines changed

3 files changed

+31
-16
lines changed

.changeset/twenty-experts-travel.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
swc_ecma_ast: patch
3+
swc_ecma_parser: patch
4+
swc_core: patch
5+
---
6+
7+
perf(es/parser): remove redunant is_ascii

crates/swc_ecma_ast/src/ident.rs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -261,9 +261,9 @@ impl Ident {
261261
(self.sym.clone(), self.ctxt)
262262
}
263263

264-
/// Returns true if `c` is a valid character for an identifier start.
265264
#[inline]
266-
pub fn is_valid_start(c: char) -> bool {
265+
pub fn is_valid_ascii_start(c: u8) -> bool {
266+
debug_assert!(c.is_ascii());
267267
// This contains `$` (36) and `_` (95)
268268
const ASCII_START: Align64<[bool; 128]> = Align64([
269269
F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F,
@@ -272,18 +272,22 @@ impl Ident {
272272
T, T, T, T, F, F, F, F, T, F, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
273273
T, T, T, T, T, T, T, F, F, F, F, F,
274274
]);
275+
ASCII_START.0[c as usize]
276+
}
275277

278+
/// Returns true if `c` is a valid character for an identifier start.
279+
#[inline]
280+
pub fn is_valid_start(c: char) -> bool {
276281
if c.is_ascii() {
277-
return ASCII_START.0[c as usize];
282+
Self::is_valid_ascii_start(c as u8)
283+
} else {
284+
unicode_id_start::is_id_start_unicode(c)
278285
}
279-
280-
unicode_id_start::is_id_start_unicode(c)
281286
}
282287

283-
/// Returns true if `c` is a valid character for an identifier part after
284-
/// start.
285288
#[inline]
286-
pub fn is_valid_continue(c: char) -> bool {
289+
pub fn is_valid_ascii_continue(c: u8) -> bool {
290+
debug_assert!(c.is_ascii());
287291
// This contains `$` (36)
288292
const ASCII_CONTINUE: Align64<[bool; 128]> = Align64([
289293
F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F,
@@ -292,12 +296,18 @@ impl Ident {
292296
T, T, T, T, F, F, F, F, T, F, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,
293297
T, T, T, T, T, T, T, F, F, F, F, F,
294298
]);
299+
ASCII_CONTINUE.0[c as usize]
300+
}
295301

302+
/// Returns true if `c` is a valid character for an identifier part after
303+
/// start.
304+
#[inline]
305+
pub fn is_valid_continue(c: char) -> bool {
296306
if c.is_ascii() {
297-
return ASCII_CONTINUE.0[c as usize];
307+
Self::is_valid_ascii_continue(c as u8)
308+
} else {
309+
unicode_id_start::is_id_continue_unicode(c)
298310
}
299-
300-
unicode_id_start::is_id_continue_unicode(c)
301311
}
302312

303313
/// Alternative for `toIdentifier` of babel.

crates/swc_ecma_parser/src/lexer/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -803,10 +803,10 @@ impl Lexer<'_> {
803803
can_be_keyword = false;
804804
}
805805

806-
if Ident::is_valid_continue(c as _) {
806+
if Ident::is_valid_ascii_continue(c) {
807807
l.bump();
808808
continue;
809-
} else if first && Ident::is_valid_start(c as _) {
809+
} else if first && Ident::is_valid_ascii_start(c) {
810810
l.bump();
811811
first = false;
812812
continue;
@@ -862,9 +862,7 @@ impl Lexer<'_> {
862862
// ASCII but not a valid identifier
863863

864864
break;
865-
}
866-
867-
if let Some(c) = l.input.cur() {
865+
} else if let Some(c) = l.input.cur() {
868866
if Ident::is_valid_continue(c) {
869867
l.bump();
870868
continue;

0 commit comments

Comments
 (0)