Avoid redundant WTF-8 checks in PathBuf

Eliminate checks for WTF-8 boundaries in `PathBuf::set_extension` and
`add_extension`, where joining WTF-8 surrogate halves is impossible.
Don't convert the `str` to `OsStr`, because `OsString::push` specializes
to skip the joining when given strings.
This commit is contained in:
Thalia Archibald
2025-04-22 03:31:45 -07:00
parent 7cb357a36b
commit 0f0c0d8b16

View File

@@ -1526,11 +1526,13 @@ impl PathBuf {
self.inner.truncate(end_file_stem.wrapping_sub(start));
// add the new extension, if any
let new = extension;
let new = extension.as_encoded_bytes();
if !new.is_empty() {
self.inner.reserve_exact(new.len() + 1);
self.inner.push(OsStr::new("."));
self.inner.push(new);
self.inner.push(".");
// SAFETY: Since a UTF-8 string was just pushed, it is not possible
// for the buffer to end with a surrogate half.
unsafe { self.inner.extend_from_slice_unchecked(new) };
}
true
@@ -1587,7 +1589,7 @@ impl PathBuf {
Some(f) => f.as_encoded_bytes(),
};
let new = extension;
let new = extension.as_encoded_bytes();
if !new.is_empty() {
// truncate until right after the file name
// this is necessary for trimming the trailing slash
@@ -1597,8 +1599,10 @@ impl PathBuf {
// append the new extension
self.inner.reserve_exact(new.len() + 1);
self.inner.push(OsStr::new("."));
self.inner.push(new);
self.inner.push(".");
// SAFETY: Since a UTF-8 string was just pushed, it is not possible
// for the buffer to end with a surrogate half.
unsafe { self.inner.extend_from_slice_unchecked(new) };
}
true