Skip to content

Commit 28966e1

Browse files
committed
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.)
1 parent 2cf736f commit 28966e1

File tree

2 files changed

+6
-41
lines changed

2 files changed

+6
-41
lines changed

src/libsyntax/tokenstream.rs

+5-40
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ impl TokenTree {
113113
}
114114

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

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

153152
pub type TreeAndJoint = (TokenTree, IsJoint);
154153

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

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

202201
impl From<TokenTree> for TokenStream {
203202
fn from(tree: TokenTree) -> TokenStream {
204-
TokenStream::Tree(tree, NonJoint)
203+
TokenStream::new(vec![(tree, NonJoint)])
205204
}
206205
}
207206

@@ -260,7 +259,6 @@ impl TokenStream {
260259
for stream in streams {
261260
match stream {
262261
TokenStream::Empty => {},
263-
TokenStream::Tree(tree, is_joint) => vec.push((tree, is_joint)),
264262
TokenStream::Stream(stream2) => vec.extend(stream2.iter().cloned()),
265263
}
266264
}
@@ -269,21 +267,16 @@ impl TokenStream {
269267
}
270268
}
271269

272-
pub fn new(mut streams: Vec<TreeAndJoint>) -> TokenStream {
270+
pub fn new(streams: Vec<TreeAndJoint>) -> TokenStream {
273271
match streams.len() {
274272
0 => TokenStream::empty(),
275-
1 => {
276-
let (tree, is_joint) = streams.pop().unwrap();
277-
TokenStream::Tree(tree, is_joint)
278-
}
279273
_ => TokenStream::Stream(Lrc::new(streams)),
280274
}
281275
}
282276

283277
pub fn append_to_tree_and_joint_vec(self, vec: &mut Vec<TreeAndJoint>) {
284278
match self {
285279
TokenStream::Empty => {}
286-
TokenStream::Tree(tree, is_joint) => vec.push((tree, is_joint)),
287280
TokenStream::Stream(stream) => vec.extend(stream.iter().cloned()),
288281
}
289282
}
@@ -351,7 +344,6 @@ impl TokenStream {
351344
pub fn map_enumerated<F: FnMut(usize, TokenTree) -> TokenTree>(self, mut f: F) -> TokenStream {
352345
match self {
353346
TokenStream::Empty => TokenStream::Empty,
354-
TokenStream::Tree(tree, is_joint) => TokenStream::Tree(f(0, tree), is_joint),
355347
TokenStream::Stream(stream) => TokenStream::Stream(Lrc::new(
356348
stream
357349
.iter()
@@ -365,7 +357,6 @@ impl TokenStream {
365357
pub fn map<F: FnMut(TokenTree) -> TokenTree>(self, mut f: F) -> TokenStream {
366358
match self {
367359
TokenStream::Empty => TokenStream::Empty,
368-
TokenStream::Tree(tree, is_joint) => TokenStream::Tree(f(tree), is_joint),
369360
TokenStream::Stream(stream) => TokenStream::Stream(Lrc::new(
370361
stream
371362
.iter()
@@ -378,21 +369,13 @@ impl TokenStream {
378369
fn first_tree_and_joint(&self) -> Option<(TokenTree, IsJoint)> {
379370
match self {
380371
TokenStream::Empty => None,
381-
TokenStream::Tree(ref tree, is_joint) => Some((tree.clone(), *is_joint)),
382372
TokenStream::Stream(ref stream) => Some(stream.first().unwrap().clone())
383373
}
384374
}
385375

386376
fn last_tree_if_joint(&self) -> Option<TokenTree> {
387377
match self {
388378
TokenStream::Empty => None,
389-
TokenStream::Tree(ref tree, is_joint) => {
390-
if *is_joint == Joint {
391-
Some(tree.clone())
392-
} else {
393-
None
394-
}
395-
}
396379
TokenStream::Stream(ref stream) => {
397380
if let (tree, Joint) = stream.last().unwrap() {
398381
Some(tree.clone())
@@ -422,7 +405,7 @@ impl TokenStreamBuilder {
422405
self.push_all_but_last_tree(&last_stream);
423406
let glued_span = last_span.to(span);
424407
let glued_tt = TokenTree::Token(glued_span, glued_tok);
425-
let glued_tokenstream = TokenStream::Tree(glued_tt, is_joint);
408+
let glued_tokenstream = TokenStream::new(vec![(glued_tt, is_joint)]);
426409
self.0.push(glued_tokenstream);
427410
self.push_all_but_first_tree(&stream);
428411
return
@@ -441,7 +424,6 @@ impl TokenStreamBuilder {
441424
let len = streams.len();
442425
match len {
443426
1 => {}
444-
2 => self.0.push(TokenStream::Tree(streams[0].0.clone(), streams[0].1)),
445427
_ => self.0.push(TokenStream::Stream(Lrc::new(streams[0 .. len - 1].to_vec()))),
446428
}
447429
}
@@ -452,7 +434,6 @@ impl TokenStreamBuilder {
452434
let len = streams.len();
453435
match len {
454436
1 => {}
455-
2 => self.0.push(TokenStream::Tree(streams[1].0.clone(), streams[1].1)),
456437
_ => self.0.push(TokenStream::Stream(Lrc::new(streams[1 .. len].to_vec()))),
457438
}
458439
}
@@ -481,14 +462,6 @@ impl Cursor {
481462
pub fn next_with_joint(&mut self) -> Option<TreeAndJoint> {
482463
match self.stream {
483464
TokenStream::Empty => None,
484-
TokenStream::Tree(ref tree, ref is_joint) => {
485-
if self.index == 0 {
486-
self.index = 1;
487-
Some((tree.clone(), *is_joint))
488-
} else {
489-
None
490-
}
491-
}
492465
TokenStream::Stream(ref stream) => {
493466
if self.index < stream.len() {
494467
self.index += 1;
@@ -513,13 +486,6 @@ impl Cursor {
513486
pub fn look_ahead(&self, n: usize) -> Option<TokenTree> {
514487
match self.stream {
515488
TokenStream::Empty => None,
516-
TokenStream::Tree(ref tree, _) => {
517-
if n == 0 && self.index == 0 {
518-
Some(tree.clone())
519-
} else {
520-
None
521-
}
522-
}
523489
TokenStream::Stream(ref stream) =>
524490
stream[self.index ..].get(n).map(|(tree, _)| tree.clone()),
525491
}
@@ -542,7 +508,6 @@ impl From<TokenStream> for ThinTokenStream {
542508
fn from(stream: TokenStream) -> ThinTokenStream {
543509
ThinTokenStream(match stream {
544510
TokenStream::Empty => None,
545-
TokenStream::Tree(tree, is_joint) => Some(Lrc::new(vec![(tree, is_joint)])),
546511
TokenStream::Stream(stream) => Some(stream),
547512
})
548513
}

src/libsyntax_ext/proc_macro_server.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ impl ToInternal<TokenStream> for TokenTree<Group, Punct, Ident, Literal> {
269269
};
270270

271271
let tree = tokenstream::TokenTree::Token(span, token);
272-
TokenStream::Tree(tree, if joint { Joint } else { NonJoint })
272+
TokenStream::new(vec![(tree, if joint { Joint } else { NonJoint })])
273273
}
274274
}
275275

0 commit comments

Comments
 (0)