about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicholas Nethercote <n.nethercote@gmail.com>2022-02-02 13:16:25 +1100
committerNicholas Nethercote <n.nethercote@gmail.com>2022-02-02 13:16:25 +1100
commit0ba47f32160d4c51717b4da6449f40079a5eb317 (patch)
treea470dc615528e53bac5cf48394e6862429b37403
parent89b61ea09f03060ceac3d0a1779dbb4152b6fddd (diff)
downloadrust-0ba47f32160d4c51717b4da6449f40079a5eb317.tar.gz
rust-0ba47f32160d4c51717b4da6449f40079a5eb317.zip
Make `SearchPathFile::file_name_str` non-optional.
Currently, it can be `None` if the conversion from `OsString` fails, in
which case all searches will skip over the `SearchPathFile`.

The commit changes things so that the `SearchPathFile` just doesn't get
created in the first place. Same behaviour, but slightly simpler code.
-rw-r--r--compiler/rustc_metadata/src/locator.rs5
-rw-r--r--compiler/rustc_session/src/search_paths.rs26
2 files changed, 14 insertions, 17 deletions
diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs
index f65cd73007b..caa544284c9 100644
--- a/compiler/rustc_metadata/src/locator.rs
+++ b/compiler/rustc_metadata/src/locator.rs
@@ -399,10 +399,7 @@ impl<'a> CrateLocator<'a> {
             for spf in search_path.files.iter() {
                 debug!("testing {}", spf.path.display());
 
-                let file = match &spf.file_name_str {
-                    None => continue,
-                    Some(file) => file,
-                };
+                let file = &spf.file_name_str;
                 let (hash, found_kind) = if file.starts_with(&rlib_prefix)
                     && file.ends_with(".rlib")
                 {
diff --git a/compiler/rustc_session/src/search_paths.rs b/compiler/rustc_session/src/search_paths.rs
index acb6c735e05..b6bde28233d 100644
--- a/compiler/rustc_session/src/search_paths.rs
+++ b/compiler/rustc_session/src/search_paths.rs
@@ -15,22 +15,15 @@ pub struct SearchPath {
 /// doable, but very slow, because it involves calls to `file_name` and
 /// `extension` that are themselves slow.
 ///
-/// This type augments the `PathBuf` with an `Option<String>` containing the
+/// This type augments the `PathBuf` with an `String` containing the
 /// `PathBuf`'s filename. The prefix and suffix checking is much faster on the
-/// `Option<String>` than the `PathBuf`. (It's an `Option` because
-/// `Path::file_name` can fail; if that happens then all subsequent checking
-/// will also fail, which is fine.)
+/// `String` than the `PathBuf`. (The filename must be valid UTF-8. If it's
+/// not, the entry should be skipped, because all Rust output files are valid
+/// UTF-8, and so a non-UTF-8 filename couldn't be one we're looking for.)
 #[derive(Clone, Debug)]
 pub struct SearchPathFile {
     pub path: PathBuf,
-    pub file_name_str: Option<String>,
-}
-
-impl SearchPathFile {
-    fn new(path: PathBuf) -> SearchPathFile {
-        let file_name_str = path.file_name().and_then(|f| f.to_str()).map(|s| s.to_string());
-        SearchPathFile { path, file_name_str }
-    }
+    pub file_name_str: String,
 }
 
 #[derive(PartialEq, Clone, Copy, Debug, Hash, Eq, Encodable, Decodable)]
@@ -85,7 +78,14 @@ impl SearchPath {
         // Get the files within the directory.
         let files = match std::fs::read_dir(&dir) {
             Ok(files) => files
-                .filter_map(|e| e.ok().map(|e| SearchPathFile::new(e.path())))
+                .filter_map(|e| {
+                    e.ok().and_then(|e| {
+                        e.file_name().to_str().map(|s| SearchPathFile {
+                            path: e.path(),
+                            file_name_str: s.to_string(),
+                        })
+                    })
+                })
                 .collect::<Vec<_>>(),
             Err(..) => vec![],
         };