diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-10-14 10:37:21 +1100 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2019-10-18 13:25:17 +1100 |
| commit | a6eef299d3b0ca24f8ffc0c3dc03283c09ec7945 (patch) | |
| tree | 7a238d968db0ddabfc1f517d3b1d8ea959bdc745 /src/libsyntax/tokenstream.rs | |
| parent | d0eaf60d5e4bd0d5be63a41ed9ff861dca95c932 (diff) | |
| download | rust-a6eef299d3b0ca24f8ffc0c3dc03283c09ec7945.tar.gz rust-a6eef299d3b0ca24f8ffc0c3dc03283c09ec7945.zip | |
Make `TokenStream::from_iter` less general and more efficient.
The current code has this impl: ``` impl<T: Into<TokenStream>> iter::FromIterator<T> for TokenStream ``` If given an `IntoIterator<Item = TokenTree>`, it will convert each individual `TokenTree` to a `TokenStream` (at the cost of two allocations: a `Vec` and an `Lrc`). It will then merge those `TokenStream`s into a single `TokenStream`. This is inefficient. This commit changes the impl to this less general one: ``` impl iter::FromIterator<TokenTree> for TokenStream ``` It collects the `TokenTree`s into a single `Vec` first and then converts that to a `TokenStream` by wrapping it in a single `Lrc`. The previous generality was unnecessary; no other code needs changing. This change speeds up several benchmarks by up to 4%.
Diffstat (limited to 'src/libsyntax/tokenstream.rs')
| -rw-r--r-- | src/libsyntax/tokenstream.rs | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/libsyntax/tokenstream.rs b/src/libsyntax/tokenstream.rs index db6832d6423..3d89e73d729 100644 --- a/src/libsyntax/tokenstream.rs +++ b/src/libsyntax/tokenstream.rs @@ -202,9 +202,9 @@ impl From<TokenTree> for TreeAndJoint { } } -impl<T: Into<TokenStream>> iter::FromIterator<T> for TokenStream { - fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self { - TokenStream::from_streams(iter.into_iter().map(Into::into).collect::<SmallVec<_>>()) +impl iter::FromIterator<TokenTree> for TokenStream { + fn from_iter<I: IntoIterator<Item = TokenTree>>(iter: I) -> Self { + TokenStream::new(iter.into_iter().map(Into::into).collect::<Vec<TreeAndJoint>>()) } } |
