Skip to content

Rollup of 8 pull requests #57624

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 27 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
0f34e0d
Add fmt benchmarks
sinkuu Jan 11, 2019
d7a7ce9
Utilize specialized zip iterator impl
sinkuu Jan 11, 2019
038d837
Fix simple formatting optimization
sinkuu Jan 12, 2019
04c74f4
Add core::iter::once_with
Jan 13, 2019
de6566c
forbid manually impl'ing one of an object type's marker traits
arielb1 Jan 5, 2019
7915732
Fix intradoc link and update issue number
Jan 13, 2019
28966e1
Remove `TokenStream::Tree` variant.
nnethercote Jan 9, 2019
ce0d994
Remove `ThinTokenStream`.
nnethercote Jan 9, 2019
ba31d83
Avoid some `TokenTree`-to-`TokenStream` conversions.
nnethercote Jan 10, 2019
959c870
Make privacy checking, intrinsic checking and liveness checking incre…
Zoxc Jun 8, 2018
e449f3d
Fix failing test
Jan 13, 2019
7285724
Make `TokenStream` use `Option`.
nnethercote Jan 10, 2019
f2dbdc4
Add 'rustc-env:RUST_BACKTRACE=0' to const-pat-ice test
Aaron1011 Jan 14, 2019
7c083a8
Remove unnecessary mut
Jan 14, 2019
84718c1
Add feature(iter_once_with)
Jan 14, 2019
3a1f013
Add another feature(iter_once_with)
Jan 14, 2019
d808f93
Simplify 'product' factorial example
timvisee Jan 14, 2019
d38a59f
fix test output changing in rebase
arielb1 Jan 14, 2019
0d695ff
Fix crates filtering box not being filled
GuillaumeGomez Jan 14, 2019
7611c49
Rollup merge of #57253 - Zoxc:incr-passes2, r=michaelwoerister
Centril Jan 15, 2019
da18f47
Rollup merge of #57352 - arielb1:no-manual-markers, r=nikomatsakis
Centril Jan 15, 2019
8117e90
Rollup merge of #57486 - nnethercote:simplify-TokenStream-more, r=pet…
Centril Jan 15, 2019
9ddb3bf
Rollup merge of #57537 - sinkuu:fmt_perf, r=alexcrichton
Centril Jan 15, 2019
0cf4d4e
Rollup merge of #57579 - stjepang:once-with, r=SimonSapin
Centril Jan 15, 2019
634a827
Rollup merge of #57587 - Aaron1011:fix/const-pat-ice, r=alexcrichton
Centril Jan 15, 2019
49a4356
Rollup merge of #57608 - timvisee:master, r=frewsxcv
Centril Jan 15, 2019
f14a882
Rollup merge of #57614 - GuillaumeGomez:fix-crate-filtering, r=QuietM…
Centril Jan 15, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Remove TokenStream::Tree variant.
`TokenStream::Stream` can represent a token stream containing any number
of token trees. `TokenStream::Tree` is the special case representing a
single token tree. The latter doesn't occur all that often dynamically,
so this commit removes it, which simplifies the code quite a bit.

This change has mixed performance effects.

- The size of `TokenStream` drops from 32 bytes to 8 bytes, and there
  is one less case for all the match statements.

- The conversion of a `TokenTree` to a `TokenStream` now requires two
  allocations, for the creation of a single element Lrc<Vec<_>>. (But a
  subsequent commit in this PR will reduce the main source of such
  conversions.)
nnethercote committed Jan 13, 2019
commit 28966e1a7ac509cebac4595e96f8d053b30fb946
45 changes: 5 additions & 40 deletions src/libsyntax/tokenstream.rs
Original file line number Diff line number Diff line change
@@ -113,7 +113,7 @@ impl TokenTree {
}

pub fn joint(self) -> TokenStream {
TokenStream::Tree(self, Joint)
TokenStream::new(vec![(self, Joint)])
}

/// Returns the opening delimiter as a token tree.
@@ -146,15 +146,14 @@ impl TokenTree {
#[derive(Clone, Debug)]
pub enum TokenStream {
Empty,
Tree(TokenTree, IsJoint),
Stream(Lrc<Vec<TreeAndJoint>>),
}

pub type TreeAndJoint = (TokenTree, IsJoint);

// `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")]
static_assert!(MEM_SIZE_OF_TOKEN_STREAM: mem::size_of::<TokenStream>() == 32);
static_assert!(MEM_SIZE_OF_TOKEN_STREAM: mem::size_of::<TokenStream>() == 8);

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum IsJoint {
@@ -201,7 +200,7 @@ impl TokenStream {

impl From<TokenTree> for TokenStream {
fn from(tree: TokenTree) -> TokenStream {
TokenStream::Tree(tree, NonJoint)
TokenStream::new(vec![(tree, NonJoint)])
}
}

@@ -260,7 +259,6 @@ impl TokenStream {
for stream in streams {
match stream {
TokenStream::Empty => {},
TokenStream::Tree(tree, is_joint) => vec.push((tree, is_joint)),
TokenStream::Stream(stream2) => vec.extend(stream2.iter().cloned()),
}
}
@@ -269,21 +267,16 @@ impl TokenStream {
}
}

pub fn new(mut streams: Vec<TreeAndJoint>) -> TokenStream {
pub fn new(streams: Vec<TreeAndJoint>) -> TokenStream {
match streams.len() {
0 => TokenStream::empty(),
1 => {
let (tree, is_joint) = streams.pop().unwrap();
TokenStream::Tree(tree, is_joint)
}
_ => TokenStream::Stream(Lrc::new(streams)),
}
}

pub fn append_to_tree_and_joint_vec(self, vec: &mut Vec<TreeAndJoint>) {
match self {
TokenStream::Empty => {}
TokenStream::Tree(tree, is_joint) => vec.push((tree, is_joint)),
TokenStream::Stream(stream) => vec.extend(stream.iter().cloned()),
}
}
@@ -351,7 +344,6 @@ impl TokenStream {
pub fn map_enumerated<F: FnMut(usize, TokenTree) -> TokenTree>(self, mut f: F) -> TokenStream {
match self {
TokenStream::Empty => TokenStream::Empty,
TokenStream::Tree(tree, is_joint) => TokenStream::Tree(f(0, tree), is_joint),
TokenStream::Stream(stream) => TokenStream::Stream(Lrc::new(
stream
.iter()
@@ -365,7 +357,6 @@ impl TokenStream {
pub fn map<F: FnMut(TokenTree) -> TokenTree>(self, mut f: F) -> TokenStream {
match self {
TokenStream::Empty => TokenStream::Empty,
TokenStream::Tree(tree, is_joint) => TokenStream::Tree(f(tree), is_joint),
TokenStream::Stream(stream) => TokenStream::Stream(Lrc::new(
stream
.iter()
@@ -378,21 +369,13 @@ impl TokenStream {
fn first_tree_and_joint(&self) -> Option<(TokenTree, IsJoint)> {
match self {
TokenStream::Empty => None,
TokenStream::Tree(ref tree, is_joint) => Some((tree.clone(), *is_joint)),
TokenStream::Stream(ref stream) => Some(stream.first().unwrap().clone())
}
}

fn last_tree_if_joint(&self) -> Option<TokenTree> {
match self {
TokenStream::Empty => None,
TokenStream::Tree(ref tree, is_joint) => {
if *is_joint == Joint {
Some(tree.clone())
} else {
None
}
}
TokenStream::Stream(ref stream) => {
if let (tree, Joint) = stream.last().unwrap() {
Some(tree.clone())
@@ -422,7 +405,7 @@ impl TokenStreamBuilder {
self.push_all_but_last_tree(&last_stream);
let glued_span = last_span.to(span);
let glued_tt = TokenTree::Token(glued_span, glued_tok);
let glued_tokenstream = TokenStream::Tree(glued_tt, is_joint);
let glued_tokenstream = TokenStream::new(vec![(glued_tt, is_joint)]);
self.0.push(glued_tokenstream);
self.push_all_but_first_tree(&stream);
return
@@ -441,7 +424,6 @@ impl TokenStreamBuilder {
let len = streams.len();
match len {
1 => {}
2 => self.0.push(TokenStream::Tree(streams[0].0.clone(), streams[0].1)),
_ => self.0.push(TokenStream::Stream(Lrc::new(streams[0 .. len - 1].to_vec()))),
}
}
@@ -452,7 +434,6 @@ impl TokenStreamBuilder {
let len = streams.len();
match len {
1 => {}
2 => self.0.push(TokenStream::Tree(streams[1].0.clone(), streams[1].1)),
_ => self.0.push(TokenStream::Stream(Lrc::new(streams[1 .. len].to_vec()))),
}
}
@@ -481,14 +462,6 @@ impl Cursor {
pub fn next_with_joint(&mut self) -> Option<TreeAndJoint> {
match self.stream {
TokenStream::Empty => None,
TokenStream::Tree(ref tree, ref is_joint) => {
if self.index == 0 {
self.index = 1;
Some((tree.clone(), *is_joint))
} else {
None
}
}
TokenStream::Stream(ref stream) => {
if self.index < stream.len() {
self.index += 1;
@@ -513,13 +486,6 @@ impl Cursor {
pub fn look_ahead(&self, n: usize) -> Option<TokenTree> {
match self.stream {
TokenStream::Empty => None,
TokenStream::Tree(ref tree, _) => {
if n == 0 && self.index == 0 {
Some(tree.clone())
} else {
None
}
}
TokenStream::Stream(ref stream) =>
stream[self.index ..].get(n).map(|(tree, _)| tree.clone()),
}
@@ -542,7 +508,6 @@ impl From<TokenStream> for ThinTokenStream {
fn from(stream: TokenStream) -> ThinTokenStream {
ThinTokenStream(match stream {
TokenStream::Empty => None,
TokenStream::Tree(tree, is_joint) => Some(Lrc::new(vec![(tree, is_joint)])),
TokenStream::Stream(stream) => Some(stream),
})
}
2 changes: 1 addition & 1 deletion src/libsyntax_ext/proc_macro_server.rs
Original file line number Diff line number Diff line change
@@ -269,7 +269,7 @@ impl ToInternal<TokenStream> for TokenTree<Group, Punct, Ident, Literal> {
};

let tree = tokenstream::TokenTree::Token(span, token);
TokenStream::Tree(tree, if joint { Joint } else { NonJoint })
TokenStream::new(vec![(tree, if joint { Joint } else { NonJoint })])
}
}