@@ -287,24 +287,26 @@ fn unescape_raw_str_or_byte_str<F>(literal_text: &str, mode: Mode, callback: &mu
287287where
288288 F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
289289{
290- let mut byte_offset: usize = 0 ;
290+ assert ! ( mode. in_double_quotes( ) ) ;
291+ let initial_len = literal_text. len ( ) ;
291292
292- let mut chars = literal_text. chars ( ) . peekable ( ) ;
293+ let mut chars = literal_text. chars ( ) ;
293294 while let Some ( curr) = chars. next ( ) {
294- let ( result, scanned) = match ( curr, chars. peek ( ) ) {
295+ let start = initial_len - chars. as_str ( ) . len ( ) - curr. len_utf8 ( ) ;
296+
297+ let result = match ( curr, chars. clone ( ) . next ( ) ) {
295298 ( '\r' , Some ( '\n' ) ) => {
296299 chars. next ( ) ;
297- ( Ok ( '\n' ) , [ Some ( '\r' ) , Some ( '\n' ) ] )
300+ Ok ( '\n' )
298301 } ,
299- ( '\r' , _) =>
300- ( Err ( EscapeError :: BareCarriageReturn ) , [ Some ( '\r' ) , None ] ) ,
302+ ( '\r' , _) => Err ( EscapeError :: BareCarriageReturn ) ,
301303 ( c, _) if mode. is_bytes ( ) && !c. is_ascii ( ) =>
302- ( Err ( EscapeError :: NonAsciiCharInByteString ) , [ Some ( c ) , None ] ) ,
303- ( c, _) => ( Ok ( c) , [ Some ( c ) , None ] ) ,
304+ Err ( EscapeError :: NonAsciiCharInByteString ) ,
305+ ( c, _) => Ok ( c) ,
304306 } ;
305- let len_utf8 : usize = scanned . iter ( ) . filter_map ( | & x| x ) . map ( char :: len_utf8 ) . sum ( ) ;
306- callback ( byte_offset.. ( byte_offset + len_utf8 ) , result ) ;
307- byte_offset += len_utf8 ;
307+ let end = initial_len - chars . as_str ( ) . len ( ) ;
308+
309+ callback ( start..end , result ) ;
308310 }
309311}
310312
0 commit comments