@@ -6,10 +6,10 @@ use rustc_ast::mut_visit::MutVisitor;
6
6
use rustc_ast:: { self as ast, visit} ;
7
7
use rustc_codegen_ssa:: back:: link:: emit_metadata;
8
8
use rustc_codegen_ssa:: traits:: CodegenBackend ;
9
+ use rustc_data_structures:: parallel;
9
10
use rustc_data_structures:: steal:: Steal ;
10
11
use rustc_data_structures:: sync:: { par_iter, Lrc , OnceCell , ParallelIterator , WorkerLocal } ;
11
12
use rustc_data_structures:: temp_dir:: MaybeTempDir ;
12
- use rustc_data_structures:: { box_region_allow_access, declare_box_region_type, parallel} ;
13
13
use rustc_errors:: { ErrorReported , PResult } ;
14
14
use rustc_expand:: base:: ExtCtxt ;
15
15
use rustc_hir:: def_id:: LOCAL_CRATE ;
@@ -85,11 +85,62 @@ fn count_nodes(krate: &ast::Crate) -> usize {
85
85
counter. count
86
86
}
87
87
88
- declare_box_region_type ! (
89
- pub BoxedResolver ,
90
- ( & mut Resolver <' _>) -> ( Result <ast:: Crate >, ResolverOutputs )
88
+ pub struct BoxedResolver (
89
+ rustc_data_structures:: box_region:: PinnedGenerator <
90
+ Result < ast:: Crate > ,
91
+ fn ( & mut Resolver < ' _ > ) ,
92
+ ResolverOutputs ,
93
+ > ,
91
94
) ;
92
95
96
+ impl BoxedResolver {
97
+ fn new < T > ( generator : T ) -> ( Result < ast:: Crate > , Self )
98
+ where
99
+ T : :: std:: ops:: Generator <
100
+ rustc_data_structures:: box_region:: Action ,
101
+ Yield = rustc_data_structures:: box_region:: YieldType <
102
+ Result < ast:: Crate > ,
103
+ fn ( & mut Resolver < ' _ > ) ,
104
+ > ,
105
+ Return = ResolverOutputs ,
106
+ > + ' static ,
107
+ {
108
+ let ( initial, pinned) = rustc_data_structures:: box_region:: PinnedGenerator :: new ( generator) ;
109
+ ( initial, BoxedResolver ( pinned) )
110
+ }
111
+
112
+ pub fn access < F : FnOnce ( & mut Resolver < ' _ > ) -> R , R > ( & mut self , f : F ) -> R {
113
+ // Turn the FnOnce closure into *mut dyn FnMut()
114
+ // so we can pass it in to the generator
115
+ let mut r = None ;
116
+ let mut f = Some ( f) ;
117
+ let mut_f: & mut dyn FnMut ( & mut Resolver < ' _ > ) = & mut |resolver| {
118
+ let f = f. take ( ) . unwrap ( ) ;
119
+ r = Some ( f ( resolver) ) ;
120
+ } ;
121
+ let mut_f = mut_f as * mut dyn FnMut ( & mut Resolver < ' _ > ) ;
122
+
123
+ // Get the generator to call our closure
124
+ unsafe {
125
+ self . 0 . access ( :: std:: mem:: transmute ( mut_f) ) ;
126
+ }
127
+
128
+ // Unwrap the result
129
+ r. unwrap ( )
130
+ }
131
+
132
+ pub fn complete ( mut self ) -> ResolverOutputs {
133
+ self . 0 . complete ( )
134
+ }
135
+
136
+ fn initial_yield (
137
+ value : Result < ast:: Crate > ,
138
+ ) -> rustc_data_structures:: box_region:: YieldType < Result < ast:: Crate > , fn ( & mut Resolver < ' _ > ) >
139
+ {
140
+ rustc_data_structures:: box_region:: YieldType :: Initial ( value)
141
+ }
142
+ }
143
+
93
144
/// Runs the "early phases" of the compiler: initial `cfg` processing, loading compiler plugins,
94
145
/// syntax expansion, secondary `cfg` expansion, synthesis of a test
95
146
/// harness if one is to be provided, injection of a dependency on the
@@ -132,7 +183,28 @@ pub fn configure_and_expand(
132
183
resolver
133
184
}
134
185
} ;
135
- box_region_allow_access ! ( ( & mut Resolver <' _>) , ( & mut resolver) , action) ;
186
+
187
+ loop {
188
+ match action {
189
+ rustc_data_structures:: box_region:: Action :: Access ( accessor) => {
190
+ let accessor: & mut dyn FnMut ( & mut Resolver < ' _ > ) =
191
+ unsafe { :: std:: mem:: transmute ( accessor. get ( ) ) } ;
192
+ ( * accessor) ( & mut resolver) ;
193
+ unsafe {
194
+ let marker = rustc_data_structures:: box_region:: Marker :: <
195
+ fn ( & mut Resolver < ' _ > ) ,
196
+ > :: new ( ) ;
197
+ action =
198
+ yield rustc_data_structures:: box_region:: YieldType :: Accessor ( marker) ;
199
+ } ;
200
+ }
201
+ rustc_data_structures:: box_region:: Action :: Complete => break ,
202
+ rustc_data_structures:: box_region:: Action :: Initial => {
203
+ panic ! ( "unexpected box_region action: Initial" )
204
+ }
205
+ }
206
+ }
207
+
136
208
resolver. into_outputs ( )
137
209
} ) ;
138
210
result. map ( |k| ( k, resolver) )
0 commit comments