core: Remove an implicit panic from Formatter::pad
The expression `&s[..i]` in general can panic if `i` is out of bounds or not on a character boundary for a string, and this caused the codegen for `Formatter::pad` to be a bit larger than it otherwise needed to be. This commit replaces this with `s.get(..i).unwrap_or(&s)` which while having different behavior if `i` is out of bounds has a much smaller code footprint and otherwise avoids the need for `unsafe` code.
This commit is contained in:
parent
66c5e3ffb2
commit
2bb5b5c07c
1 changed files with 5 additions and 1 deletions
|
|
@ -1212,7 +1212,11 @@ impl<'a> Formatter<'a> {
|
|||
// truncation. However other flags like `fill`, `width` and `align`
|
||||
// must act as always.
|
||||
if let Some((i, _)) = s.char_indices().skip(max).next() {
|
||||
&s[..i]
|
||||
// LLVM here can't prove that `..i` won't panic `&s[..i]`, but
|
||||
// we know that it can't panic. Use `get` + `unwrap_or` to avoid
|
||||
// `unsafe` and otherwise don't emit any panic-related code
|
||||
// here.
|
||||
s.get(..i).unwrap_or(&s)
|
||||
} else {
|
||||
&s
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue