@@ -376,18 +376,19 @@ fn make_attr_token_stream(
376
376
open_delim_sp : Option < ( Delimiter , Span , Spacing ) > ,
377
377
inner : Vec < AttrTokenTree > ,
378
378
}
379
- let mut stack = vec ! [ FrameData { open_delim_sp: None , inner: vec![ ] } ] ;
379
+ // The stack always has at least one element. Storing it separately makes for shorter code.
380
+ let mut stack_top = FrameData { open_delim_sp : None , inner : vec ! [ ] } ;
381
+ let mut stack_rest = vec ! [ ] ;
380
382
for ( token, spacing) in iter {
381
383
match token {
382
384
FlatToken :: Token ( Token { kind : TokenKind :: OpenDelim ( delim) , span } ) => {
383
- stack
384
- . push ( FrameData { open_delim_sp : Some ( ( delim, span, spacing) ) , inner : vec ! [ ] } ) ;
385
+ stack_rest. push ( mem:: replace (
386
+ & mut stack_top,
387
+ FrameData { open_delim_sp : Some ( ( delim, span, spacing) ) , inner : vec ! [ ] } ,
388
+ ) ) ;
385
389
}
386
390
FlatToken :: Token ( Token { kind : TokenKind :: CloseDelim ( delim) , span } ) => {
387
- let frame_data = stack
388
- . pop ( )
389
- . unwrap_or_else ( || panic ! ( "Token stack was empty for token: {token:?}" ) ) ;
390
-
391
+ let frame_data = mem:: replace ( & mut stack_top, stack_rest. pop ( ) . unwrap ( ) ) ;
391
392
let ( open_delim, open_sp, open_spacing) = frame_data. open_delim_sp . unwrap ( ) ;
392
393
assert_eq ! (
393
394
open_delim, delim,
@@ -397,43 +398,33 @@ fn make_attr_token_stream(
397
398
let dspacing = DelimSpacing :: new ( open_spacing, spacing) ;
398
399
let stream = AttrTokenStream :: new ( frame_data. inner ) ;
399
400
let delimited = AttrTokenTree :: Delimited ( dspan, dspacing, delim, stream) ;
400
- stack
401
- . last_mut ( )
402
- . unwrap_or_else ( || panic ! ( "Bottom token frame is missing for token: {token:?}" ) )
403
- . inner
404
- . push ( delimited ) ;
401
+ stack_top . inner . push ( delimited ) ;
402
+ }
403
+ FlatToken :: Token ( token ) => stack_top . inner . push ( AttrTokenTree :: Token ( token, spacing ) ) ,
404
+ FlatToken :: AttrsTarget ( target ) => {
405
+ stack_top . inner . push ( AttrTokenTree :: AttrsTarget ( target ) )
405
406
}
406
- FlatToken :: Token ( token) => stack
407
- . last_mut ( )
408
- . expect ( "Bottom token frame is missing!" )
409
- . inner
410
- . push ( AttrTokenTree :: Token ( token, spacing) ) ,
411
- FlatToken :: AttrsTarget ( target) => stack
412
- . last_mut ( )
413
- . expect ( "Bottom token frame is missing!" )
414
- . inner
415
- . push ( AttrTokenTree :: AttrsTarget ( target) ) ,
416
407
FlatToken :: Empty => { }
417
408
}
418
409
}
419
- let mut final_buf = stack . pop ( ) . expect ( "Missing final buf!" ) ;
410
+
420
411
if break_last_token {
421
- let last_token = final_buf . inner . pop ( ) . unwrap ( ) ;
412
+ let last_token = stack_top . inner . pop ( ) . unwrap ( ) ;
422
413
if let AttrTokenTree :: Token ( last_token, spacing) = last_token {
423
414
let unglued_first = last_token. kind . break_two_token_op ( ) . unwrap ( ) . 0 ;
424
415
425
416
// An 'unglued' token is always two ASCII characters
426
417
let mut first_span = last_token. span . shrink_to_lo ( ) ;
427
418
first_span = first_span. with_hi ( first_span. lo ( ) + rustc_span:: BytePos ( 1 ) ) ;
428
419
429
- final_buf
420
+ stack_top
430
421
. inner
431
422
. push ( AttrTokenTree :: Token ( Token :: new ( unglued_first, first_span) , spacing) ) ;
432
423
} else {
433
424
panic ! ( "Unexpected last token {last_token:?}" )
434
425
}
435
426
}
436
- AttrTokenStream :: new ( final_buf . inner )
427
+ AttrTokenStream :: new ( stack_top . inner )
437
428
}
438
429
439
430
// Some types are used a lot. Make sure they don't unintentionally get bigger.
0 commit comments