diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-06-07 12:08:38 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-06-10 10:04:25 +1000 |
| commit | 35b5f4377028e34dc4df1ce67c225d2926c6c7a7 (patch) | |
| tree | a793a51b7fc0b78a031842344318e77190cf3b31 /src/libsyntax/parse/parser.rs | |
| parent | d132f544f9d74e3cc047ef211e57eae60b78e5c5 (diff) | |
| download | rust-35b5f4377028e34dc4df1ce67c225d2926c6c7a7.tar.gz rust-35b5f4377028e34dc4df1ce67c225d2926c6c7a7.zip | |
Special-case literals in `parse_bottom_expr`.
This makes parsing faster, particularly for code with large constants, for two reasons: - it skips all the keyword comparisons for literals; - it replaces the unnecessary `parse_literal_maybe_minus` call with `parse_lit`, avoiding an unnecessary allocation via `mk_expr`.
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 43e7c9330e4..9b9954859be 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2002,8 +2002,29 @@ impl<'a> Parser<'a> { let ex: ExprKind; + macro_rules! parse_lit { + () => { + match self.parse_lit() { + Ok(literal) => { + hi = self.prev_span; + ex = ExprKind::Lit(literal); + } + Err(mut err) => { + self.cancel(&mut err); + return Err(self.expected_expression_found()); + } + } + } + } + // Note: when adding new syntax here, don't forget to adjust TokenKind::can_begin_expr(). match self.token.kind { + // This match arm is a special-case of the `_` match arm below and + // could be removed without changing functionality, but it's faster + // to have it here, especially for programs with large constants. + token::Literal(_) => { + parse_lit!() + } token::OpenDelim(token::Paren) => { self.bump(); @@ -2249,16 +2270,7 @@ impl<'a> Parser<'a> { self.bump(); return Ok(self.mk_expr(self.span, ExprKind::Err, ThinVec::new())); } - match self.parse_literal_maybe_minus() { - Ok(expr) => { - hi = expr.span; - ex = expr.node.clone(); - } - Err(mut err) => { - self.cancel(&mut err); - return Err(self.expected_expression_found()); - } - } + parse_lit!() } } } |
