]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_data_structures/src/memmap.rs
Merge commit '15c8d31392b9fbab3b3368b67acc4bbe5983115a' into cranelift-rebase
[rust.git] / compiler / rustc_data_structures / src / memmap.rs
1 use std::fs::File;
2 use std::io;
3 use std::ops::Deref;
4
5 use crate::owning_ref::StableAddress;
6
7 /// A trivial wrapper for [`memmap2::Mmap`] that implements [`StableAddress`].
8 #[cfg(not(target_arch = "wasm32"))]
9 pub struct Mmap(memmap2::Mmap);
10
11 #[cfg(target_arch = "wasm32")]
12 pub struct Mmap(Vec<u8>);
13
14 #[cfg(not(target_arch = "wasm32"))]
15 impl Mmap {
16     #[inline]
17     pub unsafe fn map(file: File) -> io::Result<Self> {
18         memmap2::Mmap::map(&file).map(Mmap)
19     }
20 }
21
22 #[cfg(target_arch = "wasm32")]
23 impl Mmap {
24     #[inline]
25     pub unsafe fn map(mut file: File) -> io::Result<Self> {
26         use std::io::Read;
27
28         let mut data = Vec::new();
29         file.read_to_end(&mut data)?;
30         Ok(Mmap(data))
31     }
32 }
33
34 impl Deref for Mmap {
35     type Target = [u8];
36
37     #[inline]
38     fn deref(&self) -> &[u8] {
39         &*self.0
40     }
41 }
42
43 // SAFETY: On architectures other than WASM, mmap is used as backing storage. The address of this
44 // memory map is stable. On WASM, `Vec<u8>` is used as backing storage. The `Mmap` type doesn't
45 // export any function that can cause the `Vec` to be re-allocated. As such the address of the
46 // bytes inside this `Vec` is stable.
47 unsafe impl StableAddress for Mmap {}