@@ -43,7 +43,7 @@ pub struct MoveData {
43
43
/// Assignments to a variable, like `x = foo`. These are assigned
44
44
/// bits for dataflow, since we must track them to ensure that
45
45
/// immutable variables are assigned at most once along each path.
46
- var_assignments : ~[ Assignment ] ,
46
+ var_assignments : RefCell < ~[ Assignment ] > ,
47
47
48
48
/// Assignments to a path, like `x.f = foo`. These are not
49
49
/// assigned dataflow bits, but we track them because they still
@@ -169,7 +169,7 @@ impl MoveData {
169
169
path_map : RefCell :: new ( HashMap :: new ( ) ) ,
170
170
moves : RefCell :: new ( ~[ ] ) ,
171
171
path_assignments : RefCell :: new ( ~[ ] ) ,
172
- var_assignments : ~[ ] ,
172
+ var_assignments : RefCell :: new ( ~[ ] ) ,
173
173
assignee_ids : HashSet :: new ( ) ,
174
174
}
175
175
}
@@ -404,10 +404,11 @@ impl MoveData {
404
404
} ;
405
405
406
406
if self . is_var_path ( path_index) {
407
+ let mut var_assignments = self . var_assignments . borrow_mut ( ) ;
407
408
debug ! ( "add_assignment[var](lp={}, assignment={}, path_index={:?})" ,
408
- lp. repr( tcx) , self . var_assignments. len( ) , path_index) ;
409
+ lp. repr( tcx) , var_assignments. get ( ) . len( ) , path_index) ;
409
410
410
- self . var_assignments . push ( assignment) ;
411
+ var_assignments. get ( ) . push ( assignment) ;
411
412
} else {
412
413
debug ! ( "add_assignment[path](lp={}, path_index={:?})" ,
413
414
lp. repr( tcx) , path_index) ;
@@ -438,9 +439,12 @@ impl MoveData {
438
439
}
439
440
}
440
441
441
- for ( i, assignment) in self . var_assignments . iter ( ) . enumerate ( ) {
442
- dfcx_assign. add_gen ( assignment. id , i) ;
443
- self . kill_moves ( assignment. path , assignment. id , dfcx_moves) ;
442
+ {
443
+ let var_assignments = self . var_assignments . borrow ( ) ;
444
+ for ( i, assignment) in var_assignments. get ( ) . iter ( ) . enumerate ( ) {
445
+ dfcx_assign. add_gen ( assignment. id , i) ;
446
+ self . kill_moves ( assignment. path , assignment. id , dfcx_moves) ;
447
+ }
444
448
}
445
449
446
450
{
@@ -470,14 +474,18 @@ impl MoveData {
470
474
}
471
475
472
476
// Kill all assignments when the variable goes out of scope:
473
- for ( assignment_index, assignment) in self . var_assignments . iter ( ) . enumerate ( ) {
474
- match * self . path_loan_path ( assignment. path ) {
475
- LpVar ( id) => {
476
- let kill_id = tcx. region_maps . encl_scope ( id) ;
477
- dfcx_assign. add_kill ( kill_id, assignment_index) ;
478
- }
479
- LpExtend ( ..) => {
480
- tcx. sess . bug ( "Var assignment for non var path" ) ;
477
+ {
478
+ let var_assignments = self . var_assignments . borrow ( ) ;
479
+ for ( assignment_index, assignment) in
480
+ var_assignments. get ( ) . iter ( ) . enumerate ( ) {
481
+ match * self . path_loan_path ( assignment. path ) {
482
+ LpVar ( id) => {
483
+ let kill_id = tcx. region_maps . encl_scope ( id) ;
484
+ dfcx_assign. add_kill ( kill_id, assignment_index) ;
485
+ }
486
+ LpExtend ( ..) => {
487
+ tcx. sess . bug ( "Var assignment for non var path" ) ;
488
+ }
481
489
}
482
490
}
483
491
}
@@ -560,12 +568,14 @@ impl FlowedMoveData {
560
568
id_range,
561
569
moves. get ( ) . len ( ) )
562
570
} ;
563
- let mut dfcx_assign =
571
+ let mut dfcx_assign = {
572
+ let var_assignments = move_data. var_assignments . borrow ( ) ;
564
573
DataFlowContext :: new ( tcx,
565
574
method_map,
566
575
AssignDataFlowOperator ,
567
576
id_range,
568
- move_data. var_assignments . len ( ) ) ;
577
+ var_assignments. get ( ) . len ( ) )
578
+ } ;
569
579
move_data. add_gen_kills ( tcx, & mut dfcx_moves, & mut dfcx_assign) ;
570
580
dfcx_moves. propagate ( body) ;
571
581
dfcx_assign. propagate ( body) ;
@@ -681,7 +691,8 @@ impl FlowedMoveData {
681
691
} ;
682
692
683
693
self . dfcx_assign . each_bit_on_entry_frozen ( id, |index| {
684
- let assignment = & self . move_data . var_assignments [ index] ;
694
+ let var_assignments = self . move_data . var_assignments . borrow ( ) ;
695
+ let assignment = & var_assignments. get ( ) [ index] ;
685
696
if assignment. path == loan_path_index && !f ( assignment) {
686
697
false
687
698
} else {
0 commit comments