@@ -42,6 +42,7 @@ use std::{
4242
4343use paths:: { Utf8Path , Utf8PathBuf } ;
4444use span:: Span ;
45+ use temp_dir:: TempDir ;
4546
4647use crate :: server_impl:: TokenStream ;
4748
@@ -59,11 +60,16 @@ pub const RUSTC_VERSION_STRING: &str = env!("RUSTC_VERSION");
5960pub struct ProcMacroSrv < ' env > {
6061 expanders : Mutex < HashMap < Utf8PathBuf , Arc < dylib:: Expander > > > ,
6162 env : & ' env EnvSnapshot ,
63+ temp_dir : TempDir ,
6264}
6365
6466impl < ' env > ProcMacroSrv < ' env > {
6567 pub fn new ( env : & ' env EnvSnapshot ) -> Self {
66- Self { expanders : Default :: default ( ) , env }
68+ Self {
69+ expanders : Default :: default ( ) ,
70+ env,
71+ temp_dir : TempDir :: with_prefix ( "proc-macro-srv" ) . unwrap ( ) ,
72+ }
6773 }
6874}
6975
@@ -73,7 +79,7 @@ impl ProcMacroSrv<'_> {
7379 pub fn expand < S : ProcMacroSrvSpan > (
7480 & self ,
7581 lib : impl AsRef < Utf8Path > ,
76- env : Vec < ( String , String ) > ,
82+ env : & [ ( String , String ) ] ,
7783 current_dir : Option < impl AsRef < Path > > ,
7884 macro_name : String ,
7985 macro_body : tt:: TopSubtree < S > ,
@@ -131,7 +137,7 @@ impl ProcMacroSrv<'_> {
131137
132138 fn expander ( & self , path : & Utf8Path ) -> Result < Arc < dylib:: Expander > , String > {
133139 let expander = || {
134- let expander = dylib:: Expander :: new ( path)
140+ let expander = dylib:: Expander :: new ( & self . temp_dir , path)
135141 . map_err ( |err| format ! ( "Cannot create expander for {path}: {err}" , ) ) ;
136142 expander. map ( Arc :: new)
137143 } ;
@@ -203,7 +209,7 @@ impl Default for EnvSnapshot {
203209static ENV_LOCK : std:: sync:: Mutex < ( ) > = std:: sync:: Mutex :: new ( ( ) ) ;
204210
205211struct EnvChange < ' snap > {
206- changed_vars : Vec < String > ,
212+ changed_vars : Vec < & ' snap str > ,
207213 prev_working_dir : Option < PathBuf > ,
208214 snap : & ' snap EnvSnapshot ,
209215 _guard : std:: sync:: MutexGuard < ' snap , ( ) > ,
@@ -212,7 +218,7 @@ struct EnvChange<'snap> {
212218impl < ' snap > EnvChange < ' snap > {
213219 fn apply (
214220 snap : & ' snap EnvSnapshot ,
215- new_vars : Vec < ( String , String ) > ,
221+ new_vars : & ' snap [ ( String , String ) ] ,
216222 current_dir : Option < & Path > ,
217223 ) -> EnvChange < ' snap > {
218224 let guard = ENV_LOCK . lock ( ) . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ;
@@ -232,11 +238,11 @@ impl<'snap> EnvChange<'snap> {
232238 EnvChange {
233239 snap,
234240 changed_vars : new_vars
235- . into_iter ( )
241+ . iter ( )
236242 . map ( |( k, v) | {
237243 // SAFETY: We have acquired the environment lock
238- unsafe { env:: set_var ( & k, v) } ;
239- k
244+ unsafe { env:: set_var ( k, v) } ;
245+ & * * k
240246 } )
241247 . collect ( ) ,
242248 prev_working_dir,
0 commit comments