dependencies = [
"flate2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
"proc_macro 0.0.0",
"rustc 0.0.0",
"rustc_data_structures 0.0.0",
"rustc_errors 0.0.0",
"rustc_target 0.0.0",
"serialize 0.0.0",
+ "stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"syntax 0.0.0",
"syntax_ext 0.0.0",
"syntax_pos 0.0.0",
[dependencies]
flate2 = "1.0"
log = "0.4"
+memmap = "0.6"
proc_macro = { path = "../libproc_macro" }
rustc = { path = "../librustc" }
-rustc_target = { path = "../librustc_target" }
rustc_data_structures = { path = "../librustc_data_structures" }
rustc_errors = { path = "../librustc_errors" }
+rustc_target = { path = "../librustc_target" }
serialize = { path = "../libserialize" }
+stable_deref_trait = "1.0.0"
syntax = { path = "../libsyntax" }
syntax_ext = { path = "../libsyntax_ext" }
syntax_pos = { path = "../libsyntax_pos" }
use std::fmt;
use std::fs;
use std::io::{self, Read};
+use std::ops::Deref;
use std::path::{Path, PathBuf};
use std::time::Instant;
use flate2::read::DeflateDecoder;
use rustc_data_structures::owning_ref::OwningRef;
+
pub struct CrateMismatch {
path: PathBuf,
got: String,
return ret;
}
+/// A trivial wrapper for `Mmap` that implements `StableDeref`.
+struct StableDerefMmap(memmap::Mmap);
+
+impl Deref for StableDerefMmap {
+ type Target = [u8];
+
+ fn deref(&self) -> &[u8] {
+ self.0.deref()
+ }
+}
+
+unsafe impl stable_deref_trait::StableDeref for StableDerefMmap {}
+
fn get_metadata_section_imp(target: &Target,
flavor: CrateFlavor,
filename: &Path,
}
}
CrateFlavor::Rmeta => {
- let buf = fs::read(filename).map_err(|_|
- format!("failed to read rmeta metadata: '{}'", filename.display()))?;
- rustc_erase_owner!(OwningRef::new(buf).map_owner_box())
+ // mmap the file, because only a small fraction of it is read.
+ let file = std::fs::File::open(filename).map_err(|_|
+ format!("failed to open rmeta metadata: '{}'", filename.display()))?;
+ let mmap = unsafe { memmap::Mmap::map(&file) };
+ let mmap = mmap.map_err(|_|
+ format!("failed to mmap rmeta metadata: '{}'", filename.display()))?;
+
+ rustc_erase_owner!(OwningRef::new(StableDerefMmap(mmap)).map_owner_box())
}
};
let blob = MetadataBlob(raw_bytes);