@@ -6,10 +6,10 @@ use rustc_ast::mut_visit::MutVisitor;
66use rustc_ast:: { self as ast, visit} ;
77use rustc_codegen_ssa:: back:: link:: emit_metadata;
88use rustc_codegen_ssa:: traits:: CodegenBackend ;
9+ use rustc_data_structures:: parallel;
910use rustc_data_structures:: steal:: Steal ;
1011use rustc_data_structures:: sync:: { par_iter, Lrc , OnceCell , ParallelIterator , WorkerLocal } ;
1112use rustc_data_structures:: temp_dir:: MaybeTempDir ;
12- use rustc_data_structures:: { box_region_allow_access, declare_box_region_type, parallel} ;
1313use rustc_errors:: { ErrorReported , PResult } ;
1414use rustc_expand:: base:: ExtCtxt ;
1515use rustc_hir:: def_id:: LOCAL_CRATE ;
@@ -85,11 +85,62 @@ fn count_nodes(krate: &ast::Crate) -> usize {
8585 counter. count
8686}
8787
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+ > ,
9194) ;
9295
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+
93144/// Runs the "early phases" of the compiler: initial `cfg` processing, loading compiler plugins,
94145/// syntax expansion, secondary `cfg` expansion, synthesis of a test
95146/// harness if one is to be provided, injection of a dependency on the
@@ -132,7 +183,28 @@ pub fn configure_and_expand(
132183 resolver
133184 }
134185 } ;
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+
136208 resolver. into_outputs ( )
137209 } ) ;
138210 result. map ( |k| ( k, resolver) )
0 commit comments