@@ -16,6 +16,7 @@ use super::{
1616
1717struct MoveDataBuilder < ' a , ' tcx , F > {
1818body : & ' a Body < ' tcx > ,
19+ loc : Location ,
1920tcx : TyCtxt < ' tcx > ,
2021param_env : ty:: ParamEnv < ' tcx > ,
2122data : MoveData < ' tcx > ,
@@ -56,6 +57,7 @@ impl<'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> MoveDataBuilder<'a, 'tcx, F> {
5657
5758MoveDataBuilder {
5859 body,
60+ loc : Location :: START ,
5961 tcx,
6062 param_env,
6163data : MoveData {
@@ -107,7 +109,7 @@ enum MovePathResult {
107109Error ,
108110}
109111
110- impl < ' b , ' a , ' tcx , F : Fn ( Ty < ' tcx > ) -> bool > Gatherer < ' b , ' a , ' tcx , F > {
112+ impl < ' a , ' tcx , F : Fn ( Ty < ' tcx > ) -> bool > MoveDataBuilder < ' a , ' tcx , F > {
111113/// This creates a MovePath for a given place, returning an `MovePathError`
112114/// if that place can't be moved from.
113115///
@@ -116,7 +118,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
116118///
117119/// Maybe we should have separate "borrowck" and "moveck" modes.
118120fn move_path_for ( & mut self , place : Place < ' tcx > ) -> MovePathResult {
119- let data = & mut self . builder . data ;
121+ let data = & mut self . data ;
120122
121123debug ! ( "lookup({:?})" , place) ;
122124let Some ( mut base) = data. rev_lookup . find_local ( place. local ) else {
@@ -131,8 +133,8 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
131133let mut union_path = None ;
132134
133135for ( place_ref, elem) in data. rev_lookup . un_derefer . iter_projections ( place. as_ref ( ) ) {
134- let body = self . builder . body ;
135- let tcx = self . builder . tcx ;
136+ let body = self . body ;
137+ let tcx = self . tcx ;
136138let place_ty = place_ref. ty ( body, tcx) . ty ;
137139if place_ty. references_error ( ) {
138140return MovePathResult :: Error ;
@@ -238,7 +240,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
238240 | ProjectionElem :: Downcast ( _, _) => ( ) ,
239241}
240242let elem_ty = PlaceTy :: from_ty ( place_ty) . projection_ty ( tcx, elem) . ty ;
241- if !( self . builder . filter ) ( elem_ty) {
243+ if !( self . filter ) ( elem_ty) {
242244return MovePathResult :: Error ;
243245}
244246if union_path. is_none ( ) {
@@ -274,7 +276,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
274276data : MoveData { rev_lookup, move_paths, path_map, init_path_map, .. } ,
275277 tcx,
276278 ..
277- } = self . builder ;
279+ } = self ;
278280* rev_lookup. projections . entry ( ( base, elem. lift ( ) ) ) . or_insert_with ( move || {
279281new_move_path ( move_paths, path_map, init_path_map, Some ( base) , mk_place ( * tcx) )
280282} )
@@ -285,9 +287,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
285287// drop), so this not being a valid move path is OK.
286288let _ = self . move_path_for ( place) ;
287289}
288- }
289290
290- impl < ' a , ' tcx , F > MoveDataBuilder < ' a , ' tcx , F > {
291291fn finalize ( self ) -> MoveData < ' tcx > {
292292debug ! ( "{}" , {
293293 debug!( "moves for {:?}:" , self . body. span) ;
@@ -317,12 +317,12 @@ pub(super) fn gather_moves<'tcx>(
317317
318318for ( bb, block) in body. basic_blocks . iter_enumerated ( ) {
319319for ( i, stmt) in block. statements . iter ( ) . enumerate ( ) {
320- let source = Location { block : bb, statement_index : i } ;
321- builder. gather_statement ( source , stmt) ;
320+ builder . loc = Location { block : bb, statement_index : i } ;
321+ builder. gather_statement ( stmt) ;
322322}
323323
324- let terminator_loc = Location { block : bb, statement_index : block. statements . len ( ) } ;
325- builder. gather_terminator ( terminator_loc , block. terminator ( ) ) ;
324+ builder . loc = Location { block : bb, statement_index : block. statements . len ( ) } ;
325+ builder. gather_terminator ( block. terminator ( ) ) ;
326326}
327327
328328 builder. finalize ( )
@@ -345,30 +345,14 @@ impl<'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> MoveDataBuilder<'a, 'tcx, F> {
345345}
346346}
347347
348- fn gather_statement ( & mut self , loc : Location , stmt : & Statement < ' tcx > ) {
349- debug ! ( "gather_statement({:?}, {:?})" , loc, stmt) ;
350- ( Gatherer { builder : self , loc } ) . gather_statement ( stmt) ;
351- }
352-
353- fn gather_terminator ( & mut self , loc : Location , term : & Terminator < ' tcx > ) {
354- debug ! ( "gather_terminator({:?}, {:?})" , loc, term) ;
355- ( Gatherer { builder : self , loc } ) . gather_terminator ( term) ;
356- }
357- }
358-
359- struct Gatherer < ' b , ' a , ' tcx , F > {
360- builder : & ' b mut MoveDataBuilder < ' a , ' tcx , F > ,
361- loc : Location ,
362- }
363-
364- impl < ' b , ' a , ' tcx , F : Fn ( Ty < ' tcx > ) -> bool > Gatherer < ' b , ' a , ' tcx , F > {
365348fn gather_statement ( & mut self , stmt : & Statement < ' tcx > ) {
349+ debug ! ( "gather_statement({:?}, {:?})" , self . loc, stmt) ;
366350match & stmt. kind {
367351StatementKind :: Assign ( box ( place, Rvalue :: CopyForDeref ( reffed) ) ) => {
368352let local = place. as_local ( ) . unwrap ( ) ;
369- assert ! ( self . builder . body. local_decls[ local] . is_deref_temp( ) ) ;
353+ assert ! ( self . body. local_decls[ local] . is_deref_temp( ) ) ;
370354
371- let rev_lookup = & mut self . builder . data . rev_lookup ;
355+ let rev_lookup = & mut self . data . rev_lookup ;
372356
373357 rev_lookup. un_derefer . insert ( local, reffed. as_ref ( ) ) ;
374358let base_local = rev_lookup. un_derefer . deref_chain ( local) . first ( ) . unwrap ( ) . local ;
@@ -380,7 +364,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
380364// Box starts out uninitialized - need to create a separate
381365// move-path for the interior so it will be separate from
382366// the exterior.
383- self . create_move_path ( self . builder . tcx . mk_place_deref ( * place) ) ;
367+ self . create_move_path ( self . tcx . mk_place_deref ( * place) ) ;
384368self . gather_init ( place. as_ref ( ) , InitKind :: Shallow ) ;
385369} else {
386370self . gather_init ( place. as_ref ( ) , InitKind :: Deep ) ;
@@ -393,7 +377,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
393377StatementKind :: StorageLive ( _) => { }
394378StatementKind :: StorageDead ( local) => {
395379// DerefTemp locals (results of CopyForDeref) don't actually move anything.
396- if !self . builder . body . local_decls [ * local] . is_deref_temp ( ) {
380+ if !self . body . local_decls [ * local] . is_deref_temp ( ) {
397381self . gather_move ( Place :: from ( * local) ) ;
398382}
399383}
@@ -443,6 +427,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
443427}
444428
445429fn gather_terminator ( & mut self , term : & Terminator < ' tcx > ) {
430+ debug ! ( "gather_terminator({:?}, {:?})" , self . loc, term) ;
446431match term. kind {
447432TerminatorKind :: Goto { target : _ }
448433 | TerminatorKind :: FalseEdge { .. }
@@ -551,7 +536,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
551536// `ConstIndex` patterns. This is done to ensure that all move paths
552537// are disjoint, which is expected by drop elaboration.
553538let base_place =
554- Place { local : place. local , projection : self . builder . tcx . mk_place_elems ( base) } ;
539+ Place { local : place. local , projection : self . tcx . mk_place_elems ( base) } ;
555540let base_path = match self . move_path_for ( base_place) {
556541MovePathResult :: Path ( path) => path,
557542MovePathResult :: Union ( path) => {
@@ -562,11 +547,9 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
562547return ;
563548}
564549} ;
565- let base_ty = base_place. ty ( self . builder . body , self . builder . tcx ) . ty ;
550+ let base_ty = base_place. ty ( self . body , self . tcx ) . ty ;
566551let len: u64 = match base_ty. kind ( ) {
567- ty:: Array ( _, size) => {
568- size. eval_target_usize ( self . builder . tcx , self . builder . param_env )
569- }
552+ ty:: Array ( _, size) => size. eval_target_usize ( self . tcx , self . param_env ) ,
570553 _ => bug ! ( "from_end: false slice pattern of non-array type" ) ,
571554} ;
572555for offset in from..to {
@@ -587,13 +570,13 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
587570}
588571
589572fn record_move ( & mut self , place : Place < ' tcx > , path : MovePathIndex ) {
590- let move_out = self . builder . data . moves . push ( MoveOut { path, source : self . loc } ) ;
573+ let move_out = self . data . moves . push ( MoveOut { path, source : self . loc } ) ;
591574debug ! (
592575"gather_move({:?}, {:?}): adding move {:?} of {:?}" ,
593576self . loc, place, move_out, path
594577) ;
595- self . builder . data . path_map [ path] . push ( move_out) ;
596- self . builder . data . loc_map [ self . loc ] . push ( move_out) ;
578+ self . data . path_map [ path] . push ( move_out) ;
579+ self . data . loc_map [ self . loc ] . push ( move_out) ;
597580}
598581
599582fn gather_init ( & mut self , place : PlaceRef < ' tcx > , kind : InitKind ) {
@@ -604,13 +587,13 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
604587// Check if we are assigning into a field of a union, if so, lookup the place
605588// of the union so it is marked as initialized again.
606589if let Some ( ( place_base, ProjectionElem :: Field ( _, _) ) ) = place. last_projection ( ) {
607- if place_base. ty ( self . builder . body , self . builder . tcx ) . ty . is_union ( ) {
590+ if place_base. ty ( self . body , self . tcx ) . ty . is_union ( ) {
608591 place = place_base;
609592}
610593}
611594
612- if let LookupResult :: Exact ( path) = self . builder . data . rev_lookup . find ( place) {
613- let init = self . builder . data . inits . push ( Init {
595+ if let LookupResult :: Exact ( path) = self . data . rev_lookup . find ( place) {
596+ let init = self . data . inits . push ( Init {
614597location : InitLocation :: Statement ( self . loc ) ,
615598 path,
616599 kind,
@@ -621,8 +604,8 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
621604self . loc, place, init, path
622605) ;
623606
624- self . builder . data . init_path_map [ path] . push ( init) ;
625- self . builder . data . init_loc_map [ self . loc ] . push ( init) ;
607+ self . data . init_path_map [ path] . push ( init) ;
608+ self . data . init_loc_map [ self . loc ] . push ( init) ;
626609}
627610}
628611}
0 commit comments