aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock11
-rw-r--r--crates/ra_proc_macro_srv/Cargo.toml1
-rw-r--r--crates/ra_proc_macro_srv/src/dylib.rs7
3 files changed, 17 insertions, 2 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 89a734c9b..3826ae1c6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -676,6 +676,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
676checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" 676checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
677 677
678[[package]] 678[[package]]
679name = "memmap"
680version = "0.7.0"
681source = "registry+https://github.com/rust-lang/crates.io-index"
682checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
683dependencies = [
684 "libc",
685 "winapi 0.3.8",
686]
687
688[[package]]
679name = "memoffset" 689name = "memoffset"
680version = "0.5.4" 690version = "0.5.4"
681source = "registry+https://github.com/rust-lang/crates.io-index" 691source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1112,6 +1122,7 @@ dependencies = [
1112 "difference", 1122 "difference",
1113 "goblin", 1123 "goblin",
1114 "libloading", 1124 "libloading",
1125 "memmap",
1115 "ra_mbe", 1126 "ra_mbe",
1116 "ra_proc_macro", 1127 "ra_proc_macro",
1117 "ra_tt", 1128 "ra_tt",
diff --git a/crates/ra_proc_macro_srv/Cargo.toml b/crates/ra_proc_macro_srv/Cargo.toml
index 1e0f50339..ac2d156dc 100644
--- a/crates/ra_proc_macro_srv/Cargo.toml
+++ b/crates/ra_proc_macro_srv/Cargo.toml
@@ -14,6 +14,7 @@ ra_mbe = { path = "../ra_mbe" }
14ra_proc_macro = { path = "../ra_proc_macro" } 14ra_proc_macro = { path = "../ra_proc_macro" }
15goblin = "0.2.1" 15goblin = "0.2.1"
16libloading = "0.6.0" 16libloading = "0.6.0"
17memmap = "0.7"
17test_utils = { path = "../test_utils" } 18test_utils = { path = "../test_utils" }
18 19
19[dev-dependencies] 20[dev-dependencies]
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
3use crate::{proc_macro::bridge, rustc_server::TokenStream}; 3use crate::{proc_macro::bridge, rustc_server::TokenStream};
4use std::fs::File;
4use std::path::Path; 5use std::path::Path;
5 6
6use goblin::{mach::Mach, Object}; 7use goblin::{mach::Mach, Object};
7use libloading::Library; 8use libloading::Library;
9use memmap::Mmap;
8use ra_proc_macro::ProcMacroKind; 10use ra_proc_macro::ProcMacroKind;
9 11
10use std::io::Error as IoError; 12use std::io::Error as IoError;
@@ -21,7 +23,8 @@ fn is_derive_registrar_symbol(symbol: &str) -> bool {
21} 23}
22 24
23fn find_registrar_symbol(file: &Path) -> Result<Option<String>, IoError> { 25fn 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 }