Skip to content

Commit 298d0b8

Browse files
committed
librustc: De-@mut label_ribs in the resolver
1 parent 7f816b7 commit 298d0b8

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

src/librustc/middle/resolve.rs

+24-9
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ fn Resolver(session: Session,
801801
current_module: current_module,
802802
value_ribs: @mut ~[],
803803
type_ribs: @mut ~[],
804-
label_ribs: @mut ~[],
804+
label_ribs: @RefCell::new(~[]),
805805

806806
current_trait_refs: None,
807807

@@ -852,7 +852,7 @@ struct Resolver {
852852
type_ribs: @mut ~[@Rib],
853853

854854
// The current set of local scopes, for labels.
855-
label_ribs: @mut ~[@Rib],
855+
label_ribs: @RefCell<~[@Rib]>,
856856

857857
// The trait that the current context can refer to.
858858
current_trait_refs: Option<~[DefId]>,
@@ -3833,9 +3833,17 @@ impl Resolver {
38333833
}
38343834

38353835
fn with_label_rib(&mut self, f: |&mut Resolver|) {
3836-
self.label_ribs.push(@Rib::new(NormalRibKind));
3836+
{
3837+
let mut label_ribs = self.label_ribs.borrow_mut();
3838+
label_ribs.get().push(@Rib::new(NormalRibKind));
3839+
}
3840+
38373841
f(self);
3838-
self.label_ribs.pop();
3842+
3843+
{
3844+
let mut label_ribs = self.label_ribs.borrow_mut();
3845+
label_ribs.get().pop();
3846+
}
38393847
}
38403848

38413849
fn with_constant_rib(&mut self, f: |&mut Resolver|) {
@@ -3857,8 +3865,11 @@ impl Resolver {
38573865
self.value_ribs.push(function_value_rib);
38583866

38593867
// Create a label rib for the function.
3860-
let function_label_rib = @Rib::new(rib_kind);
3861-
self.label_ribs.push(function_label_rib);
3868+
{
3869+
let mut label_ribs = self.label_ribs.borrow_mut();
3870+
let function_label_rib = @Rib::new(rib_kind);
3871+
label_ribs.get().push(function_label_rib);
3872+
}
38623873

38633874
// If this function has type parameters, add them now.
38643875
self.with_type_parameter_rib(type_parameters, |this| {
@@ -3914,7 +3925,8 @@ impl Resolver {
39143925
debug!("(resolving function) leaving function");
39153926
});
39163927

3917-
self.label_ribs.pop();
3928+
let mut label_ribs = self.label_ribs.borrow_mut();
3929+
label_ribs.get().pop();
39183930
self.value_ribs.pop();
39193931
}
39203932

@@ -5185,9 +5197,11 @@ impl Resolver {
51855197
ExprLoop(_, Some(label)) => {
51865198
self.with_label_rib(|this| {
51875199
let def_like = DlDef(DefLabel(expr.id));
5188-
let rib = this.label_ribs[this.label_ribs.len() - 1];
51895200
// plain insert (no renaming)
51905201
{
5202+
let mut label_ribs = this.label_ribs.borrow_mut();
5203+
let rib = label_ribs.get()[label_ribs.get().len() -
5204+
1];
51915205
let mut bindings = rib.bindings.borrow_mut();
51925206
bindings.get().insert(label.name, def_like);
51935207
}
@@ -5199,7 +5213,8 @@ impl Resolver {
51995213
ExprForLoop(..) => fail!("non-desugared expr_for_loop"),
52005214

52015215
ExprBreak(Some(label)) | ExprAgain(Some(label)) => {
5202-
match self.search_ribs(self.label_ribs, label, expr.span,
5216+
let mut label_ribs = self.label_ribs.borrow_mut();
5217+
match self.search_ribs(label_ribs.get(), label, expr.span,
52035218
DontAllowCapturingSelf) {
52045219
None =>
52055220
self.resolve_error(expr.span,

0 commit comments

Comments
 (0)