@@ -125,21 +125,32 @@ fn push_token_from_proc_macro(mut vec: RcVecMut<TokenTree>, token: TokenTree) {
125125// Nonrecursive to prevent stack overflow.
126126impl 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}
0 commit comments