From ab1defb1ce8d40d03fe0074b56d3066873f62911 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Wed, 25 Jul 2012 19:13:58 -0700 Subject: [PATCH] Make parsing about 0.3 seconds faster. --- src/libsyntax/parse/common.rs | 19 ++++++++++--------- src/libsyntax/parse/lexer.rs | 6 +++--- src/libsyntax/parse/parser.rs | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/libsyntax/parse/common.rs b/src/libsyntax/parse/common.rs index 9126bbb3be4d..e35b762f9720 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 7afdc301b023..94e12e161859 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 de772b0ff1cb..21248b496a47 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -232,7 +232,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) }