The general case at the bottom of `look_ahead` is slow, because it
clones the token cursor. Above it there is a special case for
performance that is hit most of the time and avoids the cloning.
Unfortunately, its behaviour differs from the general case in two ways.
- When within a pair of delimiters, if you look any distance past the
closing delimiter you get the closing delimiter instead of what comes
after the closing delimiter.
- It uses `tree_cursor.look_ahead(dist - 1)` which totally confuses
tokens with token trees. This means that only the first token in a
token tree will be seen. E.g. in a sequence like `{ a }` the `a` and
`}` will be skipped over. Bad!
It's likely that these differences weren't noticed before now because
the use of `look_ahead` in the parser is limited to small distances and
relatively few contexts.
Removing the special case causes slowdowns up of to 2% on a range of
benchmarks. The next commit will add a new, correct special case to
regain that lost performance.
|
||
|---|---|---|
| .. | ||
| mut_visit | ||
| tokenstream | ||
| attr.rs | ||
| attr_wrapper.rs | ||
| diagnostics.rs | ||
| expr.rs | ||
| generics.rs | ||
| item.rs | ||
| mod.rs | ||
| nonterminal.rs | ||
| pat.rs | ||
| path.rs | ||
| stmt.rs | ||
| tests.rs | ||
| ty.rs | ||