about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>2017-01-26 09:37:25 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2017-02-28 22:13:34 +0000
commitd09e512158dcc86ad6e41231537ce960f3b2e918 (patch)
treeb063c7f0ab7d908837ef48c1c862af357771497f /src
parentbe760566cf938d11d34c2f6bd90d8fd0f67c2344 (diff)
downloadrust-d09e512158dcc86ad6e41231537ce960f3b2e918.tar.gz
rust-d09e512158dcc86ad6e41231537ce960f3b2e918.zip
Remove a `loop` in `ext::tt::transcribe`.
Diffstat (limited to 'src')
-rw-r--r--src/libsyntax/ext/tt/transcribe.rs55
1 files changed, 23 insertions, 32 deletions
diff --git a/src/libsyntax/ext/tt/transcribe.rs b/src/libsyntax/ext/tt/transcribe.rs
index 38becbe7b1d..a2ce782eec8 100644
--- a/src/libsyntax/ext/tt/transcribe.rs
+++ b/src/libsyntax/ext/tt/transcribe.rs
@@ -151,43 +151,34 @@ fn lockstep_iter_size(t: &TokenTree, r: &TtReader) -> LockstepIterSize {
 /// EFFECT: advances the reader's token field
 fn tt_next_token(r: &mut TtReader, prev_span: Span) -> Option<TokenTree> {
     loop {
-        let should_pop = if let Some(frame) = r.stack.last() {
-            if frame.idx < frame.forest.len() {
-                break;
-            }
-            !frame.dotdotdoted || *r.repeat_idx.last().unwrap() == *r.repeat_len.last().unwrap() - 1
-        } else {
-            return None;
+        let frame = match r.stack.last() {
+            Some(frame) => frame.clone(),
+            None => return None,
         };
 
-        /* done with this set; pop or repeat? */
-        if should_pop {
-            let prev = r.stack.pop().unwrap();
-            if let Some(frame) = r.stack.last_mut() {
-                frame.idx += 1;
+        if frame.idx == frame.forest.len() {
+            if frame.dotdotdoted &&
+               *r.repeat_idx.last().unwrap() == *r.repeat_len.last().unwrap() - 1 {
+                *r.repeat_idx.last_mut().unwrap() += 1;
+                r.stack.last_mut().unwrap().idx = 0;
+                if let Some(tk) = r.stack.last().unwrap().sep.clone() {
+                    return Some(TokenTree::Token(prev_span, tk)); // repeat same span, I guess
+                }
             } else {
-                return None;
-            }
-            if prev.dotdotdoted {
-                r.repeat_idx.pop();
-                r.repeat_len.pop();
-            }
-        } else { /* repeat */
-            *r.repeat_idx.last_mut().unwrap() += 1;
-            r.stack.last_mut().unwrap().idx = 0;
-            if let Some(tk) = r.stack.last().unwrap().sep.clone() {
-                return Some(TokenTree::Token(prev_span, tk)); // repeat same span, I guess
+                r.stack.pop();
+                match r.stack.last_mut() {
+                    Some(frame) => frame.idx += 1,
+                    None => return None,
+                }
+                if frame.dotdotdoted {
+                    r.repeat_idx.pop();
+                    r.repeat_len.pop();
+                }
             }
+            continue
         }
-    }
-    loop { /* because it's easiest, this handles `TokenTree::Delimited` not starting
-              with a `TokenTree::Token`, even though it won't happen */
-        let t = {
-            let frame = r.stack.last().unwrap();
-            // FIXME(pcwalton): Bad copy.
-            frame.forest.get_tt(frame.idx)
-        };
-        match t {
+
+        match frame.forest.get_tt(frame.idx) {
             TokenTree::Sequence(sp, seq) => {
                 // FIXME(pcwalton): Bad copy.
                 match lockstep_iter_size(&TokenTree::Sequence(sp, seq.clone()),