@@ -275,11 +275,13 @@ where
275275 F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
276276{
277277 debug_assert ! ( mode == Mode :: Str || mode == Mode :: ByteStr ) ;
278- let initial_len = src. len ( ) ;
279278 let mut chars = src. chars ( ) ;
280- while let Some ( c) = chars. next ( ) {
281- let start = initial_len - chars. as_str ( ) . len ( ) - c. len_utf8 ( ) ;
282279
280+ // The `start` and `end` computation here is complicated because
281+ // `skip_ascii_whitespace` makes us to skip over chars without counting
282+ // them in the range computation.
283+ while let Some ( c) = chars. next ( ) {
284+ let start = src. len ( ) - chars. as_str ( ) . len ( ) - c. len_utf8 ( ) ;
283285 let result = match c {
284286 '\\' => {
285287 match chars. clone ( ) . next ( ) {
@@ -300,7 +302,7 @@ where
300302 '\r' => Err ( EscapeError :: BareCarriageReturn ) ,
301303 _ => ascii_check ( c, mode) ,
302304 } ;
303- let end = initial_len - chars. as_str ( ) . len ( ) ;
305+ let end = src . len ( ) - chars. as_str ( ) . len ( ) ;
304306 callback ( start..end, result) ;
305307 }
306308
@@ -340,19 +342,19 @@ where
340342 F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
341343{
342344 debug_assert ! ( mode == Mode :: RawStr || mode == Mode :: RawByteStr ) ;
343- let initial_len = src. len ( ) ;
344-
345345 let mut chars = src. chars ( ) ;
346- while let Some ( c) = chars. next ( ) {
347- let start = initial_len - chars. as_str ( ) . len ( ) - c. len_utf8 ( ) ;
348346
347+ // The `start` and `end` computation here matches the one in
348+ // `unescape_str_or_byte_str` for consistency, even though this function
349+ // doesn't have to worry about skipping any chars.
350+ while let Some ( c) = chars. next ( ) {
351+ let start = src. len ( ) - chars. as_str ( ) . len ( ) - c. len_utf8 ( ) ;
349352 let result = match c {
350353 '\r' => Err ( EscapeError :: BareCarriageReturnInRawString ) ,
351354 c if mode. is_bytes ( ) && !c. is_ascii ( ) => Err ( EscapeError :: NonAsciiCharInByteString ) ,
352355 c => Ok ( c) ,
353356 } ;
354- let end = initial_len - chars. as_str ( ) . len ( ) ;
355-
357+ let end = src. len ( ) - chars. as_str ( ) . len ( ) ;
356358 callback ( start..end, result) ;
357359 }
358360}
0 commit comments