about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorMichael Lamparski <diagonaldevice@gmail.com>2018-07-07 17:11:20 -0400
committerMichael Lamparski <diagonaldevice@gmail.com>2018-07-07 17:13:21 -0400
commit191e76c5b88fe019c949a3404bda53e5cd67c5e6 (patch)
treed01b9162164eb46cc24250aa901a9f761e64fdba /src/libsyntax
parent9fd3d7899a444fe110ae9277542b306844ecf0c4 (diff)
downloadrust-191e76c5b88fe019c949a3404bda53e5cd67c5e6.tar.gz
rust-191e76c5b88fe019c949a3404bda53e5cd67c5e6.zip
fix perf issue in macro parser
For a fuller description of the performance issue fixed by this:

https://github.com/rust-lang/rust/issues/51754#issuecomment-403242159
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/tt/macro_parser.rs9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libsyntax/ext/tt/macro_parser.rs b/src/libsyntax/ext/tt/macro_parser.rs
index fe458fa9977..ba61b2307d9 100644
--- a/src/libsyntax/ext/tt/macro_parser.rs
+++ b/src/libsyntax/ext/tt/macro_parser.rs
@@ -696,10 +696,17 @@ pub fn parse(
             } else {
                 return Failure(parser.span, token::Eof);
             }
+        } else {
+            // Performance hack: eof_items may share matchers via Rc with other things that we want
+            // to modify. Dropping eof_items now may drop these refcounts to 1, preventing an
+            // unnecessary implicit clone later in Rc::make_mut.
+            drop(eof_items);
         }
+
         // Another possibility is that we need to call out to parse some rust nonterminal
         // (black-box) parser. However, if there is not EXACTLY ONE of these, something is wrong.
-        else if (!bb_items.is_empty() && !next_items.is_empty()) || bb_items.len() > 1 {
+        assert!(!token_name_eq(&parser.token, &token::Eof));
+        if (!bb_items.is_empty() && !next_items.is_empty()) || bb_items.len() > 1 {
             let nts = bb_items
                 .iter()
                 .map(|item| match item.top_elts.get_tt(item.idx) {