@@ -799,8 +799,8 @@ fn Resolver(session: Session,
799799 unresolved_imports : 0 ,
800800
801801 current_module : current_module,
802- value_ribs : @mut ~[ ] ,
803- type_ribs : @mut ~[ ] ,
802+ value_ribs : @RefCell :: new ( ~[ ] ) ,
803+ type_ribs : @RefCell :: new ( ~[ ] ) ,
804804 label_ribs : @RefCell :: new ( ~[ ] ) ,
805805
806806 current_trait_refs : None ,
@@ -846,10 +846,10 @@ struct Resolver {
846846
847847 // The current set of local scopes, for values.
848848 // FIXME #4948: Reuse ribs to avoid allocation.
849- value_ribs : @mut ~[ @Rib ] ,
849+ value_ribs : @RefCell < ~[ @Rib ] > ,
850850
851851 // The current set of local scopes, for types.
852- type_ribs : @mut ~[ @Rib ] ,
852+ type_ribs : @RefCell < ~[ @Rib ] > ,
853853
854854 // The current set of local scopes, for labels.
855855 label_ribs : @RefCell < ~[ @Rib ] > ,
@@ -3673,7 +3673,10 @@ impl Resolver {
36733673 item_trait( ref generics, ref traits, ref methods) => {
36743674 // Create a new rib for the self type.
36753675 let self_type_rib = @Rib :: new ( NormalRibKind ) ;
3676- self . type_ribs . push ( self_type_rib) ;
3676+ {
3677+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
3678+ type_ribs. get ( ) . push ( self_type_rib) ;
3679+ }
36773680 // plain insert (no renaming)
36783681 let name = self . type_self_ident . name ;
36793682 {
@@ -3731,7 +3734,8 @@ impl Resolver {
37313734 }
37323735 } ) ;
37333736
3734- self . type_ribs . pop ( ) ;
3737+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
3738+ type_ribs. get ( ) . pop ( ) ;
37353739 }
37363740
37373741 item_struct( ref struct_def, ref generics) => {
@@ -3802,7 +3806,10 @@ impl Resolver {
38023806 rib_kind) => {
38033807
38043808 let function_type_rib = @Rib :: new ( rib_kind) ;
3805- self . type_ribs . push ( function_type_rib) ;
3809+ {
3810+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
3811+ type_ribs. get ( ) . push ( function_type_rib) ;
3812+ }
38063813
38073814 for ( index, type_parameter) in generics. ty_params . iter ( ) . enumerate ( ) {
38083815 let ident = type_parameter. ident ;
@@ -3831,7 +3838,8 @@ impl Resolver {
38313838
38323839 match type_parameters {
38333840 HasTypeParameters ( ..) => {
3834- self . type_ribs . pop ( ) ;
3841+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
3842+ type_ribs. get ( ) . pop ( ) ;
38353843 }
38363844
38373845 NoTypeParameters => {
@@ -3855,11 +3863,19 @@ impl Resolver {
38553863 }
38563864
38573865 fn with_constant_rib ( & mut self , f: |& mut Resolver |) {
3858- self . value_ribs . push ( @Rib :: new ( ConstantItemRibKind ) ) ;
3859- self . type_ribs . push ( @Rib :: new ( ConstantItemRibKind ) ) ;
3866+ {
3867+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
3868+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
3869+ value_ribs. get ( ) . push ( @Rib :: new ( ConstantItemRibKind ) ) ;
3870+ type_ribs. get ( ) . push ( @Rib :: new ( ConstantItemRibKind ) ) ;
3871+ }
38603872 f ( self ) ;
3861- self . type_ribs . pop ( ) ;
3862- self . value_ribs . pop ( ) ;
3873+ {
3874+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
3875+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
3876+ type_ribs. get ( ) . pop ( ) ;
3877+ value_ribs. get ( ) . pop ( ) ;
3878+ }
38633879 }
38643880
38653881 fn resolve_function ( & mut self ,
@@ -3870,7 +3886,10 @@ impl Resolver {
38703886 self_binding : SelfBinding ) {
38713887 // Create a value rib for the function.
38723888 let function_value_rib = @Rib :: new ( rib_kind) ;
3873- self . value_ribs . push ( function_value_rib) ;
3889+ {
3890+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
3891+ value_ribs. get ( ) . push ( function_value_rib) ;
3892+ }
38743893
38753894 // Create a label rib for the function.
38763895 {
@@ -3935,7 +3954,9 @@ impl Resolver {
39353954
39363955 let mut label_ribs = self . label_ribs . borrow_mut ( ) ;
39373956 label_ribs. get ( ) . pop ( ) ;
3938- self . value_ribs . pop ( ) ;
3957+
3958+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
3959+ value_ribs. get ( ) . pop ( ) ;
39393960 }
39403961
39413962 fn resolve_type_parameters ( & mut self ,
@@ -4208,7 +4229,10 @@ impl Resolver {
42084229 }
42094230
42104231 fn resolve_arm ( & mut self , arm : & Arm ) {
4211- self . value_ribs . push ( @Rib :: new ( NormalRibKind ) ) ;
4232+ {
4233+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
4234+ value_ribs. get ( ) . push ( @Rib :: new ( NormalRibKind ) ) ;
4235+ }
42124236
42134237 let mut bindings_list = HashMap :: new ( ) ;
42144238 for pattern in arm. pats . iter ( ) {
@@ -4224,12 +4248,16 @@ impl Resolver {
42244248 visit:: walk_expr_opt ( self , arm. guard , ( ) ) ;
42254249 self . resolve_block ( arm. body ) ;
42264250
4227- self . value_ribs . pop ( ) ;
4251+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
4252+ value_ribs. get ( ) . pop ( ) ;
42284253 }
42294254
42304255 fn resolve_block ( & mut self , block : P < Block > ) {
42314256 debug ! ( "(resolving block) entering block" ) ;
4232- self . value_ribs . push ( @Rib :: new ( NormalRibKind ) ) ;
4257+ {
4258+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
4259+ value_ribs. get ( ) . push ( @Rib :: new ( NormalRibKind ) ) ;
4260+ }
42334261
42344262 // Move down in the graph, if there's an anonymous module rooted here.
42354263 let orig_module = self . current_module ;
@@ -4251,7 +4279,8 @@ impl Resolver {
42514279 // Move back up.
42524280 self . current_module = orig_module;
42534281
4254- self . value_ribs . pop ( ) ;
4282+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
4283+ value_ribs. get ( ) . pop ( ) ;
42554284 debug ! ( "(resolving block) leaving block" ) ;
42564285 }
42574286
@@ -4456,9 +4485,11 @@ impl Resolver {
44564485 Some ( ref mut bindings_list)
44574486 if !bindings_list. contains_key ( & renamed) => {
44584487 let this = & mut * self ;
4459- let last_rib = this. value_ribs [
4460- this. value_ribs . len ( ) - 1 ] ;
44614488 {
4489+ let mut value_ribs =
4490+ this. value_ribs . borrow_mut ( ) ;
4491+ let last_rib = value_ribs. get ( ) [
4492+ value_ribs. get ( ) . len ( ) - 1 ] ;
44624493 let mut bindings =
44634494 last_rib. bindings . borrow_mut ( ) ;
44644495 bindings. get ( ) . insert ( renamed,
@@ -4481,9 +4512,11 @@ impl Resolver {
44814512 }
44824513 None => {
44834514 let this = & mut * self ;
4484- let last_rib = this. value_ribs [
4485- this. value_ribs . len ( ) - 1 ] ;
44864515 {
4516+ let mut value_ribs =
4517+ this. value_ribs . borrow_mut ( ) ;
4518+ let last_rib = value_ribs. get ( ) [
4519+ value_ribs. get ( ) . len ( ) - 1 ] ;
44874520 let mut bindings =
44884521 last_rib. bindings . borrow_mut ( ) ;
44894522 bindings. get ( ) . insert ( renamed,
@@ -4936,14 +4969,19 @@ impl Resolver {
49364969 match namespace {
49374970 ValueNS => {
49384971 let renamed = mtwt_resolve ( ident) ;
4939- search_result = self . search_ribs ( self . value_ribs , renamed,
4972+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
4973+ search_result = self . search_ribs ( value_ribs. get ( ) ,
4974+ renamed,
49404975 span,
49414976 DontAllowCapturingSelf ) ;
49424977 }
49434978 TypeNS => {
49444979 let name = ident. name ;
4945- search_result = self . search_ribs ( self . type_ribs , name,
4946- span, AllowCapturingSelf ) ;
4980+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
4981+ search_result = self . search_ribs ( type_ribs. get ( ) ,
4982+ name,
4983+ span,
4984+ AllowCapturingSelf ) ;
49474985 }
49484986 }
49494987
@@ -4964,12 +5002,20 @@ impl Resolver {
49645002 fn resolve_self_value_in_local_ribs ( & mut self , span : Span )
49655003 -> Option < Def > {
49665004 // FIXME #4950: This should not use a while loop.
4967- let mut i = self . value_ribs . len ( ) ;
5005+ let mut i = {
5006+ let value_ribs = self . value_ribs . borrow ( ) ;
5007+ value_ribs. get ( ) . len ( )
5008+ } ;
49685009 while i != 0 {
49695010 i -= 1 ;
4970- match self . value_ribs [ i] . self_binding . get ( ) {
5011+ let self_binding_opt = {
5012+ let value_ribs = self . value_ribs . borrow ( ) ;
5013+ value_ribs. get ( ) [ i] . self_binding . get ( )
5014+ } ;
5015+ match self_binding_opt {
49715016 Some ( def_like) => {
4972- match self . upvarify ( self . value_ribs ,
5017+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
5018+ match self . upvarify ( value_ribs. get ( ) ,
49735019 i,
49745020 def_like,
49755021 span,
@@ -5054,10 +5100,14 @@ impl Resolver {
50545100 let mut maybes: ~[ @str ] = ~[ ] ;
50555101 let mut values: ~[ uint ] = ~[ ] ;
50565102
5057- let mut j = this. value_ribs . len ( ) ;
5103+ let mut j = {
5104+ let value_ribs = this. value_ribs . borrow ( ) ;
5105+ value_ribs. get ( ) . len ( )
5106+ } ;
50585107 while j != 0 {
50595108 j -= 1 ;
5060- let bindings = this. value_ribs [ j] . bindings . borrow ( ) ;
5109+ let value_ribs = this. value_ribs . borrow ( ) ;
5110+ let bindings = value_ribs. get ( ) [ j] . bindings . borrow ( ) ;
50615111 for ( & k, _) in bindings. get ( ) . iter ( ) {
50625112 maybes. push ( interner_get ( k) ) ;
50635113 values. push ( uint:: max_value) ;
0 commit comments