perf(regular_expression): defer literal range dash allocation (#28511)

Allocate a literal dash only when a class range falls back to literal
class contents.

AI-assisted (Codex).
This commit is contained in:
Boshen authored and GitHub committed 2026-10-30 17:17:34 +08:00
1 parent d85ee3db01
commit 3708934efb
5 files changed
+26 -19

No files matched your search

@@ -873,21 +873,21 @@ impl<'a> PatternParser<'a> {
continue;
}
let dash = ast::CharacterClassContents::Character(ArenaBox::new_in(
ast::Character {
span: self.span_factory.create(span_start, self.reader.offset()),
kind: ast::CharacterKind::Symbol,
value: '-' as u32,
},
self,
));
let dash_span = self.span_factory.create(span_start, self.reader.offset());
let Some(class_atom_to) = self.parse_class_atom()? else {
// ClassAtom[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode]
// => ClassAtom[?UnicodeMode] ClassAtom[?UnicodeMode]
// => ClassAtom[?UnicodeMode] -
body.push(class_atom);
body.push(dash);
body.push(ast::CharacterClassContents::Character(ArenaBox::new_in(
ast::Character {
span: dash_span,
kind: ast::CharacterKind::Symbol,
value: '-' as u32,
},
self,
)));
continue;
};
@@ -937,7 +937,14 @@ impl<'a> PatternParser<'a> {
}
body.push(class_atom);
body.push(dash);
body.push(ast::CharacterClassContents::Character(ArenaBox::new_in(
ast::Character {
span: dash_span,
kind: ast::CharacterKind::Symbol,
value: '-' as u32,
},
self,
)));
body.push(class_atom_to);
}
@@ -51,7 +51,7 @@ antd.js:
sys peak growth: 19934725 # 19.93 MB
arena allocs: 175842
arena reallocs: 34169
arena size: 43472344 # 43.47 MB
arena size: 43471240 # 43.47 MB
binder.ts:
file size: 193077 # 193.08 kB
@@ -5,7 +5,7 @@ checker.ts:
sys deallocs: 19
sys alloc bytes: 4820 # 4.82 kB
sys peak growth: 2432 # 2.43 kB
arena allocs: 259312
arena allocs: 259307
arena reallocs: 15233
arena size: 12875504 # 12.88 MB
@@ -16,7 +16,7 @@ App.tsx:
sys deallocs: 18
sys alloc bytes: 4348 # 4.35 kB
sys peak growth: 1868 # 1.87 kB
arena allocs: 43828
arena allocs: 43826
arena reallocs: 2263
arena size: 2228464 # 2.23 MB
@@ -38,7 +38,7 @@ pdf.mjs:
sys deallocs: 61
sys alloc bytes: 24020 # 24.02 kB
sys peak growth: 12140 # 12.14 kB
arena allocs: 88940
arena allocs: 88912
arena reallocs: 5904
arena size: 4488040 # 4.49 MB
@@ -49,9 +49,9 @@ antd.js:
sys deallocs: 183
sys alloc bytes: 94120 # 94.12 kB
sys peak growth: 38896 # 38.90 kB
arena allocs: 519986
arena allocs: 519914
arena reallocs: 35629
arena size: 29903280 # 29.90 MB
arena size: 29902176 # 29.90 MB
binder.ts:
file size: 193077 # 193.08 kB
@@ -71,6 +71,6 @@ kitchen-sink.tsx:
sys deallocs: 182
sys alloc bytes: 34053 # 34.05 kB
sys peak growth: 3892 # 3.89 kB
arena allocs: 135741
arena allocs: 135713
arena reallocs: 8759
arena size: 6398256 # 6.40 MB
@@ -51,7 +51,7 @@ antd.js:
sys peak growth: 5441278 # 5.44 MB
arena allocs: 0
arena reallocs: 0
arena size: 29903280 # 29.90 MB
arena size: 29902176 # 29.90 MB
binder.ts:
file size: 193077 # 193.08 kB
@@ -51,7 +51,7 @@ antd.js:
sys peak growth: 1611 # 1.61 kB
arena allocs: 2
arena reallocs: 0
arena size: 29903304 # 29.90 MB
arena size: 29902200 # 29.90 MB
binder.ts:
file size: 193077 # 193.08 kB