@@ -159,26 +159,8 @@ impl Mode {
159159    } 
160160} 
161161
162- fn  scan_escape ( first_char :  char ,  chars :  & mut  Chars < ' _ > ,  mode :  Mode )  -> Result < char ,  EscapeError >  { 
163-     if  first_char != '\\'  { 
164-         // Previous character was not a slash, and we don't expect it to be 
165-         // an escape-only character. 
166-         return  match  first_char { 
167-             '\t'  | '\n'  => Err ( EscapeError :: EscapeOnlyChar ) , 
168-             '\r'  => Err ( EscapeError :: BareCarriageReturn ) , 
169-             '\''  if  mode. in_single_quotes ( )  => Err ( EscapeError :: EscapeOnlyChar ) , 
170-             '"'  if  mode. in_double_quotes ( )  => Err ( EscapeError :: EscapeOnlyChar ) , 
171-             _ => { 
172-                 if  mode. is_bytes ( )  && !first_char. is_ascii ( )  { 
173-                     // Byte literal can't be a non-ascii character. 
174-                     return  Err ( EscapeError :: NonAsciiCharInByte ) ; 
175-                 } 
176-                 Ok ( first_char) 
177-             } 
178-         } ; 
179-     } 
180- 
181-     // Previous character is '\\', try to unescape it. 
162+ fn  scan_escape ( chars :  & mut  Chars < ' _ > ,  mode :  Mode )  -> Result < char ,  EscapeError >  { 
163+     // Previous character was '\\', unescape what follows. 
182164
183165    let  second_char = chars. next ( ) . ok_or ( EscapeError :: LoneSlash ) ?; 
184166
@@ -270,9 +252,24 @@ fn scan_escape(first_char: char, chars: &mut Chars<'_>, mode: Mode) -> Result<ch
270252    Ok ( res) 
271253} 
272254
255+ #[ inline]  
256+ fn  ascii_check ( first_char :  char ,  mode :  Mode )  -> Result < char ,  EscapeError >  { 
257+     if  mode. is_bytes ( )  && !first_char. is_ascii ( )  { 
258+         // Byte literal can't be a non-ascii character. 
259+         Err ( EscapeError :: NonAsciiCharInByte ) 
260+     }  else  { 
261+         Ok ( first_char) 
262+     } 
263+ } 
264+ 
273265fn  unescape_char_or_byte ( chars :  & mut  Chars < ' _ > ,  mode :  Mode )  -> Result < char ,  EscapeError >  { 
274266    let  first_char = chars. next ( ) . ok_or ( EscapeError :: ZeroChars ) ?; 
275-     let  res = scan_escape ( first_char,  chars,  mode) ?; 
267+     let  res = match  first_char { 
268+         '\\'  => scan_escape ( chars,  mode) , 
269+         '\n'  | '\t'  | '\''  => Err ( EscapeError :: EscapeOnlyChar ) , 
270+         '\r'  => Err ( EscapeError :: BareCarriageReturn ) , 
271+         _ => ascii_check ( first_char,  mode) , 
272+     } ?; 
276273    if  chars. next ( ) . is_some ( )  { 
277274        return  Err ( EscapeError :: MoreThanOneChar ) ; 
278275    } 
@@ -303,12 +300,14 @@ where
303300                        skip_ascii_whitespace ( & mut  chars,  start,  callback) ; 
304301                        continue ; 
305302                    } 
306-                     _ => scan_escape ( first_char ,   & mut  chars,  mode) , 
303+                     _ => scan_escape ( & mut  chars,  mode) , 
307304                } 
308305            } 
309306            '\n'  => Ok ( '\n' ) , 
310307            '\t'  => Ok ( '\t' ) , 
311-             _ => scan_escape ( first_char,  & mut  chars,  mode) , 
308+             '"'  => Err ( EscapeError :: EscapeOnlyChar ) , 
309+             '\r'  => Err ( EscapeError :: BareCarriageReturn ) , 
310+             _ => ascii_check ( first_char,  mode) , 
312311        } ; 
313312        let  end = initial_len - chars. as_str ( ) . len ( ) ; 
314313        callback ( start..end,  unescaped_char) ; 
0 commit comments