Skip to content

Commit 111e167

Browse files
committed
librustc: De-@mut MoveData::var_assignments
1 parent 4603057 commit 111e167

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

src/librustc/middle/borrowck/move_data.rs

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub struct MoveData {
4343
/// Assignments to a variable, like `x = foo`. These are assigned
4444
/// bits for dataflow, since we must track them to ensure that
4545
/// immutable variables are assigned at most once along each path.
46-
var_assignments: ~[Assignment],
46+
var_assignments: RefCell<~[Assignment]>,
4747

4848
/// Assignments to a path, like `x.f = foo`. These are not
4949
/// assigned dataflow bits, but we track them because they still
@@ -169,7 +169,7 @@ impl MoveData {
169169
path_map: RefCell::new(HashMap::new()),
170170
moves: RefCell::new(~[]),
171171
path_assignments: RefCell::new(~[]),
172-
var_assignments: ~[],
172+
var_assignments: RefCell::new(~[]),
173173
assignee_ids: HashSet::new(),
174174
}
175175
}
@@ -404,10 +404,11 @@ impl MoveData {
404404
};
405405

406406
if self.is_var_path(path_index) {
407+
let mut var_assignments = self.var_assignments.borrow_mut();
407408
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);
409410

410-
self.var_assignments.push(assignment);
411+
var_assignments.get().push(assignment);
411412
} else {
412413
debug!("add_assignment[path](lp={}, path_index={:?})",
413414
lp.repr(tcx), path_index);
@@ -438,9 +439,12 @@ impl MoveData {
438439
}
439440
}
440441

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+
}
444448
}
445449

446450
{
@@ -470,14 +474,18 @@ impl MoveData {
470474
}
471475

472476
// 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+
}
481489
}
482490
}
483491
}
@@ -560,12 +568,14 @@ impl FlowedMoveData {
560568
id_range,
561569
moves.get().len())
562570
};
563-
let mut dfcx_assign =
571+
let mut dfcx_assign = {
572+
let var_assignments = move_data.var_assignments.borrow();
564573
DataFlowContext::new(tcx,
565574
method_map,
566575
AssignDataFlowOperator,
567576
id_range,
568-
move_data.var_assignments.len());
577+
var_assignments.get().len())
578+
};
569579
move_data.add_gen_kills(tcx, &mut dfcx_moves, &mut dfcx_assign);
570580
dfcx_moves.propagate(body);
571581
dfcx_assign.propagate(body);
@@ -681,7 +691,8 @@ impl FlowedMoveData {
681691
};
682692

683693
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];
685696
if assignment.path == loan_path_index && !f(assignment) {
686697
false
687698
} else {

0 commit comments

Comments
 (0)