diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index 32cdbfe59fa1..10560d424690 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -853,7 +853,9 @@ fn link_rlib(sess: Session, out_filename: &Path) -> Archive { let mut a = Archive::create(sess, out_filename, obj_filename); - for &(ref l, kind) in sess.cstore.get_used_libraries().iter() { + let used_libraries = sess.cstore.get_used_libraries(); + let used_libraries = used_libraries.borrow(); + for &(ref l, kind) in used_libraries.get().iter() { match kind { cstore::NativeStatic => { a.add_native_library(l.as_slice()); @@ -1116,7 +1118,9 @@ fn add_local_native_libraries(args: &mut ~[~str], sess: Session) { args.push("-L" + path.as_str().unwrap().to_owned()); } - for &(ref l, kind) in sess.cstore.get_used_libraries().iter() { + let used_libraries = sess.cstore.get_used_libraries(); + let used_libraries = used_libraries.borrow(); + for &(ref l, kind) in used_libraries.get().iter() { match kind { cstore::NativeUnknown | cstore::NativeStatic => { args.push("-l" + *l); diff --git a/src/librustc/metadata/cstore.rs b/src/librustc/metadata/cstore.rs index adf25219acaf..5e4c1901f1e5 100644 --- a/src/librustc/metadata/cstore.rs +++ b/src/librustc/metadata/cstore.rs @@ -64,7 +64,7 @@ pub struct CStore { priv metas: RefCell>, priv extern_mod_crate_map: RefCell, priv used_crate_sources: RefCell<~[CrateSource]>, - priv used_libraries: ~[(~str, NativeLibaryKind)], + priv used_libraries: RefCell<~[(~str, NativeLibaryKind)]>, priv used_link_args: ~[~str], intr: @ident_interner } @@ -78,7 +78,7 @@ impl CStore { metas: RefCell::new(HashMap::new()), extern_mod_crate_map: RefCell::new(HashMap::new()), used_crate_sources: RefCell::new(~[]), - used_libraries: ~[], + used_libraries: RefCell::new(~[]), used_link_args: ~[], intr: intr } @@ -137,15 +137,17 @@ impl CStore { pub fn add_used_library(&mut self, lib: ~str, kind: NativeLibaryKind) -> bool { assert!(!lib.is_empty()); - if self.used_libraries.iter().any(|&(ref x, _)| x == &lib) { + let mut used_libraries = self.used_libraries.borrow_mut(); + if used_libraries.get().iter().any(|&(ref x, _)| x == &lib) { return false; } - self.used_libraries.push((lib, kind)); + used_libraries.get().push((lib, kind)); true } - pub fn get_used_libraries<'a>(&'a self) -> &'a [(~str, NativeLibaryKind)] { - self.used_libraries.as_slice() + pub fn get_used_libraries<'a>(&'a self) + -> &'a RefCell<~[(~str, NativeLibaryKind)]> { + &self.used_libraries } pub fn add_used_link_args(&mut self, args: &str) { diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 214dc41bf2db..6e4e221fd7ab 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -1611,7 +1611,9 @@ fn encode_lang_items(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) { fn encode_native_libraries(ecx: &EncodeContext, ebml_w: &mut writer::Encoder) { ebml_w.start_tag(tag_native_libraries); - for &(ref lib, kind) in ecx.cstore.get_used_libraries().iter() { + let used_libraries = ecx.tcx.sess.cstore.get_used_libraries(); + let used_libraries = used_libraries.borrow(); + for &(ref lib, kind) in used_libraries.get().iter() { match kind { cstore::NativeStatic => {} // these libraries are not propagated cstore::NativeFramework | cstore::NativeUnknown => {