mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-19 18:34:08 +00:00
refactor: Remove redundant, private OsStr::bytes
This commit is contained in:
parent
8d2beb50c2
commit
7f1a6cd421
@ -702,7 +702,7 @@ impl OsStr {
|
||||
/// [conversions]: super#conversions
|
||||
#[inline]
|
||||
#[unstable(feature = "os_str_bytes", issue = "111544")]
|
||||
pub fn from_os_str_bytes_unchecked(bytes: &[u8]) -> &Self {
|
||||
pub unsafe fn from_os_str_bytes_unchecked(bytes: &[u8]) -> &Self {
|
||||
Self::from_inner(Slice::from_os_str_bytes_unchecked(bytes))
|
||||
}
|
||||
|
||||
@ -891,15 +891,6 @@ impl OsStr {
|
||||
self.inner.as_os_str_bytes()
|
||||
}
|
||||
|
||||
/// Gets the underlying byte representation.
|
||||
///
|
||||
/// Note: it is *crucial* that this API is not externally public, to avoid
|
||||
/// revealing the internal, platform-specific encodings.
|
||||
#[inline]
|
||||
pub(crate) fn bytes(&self) -> &[u8] {
|
||||
self.as_os_str_bytes()
|
||||
}
|
||||
|
||||
/// Converts this string to its ASCII lower case equivalent in-place.
|
||||
///
|
||||
/// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
|
||||
@ -1185,7 +1176,7 @@ impl Default for &OsStr {
|
||||
impl PartialEq for OsStr {
|
||||
#[inline]
|
||||
fn eq(&self, other: &OsStr) -> bool {
|
||||
self.bytes().eq(other.bytes())
|
||||
self.as_os_str_bytes().eq(other.as_os_str_bytes())
|
||||
}
|
||||
}
|
||||
|
||||
@ -1212,23 +1203,23 @@ impl Eq for OsStr {}
|
||||
impl PartialOrd for OsStr {
|
||||
#[inline]
|
||||
fn partial_cmp(&self, other: &OsStr) -> Option<cmp::Ordering> {
|
||||
self.bytes().partial_cmp(other.bytes())
|
||||
self.as_os_str_bytes().partial_cmp(other.as_os_str_bytes())
|
||||
}
|
||||
#[inline]
|
||||
fn lt(&self, other: &OsStr) -> bool {
|
||||
self.bytes().lt(other.bytes())
|
||||
self.as_os_str_bytes().lt(other.as_os_str_bytes())
|
||||
}
|
||||
#[inline]
|
||||
fn le(&self, other: &OsStr) -> bool {
|
||||
self.bytes().le(other.bytes())
|
||||
self.as_os_str_bytes().le(other.as_os_str_bytes())
|
||||
}
|
||||
#[inline]
|
||||
fn gt(&self, other: &OsStr) -> bool {
|
||||
self.bytes().gt(other.bytes())
|
||||
self.as_os_str_bytes().gt(other.as_os_str_bytes())
|
||||
}
|
||||
#[inline]
|
||||
fn ge(&self, other: &OsStr) -> bool {
|
||||
self.bytes().ge(other.bytes())
|
||||
self.as_os_str_bytes().ge(other.as_os_str_bytes())
|
||||
}
|
||||
}
|
||||
|
||||
@ -1247,7 +1238,7 @@ impl PartialOrd<str> for OsStr {
|
||||
impl Ord for OsStr {
|
||||
#[inline]
|
||||
fn cmp(&self, other: &OsStr) -> cmp::Ordering {
|
||||
self.bytes().cmp(other.bytes())
|
||||
self.as_os_str_bytes().cmp(other.as_os_str_bytes())
|
||||
}
|
||||
}
|
||||
|
||||
@ -1297,7 +1288,7 @@ impl_cmp!(Cow<'a, OsStr>, OsString);
|
||||
impl Hash for OsStr {
|
||||
#[inline]
|
||||
fn hash<H: Hasher>(&self, state: &mut H) {
|
||||
self.bytes().hash(state)
|
||||
self.as_os_str_bytes().hash(state)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -193,7 +193,7 @@ impl<'a> Prefix<'a> {
|
||||
fn len(&self) -> usize {
|
||||
use self::Prefix::*;
|
||||
fn os_str_len(s: &OsStr) -> usize {
|
||||
s.bytes().len()
|
||||
s.as_os_str_bytes().len()
|
||||
}
|
||||
match *self {
|
||||
Verbatim(x) => 4 + os_str_len(x),
|
||||
@ -330,7 +330,7 @@ fn has_physical_root(s: &[u8], prefix: Option<Prefix<'_>>) -> bool {
|
||||
|
||||
// basic workhorse for splitting stem and extension
|
||||
fn rsplit_file_at_dot(file: &OsStr) -> (Option<&OsStr>, Option<&OsStr>) {
|
||||
if file.bytes() == b".." {
|
||||
if file.as_os_str_bytes() == b".." {
|
||||
return (Some(file), None);
|
||||
}
|
||||
|
||||
@ -338,7 +338,7 @@ fn rsplit_file_at_dot(file: &OsStr) -> (Option<&OsStr>, Option<&OsStr>) {
|
||||
// and back. This is safe to do because (1) we only look at ASCII
|
||||
// contents of the encoding and (2) new &OsStr values are produced
|
||||
// only from ASCII-bounded slices of existing &OsStr values.
|
||||
let mut iter = file.bytes().rsplitn(2, |b| *b == b'.');
|
||||
let mut iter = file.as_os_str_bytes().rsplitn(2, |b| *b == b'.');
|
||||
let after = iter.next();
|
||||
let before = iter.next();
|
||||
if before == Some(b"") {
|
||||
@ -349,7 +349,7 @@ fn rsplit_file_at_dot(file: &OsStr) -> (Option<&OsStr>, Option<&OsStr>) {
|
||||
}
|
||||
|
||||
fn split_file_at_dot(file: &OsStr) -> (&OsStr, Option<&OsStr>) {
|
||||
let slice = file.bytes();
|
||||
let slice = file.as_os_str_bytes();
|
||||
if slice == b".." {
|
||||
return (file, None);
|
||||
}
|
||||
@ -1481,17 +1481,17 @@ impl PathBuf {
|
||||
fn _set_extension(&mut self, extension: &OsStr) -> bool {
|
||||
let file_stem = match self.file_stem() {
|
||||
None => return false,
|
||||
Some(f) => f.bytes(),
|
||||
Some(f) => f.as_os_str_bytes(),
|
||||
};
|
||||
|
||||
// truncate until right after the file stem
|
||||
let end_file_stem = file_stem[file_stem.len()..].as_ptr().addr();
|
||||
let start = self.inner.bytes().as_ptr().addr();
|
||||
let start = self.inner.as_os_str_bytes().as_ptr().addr();
|
||||
let v = self.as_mut_vec();
|
||||
v.truncate(end_file_stem.wrapping_sub(start));
|
||||
|
||||
// add the new extension, if any
|
||||
let new = extension.bytes();
|
||||
let new = extension.as_os_str_bytes();
|
||||
if !new.is_empty() {
|
||||
v.reserve_exact(new.len() + 1);
|
||||
v.push(b'.');
|
||||
@ -2015,7 +2015,7 @@ impl Path {
|
||||
}
|
||||
// The following (private!) function reveals the byte encoding used for OsStr.
|
||||
fn as_u8_slice(&self) -> &[u8] {
|
||||
self.inner.bytes()
|
||||
self.inner.as_os_str_bytes()
|
||||
}
|
||||
|
||||
/// Directly wraps a string slice as a `Path` slice.
|
||||
|
@ -19,7 +19,7 @@ pub fn run_path_with_cstr<T, F>(path: &Path, f: F) -> io::Result<T>
|
||||
where
|
||||
F: FnOnce(&CStr) -> io::Result<T>,
|
||||
{
|
||||
run_with_cstr(path.as_os_str().bytes(), f)
|
||||
run_with_cstr(path.as_os_str().as_os_str_bytes(), f)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -8,7 +8,7 @@ use core::iter::repeat;
|
||||
fn stack_allocation_works() {
|
||||
let path = Path::new("abc");
|
||||
let result = run_path_with_cstr(path, |p| {
|
||||
assert_eq!(p, &*CString::new(path.as_os_str().bytes()).unwrap());
|
||||
assert_eq!(p, &*CString::new(path.as_os_str().as_os_str_bytes()).unwrap());
|
||||
Ok(42)
|
||||
});
|
||||
assert_eq!(result.unwrap(), 42);
|
||||
@ -25,7 +25,7 @@ fn heap_allocation_works() {
|
||||
let path = repeat("a").take(384).collect::<String>();
|
||||
let path = Path::new(&path);
|
||||
let result = run_path_with_cstr(path, |p| {
|
||||
assert_eq!(p, &*CString::new(path.as_os_str().bytes()).unwrap());
|
||||
assert_eq!(p, &*CString::new(path.as_os_str().as_os_str_bytes()).unwrap());
|
||||
Ok(42)
|
||||
});
|
||||
assert_eq!(result.unwrap(), 42);
|
||||
|
@ -30,7 +30,7 @@ pub(crate) fn absolute(path: &Path) -> io::Result<PathBuf> {
|
||||
|
||||
// Get the components, skipping the redundant leading "." component if it exists.
|
||||
let mut components = path.strip_prefix(".").unwrap_or(path).components();
|
||||
let path_os = path.as_os_str().bytes();
|
||||
let path_os = path.as_os_str().as_os_str_bytes();
|
||||
|
||||
let mut normalized = if path.is_absolute() {
|
||||
// "If a pathname begins with two successive <slash> characters, the
|
||||
|
@ -164,9 +164,9 @@ pub enum ProgramKind {
|
||||
|
||||
impl ProgramKind {
|
||||
fn new(program: &OsStr) -> Self {
|
||||
if program.bytes().starts_with(b"/") {
|
||||
if program.as_os_str_bytes().starts_with(b"/") {
|
||||
Self::Absolute
|
||||
} else if program.bytes().contains(&b'/') {
|
||||
} else if program.as_os_str_bytes().contains(&b'/') {
|
||||
// If the program has more than one component in it, it is a relative path.
|
||||
Self::Relative
|
||||
} else {
|
||||
|
@ -226,7 +226,7 @@ pub(crate) fn append_arg(cmd: &mut Vec<u16>, arg: &Arg, force_quotes: bool) -> i
|
||||
// that it actually gets passed through on the command line or otherwise
|
||||
// it will be dropped entirely when parsed on the other end.
|
||||
ensure_no_nuls(arg)?;
|
||||
let arg_bytes = arg.bytes();
|
||||
let arg_bytes = arg.as_os_str_bytes();
|
||||
let (quote, escape) = match quote {
|
||||
Quote::Always => (true, true),
|
||||
Quote::Auto => {
|
||||
@ -297,7 +297,9 @@ pub(crate) fn make_bat_command_line(
|
||||
// * `|<>` pipe/redirect characters.
|
||||
const SPECIAL: &[u8] = b"\t &()[]{}^=;!'+,`~%|<>";
|
||||
let force_quotes = match arg {
|
||||
Arg::Regular(arg) if !force_quotes => arg.bytes().iter().any(|c| SPECIAL.contains(c)),
|
||||
Arg::Regular(arg) if !force_quotes => {
|
||||
arg.as_os_str_bytes().iter().any(|c| SPECIAL.contains(c))
|
||||
}
|
||||
_ => force_quotes,
|
||||
};
|
||||
append_arg(&mut cmd, arg, force_quotes)?;
|
||||
|
@ -33,12 +33,12 @@ pub fn is_verbatim_sep(b: u8) -> bool {
|
||||
|
||||
/// Returns true if `path` looks like a lone filename.
|
||||
pub(crate) fn is_file_name(path: &OsStr) -> bool {
|
||||
!path.bytes().iter().copied().any(is_sep_byte)
|
||||
!path.as_os_str_bytes().iter().copied().any(is_sep_byte)
|
||||
}
|
||||
pub(crate) fn has_trailing_slash(path: &OsStr) -> bool {
|
||||
let is_verbatim = path.bytes().starts_with(br"\\?\");
|
||||
let is_verbatim = path.as_os_str_bytes().starts_with(br"\\?\");
|
||||
let is_separator = if is_verbatim { is_verbatim_sep } else { is_sep_byte };
|
||||
if let Some(&c) = path.bytes().last() { is_separator(c) } else { false }
|
||||
if let Some(&c) = path.as_os_str_bytes().last() { is_separator(c) } else { false }
|
||||
}
|
||||
|
||||
/// Appends a suffix to a path.
|
||||
@ -60,7 +60,7 @@ impl<'a, const LEN: usize> PrefixParser<'a, LEN> {
|
||||
fn get_prefix(path: &OsStr) -> [u8; LEN] {
|
||||
let mut prefix = [0; LEN];
|
||||
// SAFETY: Only ASCII characters are modified.
|
||||
for (i, &ch) in path.bytes().iter().take(LEN).enumerate() {
|
||||
for (i, &ch) in path.as_os_str_bytes().iter().take(LEN).enumerate() {
|
||||
prefix[i] = if ch == b'/' { b'\\' } else { ch };
|
||||
}
|
||||
prefix
|
||||
@ -93,7 +93,7 @@ impl<'a> PrefixParserSlice<'a, '_> {
|
||||
}
|
||||
|
||||
fn prefix_bytes(&self) -> &'a [u8] {
|
||||
&self.path.bytes()[..self.index]
|
||||
&self.path.as_os_str_bytes()[..self.index]
|
||||
}
|
||||
|
||||
fn finish(self) -> &'a OsStr {
|
||||
@ -101,7 +101,7 @@ impl<'a> PrefixParserSlice<'a, '_> {
|
||||
// &[u8] and back. This is safe to do because (1) we only look at ASCII
|
||||
// contents of the encoding and (2) new &OsStr values are produced only
|
||||
// from ASCII-bounded slices of existing &OsStr values.
|
||||
unsafe { bytes_as_os_str(&self.path.bytes()[self.index..]) }
|
||||
unsafe { bytes_as_os_str(&self.path.as_os_str_bytes()[self.index..]) }
|
||||
}
|
||||
}
|
||||
|
||||
@ -173,7 +173,7 @@ fn parse_drive(path: &OsStr) -> Option<u8> {
|
||||
drive.is_ascii_alphabetic()
|
||||
}
|
||||
|
||||
match path.bytes() {
|
||||
match path.as_os_str_bytes() {
|
||||
[drive, b':', ..] if is_valid_drive_letter(drive) => Some(drive.to_ascii_uppercase()),
|
||||
_ => None,
|
||||
}
|
||||
@ -182,7 +182,7 @@ fn parse_drive(path: &OsStr) -> Option<u8> {
|
||||
// Parses a drive prefix exactly, e.g. "C:"
|
||||
fn parse_drive_exact(path: &OsStr) -> Option<u8> {
|
||||
// only parse two bytes: the drive letter and the drive separator
|
||||
if path.bytes().get(2).map(|&x| is_sep_byte(x)).unwrap_or(true) {
|
||||
if path.as_os_str_bytes().get(2).map(|&x| is_sep_byte(x)).unwrap_or(true) {
|
||||
parse_drive(path)
|
||||
} else {
|
||||
None
|
||||
@ -196,15 +196,15 @@ fn parse_drive_exact(path: &OsStr) -> Option<u8> {
|
||||
fn parse_next_component(path: &OsStr, verbatim: bool) -> (&OsStr, &OsStr) {
|
||||
let separator = if verbatim { is_verbatim_sep } else { is_sep_byte };
|
||||
|
||||
match path.bytes().iter().position(|&x| separator(x)) {
|
||||
match path.as_os_str_bytes().iter().position(|&x| separator(x)) {
|
||||
Some(separator_start) => {
|
||||
let separator_end = separator_start + 1;
|
||||
|
||||
let component = &path.bytes()[..separator_start];
|
||||
let component = &path.as_os_str_bytes()[..separator_start];
|
||||
|
||||
// Panic safe
|
||||
// The max `separator_end` is `bytes.len()` and `bytes[bytes.len()..]` is a valid index.
|
||||
let path = &path.bytes()[separator_end..];
|
||||
let path = &path.as_os_str_bytes()[separator_end..];
|
||||
|
||||
// SAFETY: `path` is a valid wtf8 encoded slice and each of the separators ('/', '\')
|
||||
// is encoded in a single byte, therefore `bytes[separator_start]` and
|
||||
@ -329,7 +329,7 @@ pub(crate) fn absolute(path: &Path) -> io::Result<PathBuf> {
|
||||
// Verbatim paths should not be modified.
|
||||
if prefix.map(|x| x.is_verbatim()).unwrap_or(false) {
|
||||
// NULs in verbatim paths are rejected for consistency.
|
||||
if path.bytes().contains(&0) {
|
||||
if path.as_os_str_bytes().contains(&0) {
|
||||
return Err(io::const_io_error!(
|
||||
io::ErrorKind::InvalidInput,
|
||||
"strings passed to WinAPI cannot contain NULs",
|
||||
|
@ -395,7 +395,7 @@ fn resolve_exe<'a>(
|
||||
// Test if the file name has the `exe` extension.
|
||||
// This does a case-insensitive `ends_with`.
|
||||
let has_exe_suffix = if exe_path.len() >= EXE_SUFFIX.len() {
|
||||
exe_path.bytes()[exe_path.len() - EXE_SUFFIX.len()..]
|
||||
exe_path.as_os_str_bytes()[exe_path.len() - EXE_SUFFIX.len()..]
|
||||
.eq_ignore_ascii_case(EXE_SUFFIX.as_bytes())
|
||||
} else {
|
||||
false
|
||||
@ -425,7 +425,7 @@ fn resolve_exe<'a>(
|
||||
// From the `CreateProcessW` docs:
|
||||
// > If the file name does not contain an extension, .exe is appended.
|
||||
// Note that this rule only applies when searching paths.
|
||||
let has_extension = exe_path.bytes().contains(&b'.');
|
||||
let has_extension = exe_path.as_os_str_bytes().contains(&b'.');
|
||||
|
||||
// Search the directories given by `search_paths`.
|
||||
let result = search_paths(parent_paths, child_paths, |mut path| {
|
||||
|
Loading…
Reference in New Issue
Block a user