Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-srv/src/dylib.rs')
-rw-r--r--crates/proc-macro-srv/src/dylib.rs40
1 files changed, 27 insertions, 13 deletions
diff --git a/crates/proc-macro-srv/src/dylib.rs b/crates/proc-macro-srv/src/dylib.rs
index 22c34ff167..78ae4574c4 100644
--- a/crates/proc-macro-srv/src/dylib.rs
+++ b/crates/proc-macro-srv/src/dylib.rs
@@ -1,13 +1,15 @@
//! Handles dynamic library loading for proc macro
+mod version;
+
+use proc_macro::bridge;
use std::{fmt, fs::File, io};
use libloading::Library;
use memmap2::Mmap;
use object::Object;
use paths::{AbsPath, Utf8Path, Utf8PathBuf};
-use proc_macro::bridge;
-use proc_macro_api::{read_dylib_info, ProcMacroKind};
+use proc_macro_api::ProcMacroKind;
use crate::ProcMacroSrvSpan;
@@ -119,33 +121,45 @@ impl ProcMacroLibraryLibloading {
let abs_file: &AbsPath = file
.try_into()
.map_err(|_| invalid_data_err(format!("expected an absolute path, got {file}")))?;
- let version_info = read_dylib_info(abs_file)?;
+ let version_info = version::read_dylib_info(abs_file)?;
let lib = load_library(file).map_err(invalid_data_err)?;
- let proc_macros =
- crate::proc_macros::ProcMacros::from_lib(&lib, symbol_name, version_info)?;
+ let proc_macros = crate::proc_macros::ProcMacros::from_lib(
+ &lib,
+ symbol_name,
+ &version_info.version_string,
+ )?;
Ok(ProcMacroLibraryLibloading { _lib: lib, proc_macros })
}
}
-pub struct Expander {
+pub(crate) struct Expander {
inner: ProcMacroLibraryLibloading,
+ path: Utf8PathBuf,
+}
+
+impl Drop for Expander {
+ fn drop(&mut self) {
+ #[cfg(windows)]
+ std::fs::remove_file(&self.path).ok();
+ _ = self.path;
+ }
}
impl Expander {
- pub fn new(lib: &Utf8Path) -> Result<Expander, LoadProcMacroDylibError> {
+ pub(crate) fn new(lib: &Utf8Path) -> Result<Expander, LoadProcMacroDylibError> {
// Some libraries for dynamic loading require canonicalized path even when it is
// already absolute
let lib = lib.canonicalize_utf8()?;
- let lib = ensure_file_with_lock_free_access(&lib)?;
+ let path = ensure_file_with_lock_free_access(&lib)?;
- let library = ProcMacroLibraryLibloading::open(lib.as_ref())?;
+ let library = ProcMacroLibraryLibloading::open(path.as_ref())?;
- Ok(Expander { inner: library })
+ Ok(Expander { inner: library, path })
}
- pub fn expand<S: ProcMacroSrvSpan>(
+ pub(crate) fn expand<S: ProcMacroSrvSpan>(
&self,
macro_name: &str,
macro_body: tt::Subtree<S>,
@@ -164,7 +178,7 @@ impl Expander {
result.map_err(|e| e.into_string().unwrap_or_default())
}
- pub fn list_macros(&self) -> Vec<(String, ProcMacroKind)> {
+ pub(crate) fn list_macros(&self) -> Vec<(String, ProcMacroKind)> {
self.inner.proc_macros.list_macros()
}
}
@@ -193,7 +207,7 @@ fn ensure_file_with_lock_free_access(path: &Utf8Path) -> io::Result<Utf8PathBuf>
unique_name.push_str(file_name);
to.push(unique_name);
- std::fs::copy(path, &to).unwrap();
+ std::fs::copy(path, &to)?;
Ok(to)
}