Skip to content

Commit 172907a

Browse files
committed
Non-recursively drop TokenStream relocating only streams, not tokens
1 parent acc7d36 commit 172907a

File tree

2 files changed

+33
-17
lines changed

2 files changed

+33
-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(),
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.pop() {
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();
148+
}
149+
}
150+
match stack.pop() {
151+
Some(next) => current = next,
152+
None => return,
153+
}
143154
}
144155
}
145156
}

src/rcvec.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ impl<T> RcVecBuilder<T> {
8080
self.inner.extend(iter);
8181
}
8282

83+
pub(crate) fn pop(&mut self) -> Option<T> {
84+
self.inner.pop()
85+
}
86+
8387
pub(crate) fn as_mut(&mut self) -> RcVecMut<T> {
8488
RcVecMut {
8589
inner: &mut self.inner,
@@ -102,13 +106,14 @@ impl<'a, T> RcVecMut<'a, T> {
102106
self.inner.extend(iter);
103107
}
104108

105-
pub(crate) fn pop(&mut self) -> Option<T> {
106-
self.inner.pop()
107-
}
108-
109109
pub(crate) fn as_mut(&mut self) -> RcVecMut<T> {
110110
RcVecMut { inner: self.inner }
111111
}
112+
113+
pub(crate) fn take(self) -> RcVecBuilder<T> {
114+
let vec = mem::take(self.inner);
115+
RcVecBuilder { inner: vec }
116+
}
112117
}
113118

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

0 commit comments

Comments
 (0)