diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-11-03 11:59:43 +0000 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-11-04 02:38:54 +0000 |
| commit | 23ad6fdb66a2159b173e3e781c51d648fa663882 (patch) | |
| tree | 5509e45b44f6dd0dd2101b3f5bce4645dcbbea3d /src/libsyntax/parse | |
| parent | 7ae083383d1a88f1d76e51297a88c2a423aaa3d1 (diff) | |
| download | rust-23ad6fdb66a2159b173e3e781c51d648fa663882.tar.gz rust-23ad6fdb66a2159b173e3e781c51d648fa663882.zip | |
Improve `tt`-heavy expansion performance.
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index e5bbeb3c648..b670a738473 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -212,6 +212,7 @@ pub struct Parser<'a> { pub expected_tokens: Vec<TokenType>, pub tts: Vec<(TokenTree, usize)>, pub desugar_doc_comments: bool, + pub allow_interpolated_tts: bool, } #[derive(PartialEq, Eq, Clone)] @@ -301,6 +302,7 @@ impl<'a> Parser<'a> { expected_tokens: Vec::new(), tts: Vec::new(), desugar_doc_comments: desugar_doc_comments, + allow_interpolated_tts: true, }; let tok = parser.next_tok(); @@ -2718,7 +2720,12 @@ impl<'a> Parser<'a> { if self.tts.last().map(|&(_, i)| i == 1).unwrap_or(false) { let tt = self.tts.pop().unwrap().0; self.bump(); - return Ok(tt); + return Ok(if self.allow_interpolated_tts { + // avoid needlessly reparsing token trees in recursive macro expansions + TokenTree::Token(tt.span(), token::Interpolated(Rc::new(token::NtTT(tt)))) + } else { + tt + }); } let parsing_token_tree = ::std::mem::replace(&mut self.parsing_token_tree, true); |
