about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoshua Yanovski <pythonesque@gmail.com>2013-10-25 22:13:23 -0700
committerJoshua Yanovski <pythonesque@gmail.com>2013-10-26 10:46:38 -0700
commita239c0ed66c511886ad0e2acf5b550d25b37427c (patch)
tree069252a6607bacd28832830b6ddb7fb8164227f7
parent950add4e49cc2ac5d60abd6da969392123ddcce0 (diff)
downloadrust-a239c0ed66c511886ad0e2acf5b550d25b37427c.tar.gz
rust-a239c0ed66c511886ad0e2acf5b550d25b37427c.zip
Make addl_lib_search_paths a HashSet (Closes #7718).
-rw-r--r--src/librustc/driver/driver.rs4
-rw-r--r--src/librustc/driver/session.rs10
-rw-r--r--src/librustc/metadata/filesearch.rs4
-rw-r--r--src/librustdoc/core.rs6
-rw-r--r--src/librustdoc/rustdoc.rs2
-rw-r--r--src/librustpkg/context.rs12
-rw-r--r--src/librustpkg/rustpkg.rs4
-rw-r--r--src/librustpkg/util.rs6
-rw-r--r--src/test/run-pass/duplicated-external-mods.rs17
9 files changed, 42 insertions, 23 deletions
diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs
index d2b0dad80f6..8aba36370d0 100644
--- a/src/librustc/driver/driver.rs
+++ b/src/librustc/driver/driver.rs
@@ -757,7 +757,9 @@ pub fn build_session_options(binary: @str,
 
     let statik = debugging_opts & session::statik != 0;
 
-    let addl_lib_search_paths = matches.opt_strs("L").map(|s| Path::new(s.as_slice()));
+    let addl_lib_search_paths = matches.opt_strs("L").map(|s| {
+      Path::new(s.as_slice())
+    }).move_iter().collect();
     let linker = matches.opt_str("linker");
     let linker_args = matches.opt_strs("link-args").flat_map( |a| {
         a.split_iter(' ').map(|arg| arg.to_owned()).collect()
diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs
index 6c176f04fe8..8c1693935c7 100644
--- a/src/librustc/driver/session.rs
+++ b/src/librustc/driver/session.rs
@@ -29,7 +29,7 @@ use syntax::parse::token;
 use syntax;
 
 use std::int;
-use std::hashmap::HashMap;
+use std::hashmap::{HashMap,HashSet};
 
 #[deriving(Eq)]
 pub enum Os { OsWin32, OsMacos, OsLinux, OsAndroid, OsFreebsd, }
@@ -158,9 +158,9 @@ pub struct options {
     save_temps: bool,
     jit: bool,
     output_type: back::link::output_type,
-    addl_lib_search_paths: @mut ~[Path], // This is mutable for rustpkg, which
-                                         // updates search paths based on the
-                                         // parsed code
+    addl_lib_search_paths: @mut HashSet<Path>, // This is mutable for rustpkg, which
+                                               // updates search paths based on the
+                                               // parsed code
     linker: Option<~str>,
     linker_args: ~[~str],
     maybe_sysroot: Option<@Path>,
@@ -366,7 +366,7 @@ pub fn basic_options() -> @options {
         save_temps: false,
         jit: false,
         output_type: link::output_type_exe,
-        addl_lib_search_paths: @mut ~[],
+        addl_lib_search_paths: @mut HashSet::new(),
         linker: None,
         linker_args: ~[],
         maybe_sysroot: None,
diff --git a/src/librustc/metadata/filesearch.rs b/src/librustc/metadata/filesearch.rs
index 4b679072bba..94dfc006076 100644
--- a/src/librustc/metadata/filesearch.rs
+++ b/src/librustc/metadata/filesearch.rs
@@ -40,11 +40,11 @@ pub trait FileSearch {
 
 pub fn mk_filesearch(maybe_sysroot: &Option<@Path>,
                      target_triple: &str,
-                     addl_lib_search_paths: @mut ~[Path])
+                     addl_lib_search_paths: @mut HashSet<Path>)
                   -> @FileSearch {
     struct FileSearchImpl {
         sysroot: @Path,
-        addl_lib_search_paths: @mut ~[Path],
+        addl_lib_search_paths: @mut HashSet<Path>,
         target_triple: ~str
     }
     impl FileSearch for FileSearchImpl {
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index b6e16720459..0a30978db2b 100644
--- a/src/librustdoc/core.rs
+++ b/src/librustdoc/core.rs
@@ -20,7 +20,7 @@ use syntax;
 
 use std::os;
 use std::local_data;
-use std::hashmap::HashMap;
+use std::hashmap::{HashMap,HashSet};
 
 use visit_ast::RustdocVisitor;
 use clean;
@@ -39,7 +39,7 @@ pub struct CrateAnalysis {
 
 /// Parses, resolves, and typechecks the given crate
 fn get_ast_and_resolve(cpath: &Path,
-                       libs: ~[Path]) -> (DocContext, CrateAnalysis) {
+                       libs: HashSet<Path>) -> (DocContext, CrateAnalysis) {
     use syntax::codemap::dummy_spanned;
     use rustc::driver::driver::{file_input, build_configuration,
                                 phase_1_parse_input,
@@ -89,7 +89,7 @@ fn get_ast_and_resolve(cpath: &Path,
             CrateAnalysis { reexports: reexports, exported_items: exported_items });
 }
 
-pub fn run_core (libs: ~[Path], path: &Path) -> (clean::Crate, CrateAnalysis) {
+pub fn run_core (libs: HashSet<Path>, path: &Path) -> (clean::Crate, CrateAnalysis) {
     let (ctxt, analysis) = get_ast_and_resolve(path, libs);
     let ctxt = @ctxt;
     debug!("defmap:");
diff --git a/src/librustdoc/rustdoc.rs b/src/librustdoc/rustdoc.rs
index c0fab1ad98f..770d535c6ea 100644
--- a/src/librustdoc/rustdoc.rs
+++ b/src/librustdoc/rustdoc.rs
@@ -198,7 +198,7 @@ fn rust_input(cratefile: &str, matches: &getopts::Matches) -> Output {
     info!("starting to run rustc");
     let (crate, analysis) = do std::task::try {
         let cr = cr.take();
-        core::run_core(libs.take(), &cr)
+        core::run_core(libs.take().move_iter().collect(), &cr)
     }.unwrap();
     info!("finished with rustc");
     local_data::set(analysiskey, analysis);
diff --git a/src/librustpkg/context.rs b/src/librustpkg/context.rs
index bee21d70b2d..77fe2ae8f70 100644
--- a/src/librustpkg/context.rs
+++ b/src/librustpkg/context.rs
@@ -10,10 +10,12 @@
 
 // Context data structure used by rustpkg
 
-use std::os;
 use extra::workcache;
 use rustc::driver::session::{OptLevel, No};
 
+use std::hashmap::HashSet;
+use std::os;
+
 #[deriving(Clone)]
 pub struct Context {
     // Config strings that the user passed in with --cfg
@@ -60,7 +62,7 @@ impl BuildContext {
         self.context.add_library_path(p);
     }
 
-    pub fn additional_library_paths(&self) -> ~[Path] {
+    pub fn additional_library_paths(&self) -> HashSet<Path> {
         self.context.rustc_flags.additional_library_paths.clone()
     }
 }
@@ -96,7 +98,7 @@ pub struct RustcFlags {
     target_cpu: Option<~str>,
     // Additional library directories, which get passed with the -L flag
     // This can't be set with a rustpkg flag, only from package scripts
-    additional_library_paths: ~[Path],
+    additional_library_paths: HashSet<Path>,
     // Any -Z features
     experimental_features: Option<~[~str]>
 }
@@ -163,7 +165,7 @@ impl Context {
     }
 
     pub fn add_library_path(&mut self, p: Path) {
-        self.rustc_flags.additional_library_paths.push(p);
+        self.rustc_flags.additional_library_paths.insert(p);
     }
 }
 
@@ -227,7 +229,7 @@ impl RustcFlags {
             save_temps: false,
             target: None,
             target_cpu: None,
-            additional_library_paths: ~[],
+            additional_library_paths: HashSet::new(),
             experimental_features: None
         }
     }
diff --git a/src/librustpkg/rustpkg.rs b/src/librustpkg/rustpkg.rs
index bd3a1b2f672..dc2c69b814a 100644
--- a/src/librustpkg/rustpkg.rs
+++ b/src/librustpkg/rustpkg.rs
@@ -25,6 +25,7 @@ extern mod rustc;
 extern mod syntax;
 
 use std::{os, result, run, str, task};
+use std::hashmap::HashSet;
 pub use std::path::Path;
 
 use extra::workcache;
@@ -840,7 +841,8 @@ pub fn main_args(args: &[~str]) -> int {
         save_temps: save_temps,
         target: target,
         target_cpu: target_cpu,
-        additional_library_paths: ~[], // No way to set this from the rustpkg command line
+        additional_library_paths:
+            HashSet::new(), // No way to set this from the rustpkg command line
         experimental_features: experimental_features
     };
 
diff --git a/src/librustpkg/util.rs b/src/librustpkg/util.rs
index 3824f6d38de..026f443ec79 100644
--- a/src/librustpkg/util.rs
+++ b/src/librustpkg/util.rs
@@ -285,11 +285,7 @@ pub fn compile_input(context: &BuildContext,
                                       debug!("a dependency: {}", p.display());
                                       // Pass the directory containing a dependency
                                       // as an additional lib search path
-                                      if !addl_lib_search_paths.contains(&p) {
-                                          // Might be inefficient, but this set probably
-                                          // won't get too large -- tjc
-                                          addl_lib_search_paths.push(p);
-                                      }
+                                      addl_lib_search_paths.insert(p);
                                   });
 
     // Inject the link attributes so we get the right package name and version
diff --git a/src/test/run-pass/duplicated-external-mods.rs b/src/test/run-pass/duplicated-external-mods.rs
new file mode 100644
index 00000000000..4eaae8b0ef4
--- /dev/null
+++ b/src/test/run-pass/duplicated-external-mods.rs
@@ -0,0 +1,17 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// xfail-fast
+// aux-build:anon-extern-mod-cross-crate-1.rs
+// aux-build:anon-extern-mod-cross-crate-1.rs
+extern mod anonexternmod;
+
+pub fn main() { }
+