@@ -19,7 +19,7 @@ use std::path::PathBuf;
19
19
use std:: usize;
20
20
21
21
use super :: MirBorrowckCtxtPreDataflow ;
22
- use super :: gather_moves:: { Location , MoveData , MovePathData , MovePathIndex , MoveOutIndex , PathMap } ;
22
+ use super :: gather_moves:: { Location , MoveData , MovePathIndex , MoveOutIndex } ;
23
23
use super :: gather_moves:: { MoveOut , MovePath } ;
24
24
use super :: DropFlagState ;
25
25
@@ -99,40 +99,6 @@ impl<'a, 'tcx: 'a, BD> DataflowAnalysis<'a, 'tcx, BD>
99
99
}
100
100
}
101
101
102
- fn on_all_children_bits < Each > ( path_map : & PathMap ,
103
- move_paths : & MovePathData ,
104
- move_path_index : MovePathIndex ,
105
- mut each_child : Each )
106
- where Each : FnMut ( MoveOutIndex )
107
- {
108
- return on_all_children_bits_recur (
109
- path_map, move_paths, move_path_index, & mut each_child) ;
110
-
111
- fn on_all_children_bits_recur < Each > ( path_map : & PathMap ,
112
- move_paths : & MovePathData ,
113
- move_path_index : MovePathIndex ,
114
- each_child : & mut Each )
115
- where Each : FnMut ( MoveOutIndex )
116
- {
117
- // 1. invoke `each_child` callback for all moves that directly
118
- // influence path for `move_path_index`
119
- for move_index in & path_map[ move_path_index] {
120
- each_child ( * move_index) ;
121
- }
122
-
123
- // 2. for each child of the path (that is named in this
124
- // function), recur.
125
- //
126
- // (Unnamed children are irrelevant to dataflow; by
127
- // definition they have no associated moves.)
128
- let mut next_child_index = move_paths[ move_path_index] . first_child ;
129
- while let Some ( child_index) = next_child_index {
130
- on_all_children_bits_recur ( path_map, move_paths, child_index, each_child) ;
131
- next_child_index = move_paths[ child_index] . next_sibling ;
132
- }
133
- }
134
- }
135
-
136
102
impl < ' b , ' a : ' b , ' tcx : ' a , BD > PropagationContext < ' b , ' a , ' tcx , BD >
137
103
where BD : BitDenotation , BD :: Ctxt : HasMoveData < ' tcx >
138
104
{
@@ -161,23 +127,23 @@ impl<'b, 'a: 'b, 'tcx: 'a, BD> PropagationContext<'b, 'a, 'tcx, BD>
161
127
}
162
128
}
163
129
130
+ fn dataflow_path ( context : & str , prepost : & str , path : & str ) -> PathBuf {
131
+ format ! ( "{}_{}" , context, prepost) ;
132
+ let mut path = PathBuf :: from ( path) ;
133
+ let new_file_name = {
134
+ let orig_file_name = path. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
135
+ format ! ( "{}_{}" , context, orig_file_name)
136
+ } ;
137
+ path. set_file_name ( new_file_name) ;
138
+ path
139
+ }
140
+
164
141
impl < ' a , ' tcx : ' a , BD > MirBorrowckCtxtPreDataflow < ' a , ' tcx , BD >
165
142
where BD : BitDenotation , BD :: Bit : Debug , BD :: Ctxt : HasMoveData < ' tcx >
166
143
{
167
- fn path ( context : & str , prepost : & str , path : & str ) -> PathBuf {
168
- format ! ( "{}_{}" , context, prepost) ;
169
- let mut path = PathBuf :: from ( path) ;
170
- let new_file_name = {
171
- let orig_file_name = path. file_name ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
172
- format ! ( "{}_{}" , context, orig_file_name)
173
- } ;
174
- path. set_file_name ( new_file_name) ;
175
- path
176
- }
177
-
178
144
fn pre_dataflow_instrumentation ( & self ) -> io:: Result < ( ) > {
179
145
if let Some ( ref path_str) = self . print_preflow_to {
180
- let path = Self :: path ( BD :: name ( ) , "preflow" , path_str) ;
146
+ let path = dataflow_path ( BD :: name ( ) , "preflow" , path_str) ;
181
147
graphviz:: print_borrowck_graph_to ( self , & path)
182
148
} else {
183
149
Ok ( ( ) )
@@ -186,7 +152,7 @@ impl<'a, 'tcx: 'a, BD> MirBorrowckCtxtPreDataflow<'a, 'tcx, BD>
186
152
187
153
fn post_dataflow_instrumentation ( & self ) -> io:: Result < ( ) > {
188
154
if let Some ( ref path_str) = self . print_postflow_to {
189
- let path = Self :: path ( BD :: name ( ) , "postflow" , path_str) ;
155
+ let path = dataflow_path ( BD :: name ( ) , "postflow" , path_str) ;
190
156
graphviz:: print_borrowck_graph_to ( self , & path)
191
157
} else {
192
158
Ok ( ( ) )
@@ -746,9 +712,8 @@ impl<'a, 'tcx> BitDenotation for MovingOutStatements<'a, 'tcx> {
746
712
sets : & mut BlockSets ,
747
713
bb : repr:: BasicBlock ,
748
714
idx : usize ) {
749
- let & ( _tcx , mir, ref move_data) = ctxt;
715
+ let & ( tcx , mir, ref move_data) = ctxt;
750
716
let stmt = & mir. basic_block_data ( bb) . statements [ idx] ;
751
- let move_paths = & move_data. move_paths ;
752
717
let loc_map = & move_data. loc_map ;
753
718
let path_map = & move_data. path_map ;
754
719
let rev_lookup = & move_data. rev_lookup ;
@@ -771,13 +736,14 @@ impl<'a, 'tcx> BitDenotation for MovingOutStatements<'a, 'tcx> {
771
736
let move_path_index = rev_lookup. find ( lvalue) ;
772
737
773
738
sets. kill_set . set_bit ( move_path_index. idx ( ) ) ;
774
- on_all_children_bits ( path_map,
775
- move_paths,
776
- move_path_index,
777
- |moi| {
778
- assert ! ( moi. idx( ) < bits_per_block) ;
779
- sets. kill_set . set_bit ( moi. idx ( ) ) ;
780
- } ) ;
739
+ super :: on_all_children_bits ( tcx,
740
+ mir,
741
+ move_data,
742
+ move_path_index,
743
+ |mpi| for moi in & path_map[ mpi] {
744
+ assert ! ( moi. idx( ) < bits_per_block) ;
745
+ sets. kill_set . set_bit ( moi. idx ( ) ) ;
746
+ } ) ;
781
747
}
782
748
}
783
749
}
@@ -812,13 +778,15 @@ impl<'a, 'tcx> BitDenotation for MovingOutStatements<'a, 'tcx> {
812
778
let bits_per_block = self . bits_per_block ( ctxt) ;
813
779
814
780
in_out. clear_bit ( move_path_index. idx ( ) ) ;
815
- on_all_children_bits ( & move_data. path_map ,
816
- & move_data. move_paths ,
817
- move_path_index,
818
- |moi| {
819
- assert ! ( moi. idx( ) < bits_per_block) ;
820
- in_out. clear_bit ( moi. idx ( ) ) ;
821
- } ) ;
781
+ let path_map = & move_data. path_map ;
782
+ super :: on_all_children_bits ( ctxt. 0 ,
783
+ ctxt. 1 ,
784
+ move_data,
785
+ move_path_index,
786
+ |mpi| for moi in & path_map[ mpi] {
787
+ assert ! ( moi. idx( ) < bits_per_block) ;
788
+ in_out. clear_bit ( moi. idx ( ) ) ;
789
+ } ) ;
822
790
}
823
791
}
824
792
0 commit comments