diff options
| author | bors <bors@rust-lang.org> | 2025-08-20 09:01:41 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-08-20 09:01:41 +0000 |
| commit | bec747418c9955de4c3fd0aac4acb99206f00aa2 (patch) | |
| tree | 68c401d44d78086821a158712dbb4b1647b7acf7 /compiler/rustc_parse/src/parser/mod.rs | |
| parent | 22a86f8280becb12c34ee3efd952baf5cf086fa0 (diff) | |
| parent | 145b84721aae8e62d90b0fe40e8f796289ff7303 (diff) | |
| download | rust-bec747418c9955de4c3fd0aac4acb99206f00aa2.tar.gz rust-bec747418c9955de4c3fd0aac4acb99206f00aa2.zip | |
Auto merge of #145348 - nnethercote:parse_token_tree-speedup-for-uom, r=petrochenkov
Sometimes skip over tokens in `parse_token_tree`. r? `@petrochenkov`
Diffstat (limited to 'compiler/rustc_parse/src/parser/mod.rs')
| -rw-r--r-- | compiler/rustc_parse/src/parser/mod.rs | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs index 41ed1f95a01..21f42b54f21 100644 --- a/compiler/rustc_parse/src/parser/mod.rs +++ b/compiler/rustc_parse/src/parser/mod.rs @@ -1388,15 +1388,26 @@ impl<'a> Parser<'a> { // matching `CloseDelim` we are *after* the delimited sequence, // i.e. at depth `d - 1`. let target_depth = self.token_cursor.stack.len() - 1; - loop { - // Advance one token at a time, so `TokenCursor::next()` - // can capture these tokens if necessary. + + if let Capturing::No = self.capture_state.capturing { + // We are not capturing tokens, so skip to the end of the + // delimited sequence. This is a perf win when dealing with + // declarative macros that pass large `tt` fragments through + // multiple rules, as seen in the uom-0.37.0 crate. + self.token_cursor.curr.bump_to_end(); self.bump(); - if self.token_cursor.stack.len() == target_depth { - debug_assert!(self.token.kind.close_delim().is_some()); - break; + debug_assert_eq!(self.token_cursor.stack.len(), target_depth); + } else { + loop { + // Advance one token at a time, so `TokenCursor::next()` + // can capture these tokens if necessary. + self.bump(); + if self.token_cursor.stack.len() == target_depth { + break; + } } } + debug_assert!(self.token.kind.close_delim().is_some()); // Consume close delimiter self.bump(); |
