Skip to content

Commit 4eecc0d

Browse files
committed
---
yaml --- r: 147677 b: refs/heads/try2 c: 111e167 h: refs/heads/master i: 147675: d74f1fb v: v3
1 parent d40f0c5 commit 4eecc0d

File tree

2 files changed

+30
-19
lines changed

2 files changed

+30
-19
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 460305749c3b8c0a0726f490e7669f8259e6bbb9
8+
refs/heads/try2: 111e167f48bd2e850e33828f2cb8837ce0da44a7
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/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)