Skip to content

Commit be6b695

Browse files
authored
perf(es/parser): Remove Rc<RefCell<T>> in Capturing (#11058)
**Description:** Similar to #11002 **BREAKING CHANGE:** This is a breaking change, but the `Capturing` feature is marked as unstable.
1 parent 63c5413 commit be6b695

File tree

5 files changed

+32
-31
lines changed

5 files changed

+32
-31
lines changed

.changeset/mighty-buckets-walk.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
swc_ecma_parser: major
3+
---
4+
5+
perf: remove `Rc<RefCell<T>>` in `Capturing`

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/swc_ecma_parser/src/lexer/capturing.rs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{cell::RefCell, mem, rc::Rc};
1+
use std::mem;
22

33
use swc_ecma_lexer::common::syntax::SyntaxFlags;
44

@@ -7,7 +7,12 @@ use crate::{input::Tokens, lexer::token::TokenAndSpan};
77
#[derive(Debug)]
88
pub struct Capturing<I> {
99
inner: I,
10-
captured: Rc<RefCell<Vec<TokenAndSpan>>>,
10+
captured: Vec<TokenAndSpan>,
11+
}
12+
13+
pub struct CapturingCheckpoint<I: swc_ecma_lexer::common::input::Tokens<TokenAndSpan>> {
14+
pos: usize,
15+
inner: I::Checkpoint,
1116
}
1217

1318
impl<I: Clone> Clone for Capturing<I> {
@@ -27,13 +32,13 @@ impl<I> Capturing<I> {
2732
}
2833
}
2934

30-
pub fn tokens(&self) -> Rc<RefCell<Vec<TokenAndSpan>>> {
31-
self.captured.clone()
35+
pub fn tokens(&self) -> &[TokenAndSpan] {
36+
&self.captured
3237
}
3338

3439
/// Take captured tokens
3540
pub fn take(&mut self) -> Vec<TokenAndSpan> {
36-
mem::take(&mut *self.captured.borrow_mut())
41+
mem::take(&mut self.captured)
3742
}
3843
}
3944

@@ -45,19 +50,8 @@ impl<I: Iterator<Item = TokenAndSpan>> Iterator for Capturing<I> {
4550

4651
match next {
4752
Some(ts) => {
48-
let mut v = self.captured.borrow_mut();
49-
50-
// remove tokens that could change due to backtracing
51-
while let Some(last) = v.last() {
52-
if last.span.lo >= ts.span.lo {
53-
v.pop();
54-
} else {
55-
break;
56-
}
57-
}
58-
53+
let v = &mut self.captured;
5954
v.push(ts);
60-
6155
Some(ts)
6256
}
6357
None => None,
@@ -68,14 +62,18 @@ impl<I: Iterator<Item = TokenAndSpan>> Iterator for Capturing<I> {
6862
impl<I: swc_ecma_lexer::common::input::Tokens<TokenAndSpan>>
6963
swc_ecma_lexer::common::input::Tokens<TokenAndSpan> for Capturing<I>
7064
{
71-
type Checkpoint = I::Checkpoint;
65+
type Checkpoint = CapturingCheckpoint<I>;
7266

7367
fn checkpoint_save(&self) -> Self::Checkpoint {
74-
self.inner.checkpoint_save()
68+
Self::Checkpoint {
69+
pos: self.captured.len(),
70+
inner: self.inner.checkpoint_save(),
71+
}
7572
}
7673

7774
fn checkpoint_load(&mut self, checkpoint: Self::Checkpoint) {
78-
self.inner.checkpoint_load(checkpoint);
75+
self.captured.truncate(checkpoint.pos);
76+
self.inner.checkpoint_load(checkpoint.inner);
7977
}
8078

8179
fn set_ctx(&mut self, ctx: swc_ecma_lexer::common::context::Context) {

crates/swc_ts_fast_strip/Cargo.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ default = []
1515
nightly = []
1616

1717
[dependencies]
18-
anyhow = { workspace = true }
19-
bytes-str = { workspace = true }
20-
serde = { workspace = true, features = ["derive"] }
21-
wasm-bindgen = { workspace = true, optional = true }
18+
anyhow = { workspace = true }
19+
bytes-str = { workspace = true }
20+
serde = { workspace = true, features = ["derive"] }
2221
swc_atoms = { version = "7.0.0", path = "../swc_atoms" }
2322
swc_common = { version = "14.0.3", path = "../swc_common", features = [
2423
"sourcemap",
2524
] }
2625
swc_ecma_ast = { version = "15.0.0", path = "../swc_ecma_ast" }
2726
swc_ecma_codegen = { version = "17.0.0", path = "../swc_ecma_codegen" }
27+
swc_ecma_lexer = { version = "23.0.0", path = "../swc_ecma_lexer" }
2828
swc_ecma_parser = { version = "23.0.0", path = "../swc_ecma_parser", default-features = false, features = [
2929
"typescript",
3030
"unstable",
@@ -33,6 +33,7 @@ swc_ecma_transforms_base = { version = "25.0.0", path = "../swc_ecma_transforms_
3333
swc_ecma_transforms_react = { version = "28.0.0", path = "../swc_ecma_transforms_react" }
3434
swc_ecma_transforms_typescript = { version = "28.0.0", path = "../swc_ecma_transforms_typescript" }
3535
swc_ecma_visit = { version = "15.0.0", path = "../swc_ecma_visit" }
36+
wasm-bindgen = { workspace = true, optional = true }
3637

3738
[dev-dependencies]
3839
codspeed-criterion-compat = { workspace = true }

crates/swc_ts_fast_strip/src/lib.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{cell::RefCell, fmt::Display, rc::Rc};
1+
use std::fmt::Display;
22

33
use anyhow::Context;
44
use bytes_str::BytesStr;
@@ -21,6 +21,7 @@ use swc_ecma_ast::{
2121
TsSatisfiesExpr, TsTypeAliasDecl, TsTypeAnn, TsTypeAssertion, TsTypeParamDecl,
2222
TsTypeParamInstantiation, VarDeclarator, WhileStmt, YieldExpr,
2323
};
24+
use swc_ecma_lexer::common::parser::{buffer::Buffer, Parser as _};
2425
use swc_ecma_parser::{
2526
lexer::Lexer,
2627
unstable::{Capturing, Token, TokenAndSpan, TokenFactory},
@@ -251,8 +252,6 @@ pub fn operate(
251252
StringInput::from(&*fm),
252253
Some(&comments),
253254
));
254-
let tokens = lexer.tokens().clone();
255-
256255
let mut parser = Parser::new_from(lexer);
257256

258257
let program = match options.module {
@@ -261,6 +260,7 @@ pub fn operate(
261260
None => parser.parse_program(),
262261
};
263262
let errors = parser.take_errors();
263+
let mut tokens = parser.input_mut().iter_mut().take();
264264

265265
let mut program = match program {
266266
Ok(program) => program,
@@ -301,8 +301,6 @@ pub fn operate(
301301

302302
match options.mode {
303303
Mode::StripOnly => {
304-
let mut tokens = RefCell::into_inner(Rc::try_unwrap(tokens).unwrap());
305-
306304
tokens.sort_by_key(|t| t.span);
307305

308306
if deprecated_ts_module_as_error {
@@ -418,8 +416,6 @@ pub fn operate(
418416
program.mutate(&mut resolver(unresolved_mark, top_level_mark, true));
419417

420418
if deprecated_ts_module_as_error {
421-
let mut tokens = RefCell::into_inner(Rc::try_unwrap(tokens).unwrap());
422-
423419
tokens.sort_by_key(|t| t.span);
424420

425421
program.visit_with(&mut ErrorOnTsModule {

0 commit comments

Comments
 (0)