Fix find_width_of_character_at_span bounds check
Commit 0bd96671f0
added bounds checking of our current target byte
position to prevent infinite loops. Unfortunately it was comparing the
file-relative `target` versus the global relative `file_start_pos` and
`file_end_pos`.
The result is failing to detect multibyte characters unless their
file-relative offset fit within their global offset. This causes other
parts of the compiler to generate spans pointing to the middle of a
multibyte character which will ultimately panic in
`bytepos_to_file_charpos`.
Fix by comparing the `target` to the total file size when moving forward
and doing checked subtraction when moving backwards. This should
preserve the intent of the bounds check while removing the offset
confusion.
Fixes #48508
This commit is contained in:
parent
6070d3e47e
commit
d27fac618d
1 changed files with 11 additions and 8 deletions
|
@ -705,17 +705,20 @@ impl CodeMap {
|
|||
};
|
||||
debug!("find_width_of_character_at_span: snippet=`{:?}`", snippet);
|
||||
|
||||
let file_start_pos = local_begin.fm.start_pos.to_usize();
|
||||
let file_end_pos = local_begin.fm.end_pos.to_usize();
|
||||
debug!("find_width_of_character_at_span: file_start_pos=`{:?}` file_end_pos=`{:?}`",
|
||||
file_start_pos, file_end_pos);
|
||||
|
||||
let mut target = if forwards { end_index + 1 } else { end_index - 1 };
|
||||
debug!("find_width_of_character_at_span: initial target=`{:?}`", target);
|
||||
|
||||
while !snippet.is_char_boundary(target - start_index)
|
||||
&& target >= file_start_pos && target <= file_end_pos {
|
||||
target = if forwards { target + 1 } else { target - 1 };
|
||||
while !snippet.is_char_boundary(target - start_index) && target < source_len {
|
||||
target = if forwards {
|
||||
target + 1
|
||||
} else {
|
||||
match target.checked_sub(1) {
|
||||
Some(target) => target,
|
||||
None => {
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
debug!("find_width_of_character_at_span: target=`{:?}`", target);
|
||||
}
|
||||
debug!("find_width_of_character_at_span: final target=`{:?}`", target);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue