@@ -86,14 +86,12 @@ where
86
86
match mode {
87
87
Mode :: Char | Mode :: Byte => {
88
88
let mut chars = src. chars ( ) ;
89
- let res = unescape_char_or_byte ( & mut chars, mode == Mode :: Byte ) ;
89
+ let res = unescape_char_or_byte ( & mut chars, mode) ;
90
90
callback ( 0 ..( src. len ( ) - chars. as_str ( ) . len ( ) ) , res) ;
91
91
}
92
92
Mode :: Str | Mode :: ByteStr => unescape_str_common ( src, mode, callback) ,
93
93
94
- Mode :: RawStr | Mode :: RawByteStr => {
95
- unescape_raw_str_or_raw_byte_str ( src, mode == Mode :: RawByteStr , callback)
96
- }
94
+ Mode :: RawStr | Mode :: RawByteStr => unescape_raw_str_or_raw_byte_str ( src, mode, callback) ,
97
95
Mode :: CStr | Mode :: RawCStr => unreachable ! ( ) ,
98
96
}
99
97
}
@@ -121,11 +119,9 @@ where
121
119
F : FnMut ( Range < usize > , Result < CStrUnit , EscapeError > ) ,
122
120
{
123
121
if mode == Mode :: RawCStr {
124
- unescape_raw_str_or_raw_byte_str (
125
- src,
126
- mode. characters_should_be_ascii ( ) ,
127
- & mut |r, result| callback ( r, result. map ( CStrUnit :: Char ) ) ,
128
- ) ;
122
+ unescape_raw_str_or_raw_byte_str ( src, mode, & mut |r, result| {
123
+ callback ( r, result. map ( CStrUnit :: Char ) )
124
+ } ) ;
129
125
} else {
130
126
unescape_str_common ( src, mode, callback) ;
131
127
}
@@ -134,13 +130,13 @@ where
134
130
/// Takes a contents of a char literal (without quotes), and returns an
135
131
/// unescaped char or an error.
136
132
pub fn unescape_char ( src : & str ) -> Result < char , EscapeError > {
137
- unescape_char_or_byte ( & mut src. chars ( ) , false )
133
+ unescape_char_or_byte ( & mut src. chars ( ) , Mode :: Char )
138
134
}
139
135
140
136
/// Takes a contents of a byte literal (without quotes), and returns an
141
137
/// unescaped byte or an error.
142
138
pub fn unescape_byte ( src : & str ) -> Result < u8 , EscapeError > {
143
- unescape_char_or_byte ( & mut src. chars ( ) , true ) . map ( byte_from_char)
139
+ unescape_char_or_byte ( & mut src. chars ( ) , Mode :: Byte ) . map ( byte_from_char)
144
140
}
145
141
146
142
/// What kind of literal do we parse.
@@ -179,7 +175,8 @@ impl Mode {
179
175
}
180
176
181
177
/// Whether characters within the literal must be within the ASCII range
182
- fn characters_should_be_ascii ( self ) -> bool {
178
+ #[ inline]
179
+ fn chars_should_be_ascii ( self ) -> bool {
183
180
match self {
184
181
Mode :: Byte | Mode :: ByteStr | Mode :: RawByteStr => true ,
185
182
Mode :: Char | Mode :: Str | Mode :: RawStr | Mode :: CStr | Mode :: RawCStr => false ,
@@ -298,22 +295,21 @@ fn scan_unicode(
298
295
}
299
296
300
297
#[ inline]
301
- fn ascii_check ( c : char , characters_should_be_ascii : bool ) -> Result < char , EscapeError > {
302
- if characters_should_be_ascii && !c. is_ascii ( ) {
303
- // Byte literal can't be a non-ascii character.
298
+ fn ascii_check ( c : char , chars_should_be_ascii : bool ) -> Result < char , EscapeError > {
299
+ if chars_should_be_ascii && !c. is_ascii ( ) {
304
300
Err ( EscapeError :: NonAsciiCharInByte )
305
301
} else {
306
302
Ok ( c)
307
303
}
308
304
}
309
305
310
- fn unescape_char_or_byte ( chars : & mut Chars < ' _ > , is_byte : bool ) -> Result < char , EscapeError > {
306
+ fn unescape_char_or_byte ( chars : & mut Chars < ' _ > , mode : Mode ) -> Result < char , EscapeError > {
311
307
let c = chars. next ( ) . ok_or ( EscapeError :: ZeroChars ) ?;
312
308
let res = match c {
313
- '\\' => scan_escape ( chars, if is_byte { Mode :: Byte } else { Mode :: Char } ) ,
309
+ '\\' => scan_escape ( chars, mode ) ,
314
310
'\n' | '\t' | '\'' => Err ( EscapeError :: EscapeOnlyChar ) ,
315
311
'\r' => Err ( EscapeError :: BareCarriageReturn ) ,
316
- _ => ascii_check ( c, is_byte ) ,
312
+ _ => ascii_check ( c, mode . chars_should_be_ascii ( ) ) ,
317
313
} ?;
318
314
if chars. next ( ) . is_some ( ) {
319
315
return Err ( EscapeError :: MoreThanOneChar ) ;
@@ -328,6 +324,7 @@ where
328
324
F : FnMut ( Range < usize > , Result < T , EscapeError > ) ,
329
325
{
330
326
let mut chars = src. chars ( ) ;
327
+ let chars_should_be_ascii = mode. chars_should_be_ascii ( ) ; // get this outside the loop
331
328
332
329
// The `start` and `end` computation here is complicated because
333
330
// `skip_ascii_whitespace` makes us to skip over chars without counting
@@ -352,7 +349,7 @@ where
352
349
}
353
350
'"' => Err ( EscapeError :: EscapeOnlyChar ) ,
354
351
'\r' => Err ( EscapeError :: BareCarriageReturn ) ,
355
- _ => ascii_check ( c, mode . characters_should_be_ascii ( ) ) . map ( Into :: into) ,
352
+ _ => ascii_check ( c, chars_should_be_ascii ) . map ( Into :: into) ,
356
353
} ;
357
354
let end = src. len ( ) - chars. as_str ( ) . len ( ) ;
358
355
callback ( start..end, res. map ( Into :: into) ) ;
@@ -389,11 +386,12 @@ where
389
386
/// sequence of characters or errors.
390
387
/// NOTE: Raw strings do not perform any explicit character escaping, here we
391
388
/// only produce errors on bare CR.
392
- fn unescape_raw_str_or_raw_byte_str < F > ( src : & str , is_byte : bool , callback : & mut F )
389
+ fn unescape_raw_str_or_raw_byte_str < F > ( src : & str , mode : Mode , callback : & mut F )
393
390
where
394
391
F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
395
392
{
396
393
let mut chars = src. chars ( ) ;
394
+ let chars_should_be_ascii = mode. chars_should_be_ascii ( ) ; // get this outside the loop
397
395
398
396
// The `start` and `end` computation here matches the one in
399
397
// `unescape_str_common` for consistency, even though this function
@@ -402,7 +400,7 @@ where
402
400
let start = src. len ( ) - chars. as_str ( ) . len ( ) - c. len_utf8 ( ) ;
403
401
let res = match c {
404
402
'\r' => Err ( EscapeError :: BareCarriageReturnInRawString ) ,
405
- _ => ascii_check ( c, is_byte ) ,
403
+ _ => ascii_check ( c, chars_should_be_ascii ) ,
406
404
} ;
407
405
let end = src. len ( ) - chars. as_str ( ) . len ( ) ;
408
406
callback ( start..end, res) ;
0 commit comments