Skip to content

Commit

Permalink
Replace FileSearch::for_each_lib_search_path with search_paths.
Browse files Browse the repository at this point in the history
Returning an iterator leads to nicer code all around.
  • Loading branch information
nnethercote committed Dec 11, 2018
1 parent b77fe07 commit 4b70b01
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 32 deletions.
40 changes: 17 additions & 23 deletions src/librustc/session/filesearch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,19 @@ pub enum FileMatch {
// A module for searching for libraries

pub struct FileSearch<'a> {
pub sysroot: &'a Path,
pub triple: &'a str,
pub search_paths: &'a [SearchPath],
pub tlib_path: &'a SearchPath,
pub kind: PathKind,
sysroot: &'a Path,
triple: &'a str,
search_paths: &'a [SearchPath],
tlib_path: &'a SearchPath,
kind: PathKind,
}

impl<'a> FileSearch<'a> {
pub fn for_each_lib_search_path<F>(&self, mut f: F) where
F: FnMut(&SearchPath)
{
let iter = self.search_paths.iter().filter(|sp| sp.kind.matches(self.kind));
for search_path in iter {
f(search_path);
}

f(self.tlib_path);
pub fn search_paths(&self) -> impl Iterator<Item = &'a SearchPath> {
let kind = self.kind;
self.search_paths.iter()
.filter(move |sp| sp.kind.matches(kind))
.chain(std::iter::once(self.tlib_path))
}

pub fn get_lib_path(&self) -> PathBuf {
Expand All @@ -55,7 +51,7 @@ impl<'a> FileSearch<'a> {
pub fn search<F>(&self, mut pick: F)
where F: FnMut(&Path, PathKind) -> FileMatch
{
self.for_each_lib_search_path(|search_path| {
for search_path in self.search_paths() {
debug!("searching {}", search_path.dir.display());
fn is_rlib(p: &Path) -> bool {
p.extension() == Some("rlib".as_ref())
Expand All @@ -78,7 +74,7 @@ impl<'a> FileSearch<'a> {
}
}
}
});
}
}

pub fn new(sysroot: &'a Path,
Expand All @@ -97,13 +93,11 @@ impl<'a> FileSearch<'a> {
}
}

// Returns a list of directories where target-specific dylibs might be located.
pub fn get_dylib_search_paths(&self) -> Vec<PathBuf> {
let mut paths = Vec::new();
self.for_each_lib_search_path(|search_path| {
paths.push(search_path.dir.to_path_buf());
});
paths
// Returns just the directories within the search paths.
pub fn search_path_dirs(&self) -> Vec<PathBuf> {
self.search_paths()
.map(|sp| sp.dir.to_path_buf())
.collect()
}

// Returns a list of directories where target-specific tool binaries are located.
Expand Down
12 changes: 4 additions & 8 deletions src/librustc_codegen_llvm/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,12 +212,7 @@ fn link_binary_output(sess: &Session,
}

fn archive_search_paths(sess: &Session) -> Vec<PathBuf> {
let mut search = Vec::new();
sess.target_filesearch(PathKind::Native).for_each_lib_search_path(|search_path| {
search.push(search_path.dir.to_path_buf());
});

search
sess.target_filesearch(PathKind::Native).search_path_dirs()
}

fn archive_config<'a>(sess: &'a Session,
Expand Down Expand Up @@ -1067,12 +1062,13 @@ fn link_args(cmd: &mut dyn Linker,
fn add_local_native_libraries(cmd: &mut dyn Linker,
sess: &Session,
codegen_results: &CodegenResults) {
sess.target_filesearch(PathKind::All).for_each_lib_search_path(|search_path| {
let filesearch = sess.target_filesearch(PathKind::All);
for search_path in filesearch.search_paths() {
match search_path.kind {
PathKind::Framework => { cmd.framework_path(&search_path.dir); }
_ => { cmd.include_path(&fix_windows_verbatim_for_gcc(&search_path.dir)); }
}
});
}

let relevant_libs = codegen_results.crate_info.used_libraries.iter().filter(|l| {
relevant_lib(sess, l)
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_driver/driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -975,7 +975,7 @@ where
let mut old_path = OsString::new();
if cfg!(windows) {
old_path = env::var_os("PATH").unwrap_or(old_path);
let mut new_path = sess.host_filesearch(PathKind::All).get_dylib_search_paths();
let mut new_path = sess.host_filesearch(PathKind::All).search_path_dirs();
for path in env::split_paths(&old_path) {
if !new_path.contains(&path) {
new_path.push(path);
Expand Down

0 comments on commit 4b70b01

Please sign in to comment.