diff options
| author | Eric Holk <eric.holk@gmail.com> | 2012-07-25 19:13:58 -0700 |
|---|---|---|
| committer | Paul Stansifer <paul.stansifer@gmail.com> | 2012-07-26 11:37:57 -0700 |
| commit | 5805616aad056327c19831634708e90175f1a4a0 (patch) | |
| tree | d791c24721acbd7c7c7c4c2f212c5afd143192fa /src/libsyntax/parse | |
| parent | 94f29e0c9485e2867c6e48cdf74ff7ca1b764e4b (diff) | |
Make parsing about 0.3 seconds faster.
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/common.rs | 19 | ||||
| -rw-r--r-- | src/libsyntax/parse/lexer.rs | 6 | ||||
| -rw-r--r-- | 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 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) } |
