about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorEric Holk <eric.holk@gmail.com>2012-07-25 19:13:58 -0700
committerPaul Stansifer <paul.stansifer@gmail.com>2012-07-26 11:37:57 -0700
commit5805616aad056327c19831634708e90175f1a4a0 (patch)
treed791c24721acbd7c7c7c4c2f212c5afd143192fa /src/libsyntax/parse
parent94f29e0c9485e2867c6e48cdf74ff7ca1b764e4b (diff)
Make parsing about 0.3 seconds faster.
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/common.rs19
-rw-r--r--src/libsyntax/parse/lexer.rs6
-rw-r--r--src/libsyntax/parse/parser.rs2
3 files changed, 14 insertions, 13 deletions
diff --git a/src/libsyntax/parse/common.rs b/src/libsyntax/parse/common.rs
index 9126bbb3be4..e35b762f972 100644
--- a/src/libsyntax/parse/common.rs
+++ b/src/libsyntax/parse/common.rs
@@ -141,17 +141,18 @@ impl parser_common of parser_common for parser {
     fn eat_keyword(word: ~str) -> bool {
         self.require_keyword(word);
 
-        // FIXME (#13042): this gratuitous use of @ is to
-        // workaround LLVM bug.
-        alt @self.token {
-          @token::IDENT(sid, false) {
+        let mut bump = false;
+        let val = alt self.token {
+          token::IDENT(sid, false) {
             if str::eq(word, *self.get_str(sid)) {
-                self.bump();
-                ret true;
-            } else { ret false; }
+                bump = true;
+                true
+            } else { false }
           }
-          _ { ret false; }
-        }
+          _ { false }
+        };
+        if bump { self.bump() }
+        val
     }
 
     fn expect_keyword(word: ~str) {
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs
index 7afdc301b02..94e12e16185 100644
--- a/src/libsyntax/parse/lexer.rs
+++ b/src/libsyntax/parse/lexer.rs
@@ -14,7 +14,7 @@ iface reader {
     fn next_token() -> {tok: token::token, sp: span};
     fn fatal(~str) -> !;
     fn span_diag() -> span_handler;
-    fn interner() -> @interner<@~str>;
+    pure fn interner() -> @interner<@~str>;
     fn peek() -> {tok: token::token, sp: span};
     fn dup() -> reader;
 }
@@ -79,7 +79,7 @@ impl string_reader_as_reader of reader for string_reader {
         self.span_diagnostic.span_fatal(copy self.peek_span, m)
     }
     fn span_diag() -> span_handler { self.span_diagnostic }
-    fn interner() -> @interner<@~str> { self.interner }
+    pure fn interner() -> @interner<@~str> { self.interner }
     fn peek() -> {tok: token::token, sp: span} {
         {tok: self.peek_tok, sp: self.peek_span}
     }
@@ -101,7 +101,7 @@ impl tt_reader_as_reader of reader for tt_reader {
         self.sp_diag.span_fatal(copy self.cur_span, m);
     }
     fn span_diag() -> span_handler { self.sp_diag }
-    fn interner() -> @interner<@~str> { self.interner }
+    pure fn interner() -> @interner<@~str> { self.interner }
     fn peek() -> {tok: token::token, sp: span} {
         { tok: self.cur_tok, sp: self.cur_span }
     }
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index d14905e1290..0723103877b 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -223,7 +223,7 @@ class parser {
     fn warn(m: ~str) {
         self.sess.span_diagnostic.span_warn(copy self.span, m)
     }
-    fn get_str(i: token::str_num) -> @~str {
+    pure fn get_str(i: token::str_num) -> @~str {
         interner::get(*self.reader.interner(), i)
     }
     fn get_id() -> node_id { next_node_id(self.sess) }