@@ -42,6 +42,7 @@ use std::{
42
42
43
43
use paths:: { Utf8Path , Utf8PathBuf } ;
44
44
use span:: Span ;
45
+ use temp_dir:: TempDir ;
45
46
46
47
use crate :: server_impl:: TokenStream ;
47
48
@@ -59,11 +60,16 @@ pub const RUSTC_VERSION_STRING: &str = env!("RUSTC_VERSION");
59
60
pub struct ProcMacroSrv < ' env > {
60
61
expanders : Mutex < HashMap < Utf8PathBuf , Arc < dylib:: Expander > > > ,
61
62
env : & ' env EnvSnapshot ,
63
+ temp_dir : TempDir ,
62
64
}
63
65
64
66
impl < ' env > ProcMacroSrv < ' env > {
65
67
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
+ }
67
73
}
68
74
}
69
75
@@ -73,7 +79,7 @@ impl ProcMacroSrv<'_> {
73
79
pub fn expand < S : ProcMacroSrvSpan > (
74
80
& self ,
75
81
lib : impl AsRef < Utf8Path > ,
76
- env : Vec < ( String , String ) > ,
82
+ env : & [ ( String , String ) ] ,
77
83
current_dir : Option < impl AsRef < Path > > ,
78
84
macro_name : String ,
79
85
macro_body : tt:: TopSubtree < S > ,
@@ -131,7 +137,7 @@ impl ProcMacroSrv<'_> {
131
137
132
138
fn expander ( & self , path : & Utf8Path ) -> Result < Arc < dylib:: Expander > , String > {
133
139
let expander = || {
134
- let expander = dylib:: Expander :: new ( path)
140
+ let expander = dylib:: Expander :: new ( & self . temp_dir , path)
135
141
. map_err ( |err| format ! ( "Cannot create expander for {path}: {err}" , ) ) ;
136
142
expander. map ( Arc :: new)
137
143
} ;
@@ -203,7 +209,7 @@ impl Default for EnvSnapshot {
203
209
static ENV_LOCK : std:: sync:: Mutex < ( ) > = std:: sync:: Mutex :: new ( ( ) ) ;
204
210
205
211
struct EnvChange < ' snap > {
206
- changed_vars : Vec < String > ,
212
+ changed_vars : Vec < & ' snap str > ,
207
213
prev_working_dir : Option < PathBuf > ,
208
214
snap : & ' snap EnvSnapshot ,
209
215
_guard : std:: sync:: MutexGuard < ' snap , ( ) > ,
@@ -212,7 +218,7 @@ struct EnvChange<'snap> {
212
218
impl < ' snap > EnvChange < ' snap > {
213
219
fn apply (
214
220
snap : & ' snap EnvSnapshot ,
215
- new_vars : Vec < ( String , String ) > ,
221
+ new_vars : & ' snap [ ( String , String ) ] ,
216
222
current_dir : Option < & Path > ,
217
223
) -> EnvChange < ' snap > {
218
224
let guard = ENV_LOCK . lock ( ) . unwrap_or_else ( std:: sync:: PoisonError :: into_inner) ;
@@ -232,11 +238,11 @@ impl<'snap> EnvChange<'snap> {
232
238
EnvChange {
233
239
snap,
234
240
changed_vars : new_vars
235
- . into_iter ( )
241
+ . iter ( )
236
242
. map ( |( k, v) | {
237
243
// 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
240
246
} )
241
247
. collect ( ) ,
242
248
prev_working_dir,
0 commit comments