@@ -287,24 +287,26 @@ fn unescape_raw_str_or_byte_str<F>(literal_text: &str, mode: Mode, callback: &mu
287
287
where
288
288
F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
289
289
{
290
- let mut byte_offset: usize = 0 ;
290
+ assert ! ( mode. in_double_quotes( ) ) ;
291
+ let initial_len = literal_text. len ( ) ;
291
292
292
- let mut chars = literal_text. chars ( ) . peekable ( ) ;
293
+ let mut chars = literal_text. chars ( ) ;
293
294
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 ( ) ) {
295
298
( '\r' , Some ( '\n' ) ) => {
296
299
chars. next ( ) ;
297
- ( Ok ( '\n' ) , [ Some ( '\r' ) , Some ( '\n' ) ] )
300
+ Ok ( '\n' )
298
301
} ,
299
- ( '\r' , _) =>
300
- ( Err ( EscapeError :: BareCarriageReturn ) , [ Some ( '\r' ) , None ] ) ,
302
+ ( '\r' , _) => Err ( EscapeError :: BareCarriageReturn ) ,
301
303
( 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) ,
304
306
} ;
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 ) ;
308
310
}
309
311
}
310
312
0 commit comments