@@ -187,19 +187,28 @@ struct OutOfScopePrecomputer<'a, 'tcx> {
187187 borrows_out_of_scope_at_location : FxIndexMap < Location , Vec < BorrowIndex > > ,
188188}
189189
190- impl < ' a , ' tcx > OutOfScopePrecomputer < ' a , ' tcx > {
191- fn new ( body : & ' a Body < ' tcx > , regioncx : & ' a RegionInferenceContext < ' tcx > ) -> Self {
192- OutOfScopePrecomputer {
190+ impl < ' tcx > OutOfScopePrecomputer < ' _ , ' tcx > {
191+ fn compute (
192+ body : & Body < ' tcx > ,
193+ regioncx : & RegionInferenceContext < ' tcx > ,
194+ borrow_set : & BorrowSet < ' tcx > ,
195+ ) -> FxIndexMap < Location , Vec < BorrowIndex > > {
196+ let mut prec = OutOfScopePrecomputer {
193197 visited : DenseBitSet :: new_empty ( body. basic_blocks . len ( ) ) ,
194198 visit_stack : vec ! [ ] ,
195199 body,
196200 regioncx,
197201 borrows_out_of_scope_at_location : FxIndexMap :: default ( ) ,
202+ } ;
203+ for ( borrow_index, borrow_data) in borrow_set. iter_enumerated ( ) {
204+ let borrow_region = borrow_data. region ;
205+ let location = borrow_data. reserve_location ;
206+ prec. precompute_borrows_out_of_scope ( borrow_index, borrow_region, location) ;
198207 }
208+
209+ prec. borrows_out_of_scope_at_location
199210 }
200- }
201211
202- impl < ' tcx > OutOfScopePrecomputer < ' _ , ' tcx > {
203212 fn precompute_borrows_out_of_scope (
204213 & mut self ,
205214 borrow_index : BorrowIndex ,
@@ -280,15 +289,7 @@ pub fn calculate_borrows_out_of_scope_at_location<'tcx>(
280289 regioncx : & RegionInferenceContext < ' tcx > ,
281290 borrow_set : & BorrowSet < ' tcx > ,
282291) -> FxIndexMap < Location , Vec < BorrowIndex > > {
283- let mut prec = OutOfScopePrecomputer :: new ( body, regioncx) ;
284- for ( borrow_index, borrow_data) in borrow_set. iter_enumerated ( ) {
285- let borrow_region = borrow_data. region ;
286- let location = borrow_data. reserve_location ;
287-
288- prec. precompute_borrows_out_of_scope ( borrow_index, borrow_region, location) ;
289- }
290-
291- prec. borrows_out_of_scope_at_location
292+ OutOfScopePrecomputer :: compute ( body, regioncx, borrow_set)
292293}
293294
294295struct PoloniusOutOfScopePrecomputer < ' a , ' tcx > {
@@ -300,19 +301,30 @@ struct PoloniusOutOfScopePrecomputer<'a, 'tcx> {
300301 loans_out_of_scope_at_location : FxIndexMap < Location , Vec < BorrowIndex > > ,
301302}
302303
303- impl < ' a , ' tcx > PoloniusOutOfScopePrecomputer < ' a , ' tcx > {
304- fn new ( body : & ' a Body < ' tcx > , regioncx : & ' a RegionInferenceContext < ' tcx > ) -> Self {
305- Self {
304+ impl < ' tcx > PoloniusOutOfScopePrecomputer < ' _ , ' tcx > {
305+ fn compute (
306+ body : & Body < ' tcx > ,
307+ regioncx : & RegionInferenceContext < ' tcx > ,
308+ borrow_set : & BorrowSet < ' tcx > ,
309+ ) -> FxIndexMap < Location , Vec < BorrowIndex > > {
310+ // The in-tree polonius analysis computes loans going out of scope using the
311+ // set-of-loans model.
312+ let mut prec = PoloniusOutOfScopePrecomputer {
306313 visited : DenseBitSet :: new_empty ( body. basic_blocks . len ( ) ) ,
307314 visit_stack : vec ! [ ] ,
308315 body,
309316 regioncx,
310317 loans_out_of_scope_at_location : FxIndexMap :: default ( ) ,
318+ } ;
319+ for ( loan_idx, loan_data) in borrow_set. iter_enumerated ( ) {
320+ let issuing_region = loan_data. region ;
321+ let loan_issued_at = loan_data. reserve_location ;
322+ prec. precompute_loans_out_of_scope ( loan_idx, issuing_region, loan_issued_at) ;
311323 }
324+
325+ prec. loans_out_of_scope_at_location
312326 }
313- }
314327
315- impl < ' tcx > PoloniusOutOfScopePrecomputer < ' _ , ' tcx > {
316328 /// Loans are in scope while they are live: whether they are contained within any live region.
317329 /// In the location-insensitive analysis, a loan will be contained in a region if the issuing
318330 /// region can reach it in the subset graph. So this is a reachability problem.
@@ -464,21 +476,7 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> {
464476 if !tcx. sess . opts . unstable_opts . polonius . is_next_enabled ( ) {
465477 calculate_borrows_out_of_scope_at_location ( body, regioncx, borrow_set)
466478 } else {
467- // The in-tree polonius analysis computes loans going out of scope using the
468- // set-of-loans model.
469- let mut polonius_prec = PoloniusOutOfScopePrecomputer :: new ( body, regioncx) ;
470- for ( loan_idx, loan_data) in borrow_set. iter_enumerated ( ) {
471- let issuing_region = loan_data. region ;
472- let loan_issued_at = loan_data. reserve_location ;
473-
474- polonius_prec. precompute_loans_out_of_scope (
475- loan_idx,
476- issuing_region,
477- loan_issued_at,
478- ) ;
479- }
480-
481- polonius_prec. loans_out_of_scope_at_location
479+ PoloniusOutOfScopePrecomputer :: compute ( body, regioncx, borrow_set)
482480 } ;
483481 Borrows { tcx, body, borrow_set, borrows_out_of_scope_at_location }
484482 }
0 commit comments