File tree 2 files changed +23
-17
lines changed
2 files changed +23
-17
lines changed Original file line number Diff line number Diff line change 16
16
#![ feature( min_specialization) ]
17
17
#![ recursion_limit = "256" ]
18
18
#![ feature( slice_internals) ]
19
+ #![ feature( stmt_expr_attributes) ]
19
20
20
21
#[ macro_use]
21
22
extern crate rustc_macros;
Original file line number Diff line number Diff line change @@ -56,25 +56,30 @@ impl LitKind {
56
56
// new symbol because the string in the LitKind is different to the
57
57
// string in the token.
58
58
let s = symbol. as_str ( ) ;
59
- let symbol =
60
- if s. contains ( & [ '\\' , '\r' ] ) {
61
- let mut buf = String :: with_capacity ( s. len ( ) ) ;
62
- let mut error = Ok ( ( ) ) ;
63
- unescape_literal ( & s, Mode :: Str , & mut |_, unescaped_char| {
64
- match unescaped_char {
65
- Ok ( c) => buf. push ( c) ,
66
- Err ( err) => {
67
- if err. is_fatal ( ) {
68
- error = Err ( LitError :: LexerError ) ;
69
- }
59
+ let symbol = if s. contains ( & [ '\\' , '\r' ] ) {
60
+ let mut buf = String :: with_capacity ( s. len ( ) ) ;
61
+ let mut error = Ok ( ( ) ) ;
62
+ // Force-inlining here is aggressive but the closure is
63
+ // called on every char in the string, so it can be
64
+ // hot in programs with many long strings.
65
+ unescape_literal (
66
+ & s,
67
+ Mode :: Str ,
68
+ & mut #[ inline ( always) ]
69
+ |_, unescaped_char| match unescaped_char {
70
+ Ok ( c) => buf. push ( c) ,
71
+ Err ( err) => {
72
+ if err. is_fatal ( ) {
73
+ error = Err ( LitError :: LexerError ) ;
70
74
}
71
75
}
72
- } ) ;
73
- error?;
74
- Symbol :: intern ( & buf)
75
- } else {
76
- symbol
77
- } ;
76
+ } ,
77
+ ) ;
78
+ error?;
79
+ Symbol :: intern ( & buf)
80
+ } else {
81
+ symbol
82
+ } ;
78
83
LitKind :: Str ( symbol, ast:: StrStyle :: Cooked )
79
84
}
80
85
token:: StrRaw ( n) => {
You can’t perform that action at this time.
0 commit comments