@@ -801,7 +801,7 @@ fn Resolver(session: Session,
801
801
current_module : current_module,
802
802
value_ribs : @mut ~[ ] ,
803
803
type_ribs : @mut ~[ ] ,
804
- label_ribs : @mut ~[ ] ,
804
+ label_ribs : @RefCell :: new ( ~[ ] ) ,
805
805
806
806
current_trait_refs : None ,
807
807
@@ -852,7 +852,7 @@ struct Resolver {
852
852
type_ribs : @mut ~[ @Rib ] ,
853
853
854
854
// The current set of local scopes, for labels.
855
- label_ribs : @mut ~[ @Rib ] ,
855
+ label_ribs : @RefCell < ~[ @Rib ] > ,
856
856
857
857
// The trait that the current context can refer to.
858
858
current_trait_refs : Option < ~[ DefId ] > ,
@@ -3833,9 +3833,17 @@ impl Resolver {
3833
3833
}
3834
3834
3835
3835
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
+
3837
3841
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
+ }
3839
3847
}
3840
3848
3841
3849
fn with_constant_rib ( & mut self , f: |& mut Resolver |) {
@@ -3857,8 +3865,11 @@ impl Resolver {
3857
3865
self . value_ribs . push ( function_value_rib) ;
3858
3866
3859
3867
// 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
+ }
3862
3873
3863
3874
// If this function has type parameters, add them now.
3864
3875
self . with_type_parameter_rib ( type_parameters, |this| {
@@ -3914,7 +3925,8 @@ impl Resolver {
3914
3925
debug ! ( "(resolving function) leaving function" ) ;
3915
3926
} ) ;
3916
3927
3917
- self . label_ribs . pop ( ) ;
3928
+ let mut label_ribs = self . label_ribs . borrow_mut ( ) ;
3929
+ label_ribs. get ( ) . pop ( ) ;
3918
3930
self . value_ribs . pop ( ) ;
3919
3931
}
3920
3932
@@ -5185,9 +5197,11 @@ impl Resolver {
5185
5197
ExprLoop ( _, Some ( label) ) => {
5186
5198
self . with_label_rib ( |this| {
5187
5199
let def_like = DlDef ( DefLabel ( expr. id ) ) ;
5188
- let rib = this. label_ribs [ this. label_ribs . len ( ) - 1 ] ;
5189
5200
// plain insert (no renaming)
5190
5201
{
5202
+ let mut label_ribs = this. label_ribs . borrow_mut ( ) ;
5203
+ let rib = label_ribs. get ( ) [ label_ribs. get ( ) . len ( ) -
5204
+ 1 ] ;
5191
5205
let mut bindings = rib. bindings . borrow_mut ( ) ;
5192
5206
bindings. get ( ) . insert ( label. name , def_like) ;
5193
5207
}
@@ -5199,7 +5213,8 @@ impl Resolver {
5199
5213
ExprForLoop ( ..) => fail ! ( "non-desugared expr_for_loop" ) ,
5200
5214
5201
5215
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 ,
5203
5218
DontAllowCapturingSelf ) {
5204
5219
None =>
5205
5220
self . resolve_error ( expr. span ,
0 commit comments