@@ -125,21 +125,32 @@ fn push_token_from_proc_macro(mut vec: RcVecMut<TokenTree>, token: TokenTree) {
125
125
// Nonrecursive to prevent stack overflow.
126
126
impl Drop for TokenStream {
127
127
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 ( ) ,
130
131
None => return ,
131
132
} ;
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
+ }
143
154
}
144
155
}
145
156
}
0 commit comments