Skip to content

Commit 87e04d2

Browse files
authored
Merge pull request #490 from dtolnay/fastdrop
Optimize TokenStream's Drop
2 parents acc7d36 + 029360d commit 87e04d2

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

src/fallback.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -125,21 +125,32 @@ fn push_token_from_proc_macro(mut vec: RcVecMut<TokenTree>, token: TokenTree) {
125125
// Nonrecursive to prevent stack overflow.
126126
impl Drop for TokenStream {
127127
fn drop(&mut self) {
128-
let mut inner = match self.inner.get_mut() {
129-
Some(inner) => inner,
128+
let mut stack = Vec::new();
129+
let mut current = match self.inner.get_mut() {
130+
Some(inner) => inner.take().into_iter(),
130131
None => return,
131132
};
132-
while let Some(token) = inner.pop() {
133-
let group = match token {
134-
TokenTree::Group(group) => group.inner,
135-
_ => continue,
136-
};
137-
#[cfg(wrap_proc_macro)]
138-
let group = match group {
139-
crate::imp::Group::Fallback(group) => group,
140-
crate::imp::Group::Compiler(_) => continue,
141-
};
142-
inner.extend(group.stream.take_inner());
133+
loop {
134+
while let Some(token) = current.next() {
135+
let group = match token {
136+
TokenTree::Group(group) => group.inner,
137+
_ => continue,
138+
};
139+
#[cfg(wrap_proc_macro)]
140+
let group = match group {
141+
crate::imp::Group::Fallback(group) => group,
142+
crate::imp::Group::Compiler(_) => continue,
143+
};
144+
let mut group = group;
145+
if let Some(inner) = group.stream.inner.get_mut() {
146+
stack.push(current);
147+
current = inner.take().into_iter();
148+
}
149+
}
150+
match stack.pop() {
151+
Some(next) => current = next,
152+
None => return,
153+
}
143154
}
144155
}
145156
}

src/rcvec.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,14 @@ impl<'a, T> RcVecMut<'a, T> {
102102
self.inner.extend(iter);
103103
}
104104

105-
pub(crate) fn pop(&mut self) -> Option<T> {
106-
self.inner.pop()
107-
}
108-
109105
pub(crate) fn as_mut(&mut self) -> RcVecMut<T> {
110106
RcVecMut { inner: self.inner }
111107
}
108+
109+
pub(crate) fn take(self) -> RcVecBuilder<T> {
110+
let vec = mem::take(self.inner);
111+
RcVecBuilder { inner: vec }
112+
}
112113
}
113114

114115
impl<T> Clone for RcVec<T> {

0 commit comments

Comments
 (0)