diff options
author | Laurențiu Nicola <[email protected]> | 2020-04-17 08:47:15 +0100 |
---|---|---|
committer | Laurențiu Nicola <[email protected]> | 2020-04-17 10:38:38 +0100 |
commit | 93fcf1c133f1a473ac598e4811e88ee91d979510 (patch) | |
tree | 5cf13e42c792a21858f4481492441b7be99617d3 /crates/ra_proc_macro_srv/src | |
parent | 69f0cb6cd77c2dc93f2eed180a6c16fd8c3fca5a (diff) |
Use mmap for proc macro libs
Diffstat (limited to 'crates/ra_proc_macro_srv/src')
-rw-r--r-- | crates/ra_proc_macro_srv/src/dylib.rs | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/crates/ra_proc_macro_srv/src/dylib.rs b/crates/ra_proc_macro_srv/src/dylib.rs index 7d6e5d323..16bd7466e 100644 --- a/crates/ra_proc_macro_srv/src/dylib.rs +++ b/crates/ra_proc_macro_srv/src/dylib.rs | |||
@@ -1,10 +1,12 @@ | |||
1 | //! Handles dynamic library loading for proc macro | 1 | //! Handles dynamic library loading for proc macro |
2 | 2 | ||
3 | use crate::{proc_macro::bridge, rustc_server::TokenStream}; | 3 | use crate::{proc_macro::bridge, rustc_server::TokenStream}; |
4 | use std::fs::File; | ||
4 | use std::path::Path; | 5 | use std::path::Path; |
5 | 6 | ||
6 | use goblin::{mach::Mach, Object}; | 7 | use goblin::{mach::Mach, Object}; |
7 | use libloading::Library; | 8 | use libloading::Library; |
9 | use memmap::Mmap; | ||
8 | use ra_proc_macro::ProcMacroKind; | 10 | use ra_proc_macro::ProcMacroKind; |
9 | 11 | ||
10 | use std::io::Error as IoError; | 12 | use std::io::Error as IoError; |
@@ -21,7 +23,8 @@ fn is_derive_registrar_symbol(symbol: &str) -> bool { | |||
21 | } | 23 | } |
22 | 24 | ||
23 | fn find_registrar_symbol(file: &Path) -> Result<Option<String>, IoError> { | 25 | fn find_registrar_symbol(file: &Path) -> Result<Option<String>, IoError> { |
24 | let buffer = std::fs::read(file)?; | 26 | let file = File::open(file)?; |
27 | let buffer = unsafe { Mmap::map(&file)? }; | ||
25 | let object = Object::parse(&buffer).map_err(invalid_data_err)?; | 28 | let object = Object::parse(&buffer).map_err(invalid_data_err)?; |
26 | 29 | ||
27 | match object { | 30 | match object { |
@@ -55,7 +58,7 @@ fn find_registrar_symbol(file: &Path) -> Result<Option<String>, IoError> { | |||
55 | &s.name | 58 | &s.name |
56 | } | 59 | } |
57 | }) | 60 | }) |
58 | .find(|s| is_derive_registrar_symbol(&s)) | 61 | .find(|s| is_derive_registrar_symbol(s)) |
59 | .map(|s| s.to_string()); | 62 | .map(|s| s.to_string()); |
60 | Ok(name) | 63 | Ok(name) |
61 | } | 64 | } |