@@ -799,8 +799,8 @@ fn Resolver(session: Session,
799
799
unresolved_imports : 0 ,
800
800
801
801
current_module : current_module,
802
- value_ribs : @mut ~[ ] ,
803
- type_ribs : @mut ~[ ] ,
802
+ value_ribs : @RefCell :: new ( ~[ ] ) ,
803
+ type_ribs : @RefCell :: new ( ~[ ] ) ,
804
804
label_ribs : @RefCell :: new ( ~[ ] ) ,
805
805
806
806
current_trait_refs : None ,
@@ -846,10 +846,10 @@ struct Resolver {
846
846
847
847
// The current set of local scopes, for values.
848
848
// FIXME #4948: Reuse ribs to avoid allocation.
849
- value_ribs : @mut ~[ @Rib ] ,
849
+ value_ribs : @RefCell < ~[ @Rib ] > ,
850
850
851
851
// The current set of local scopes, for types.
852
- type_ribs : @mut ~[ @Rib ] ,
852
+ type_ribs : @RefCell < ~[ @Rib ] > ,
853
853
854
854
// The current set of local scopes, for labels.
855
855
label_ribs : @RefCell < ~[ @Rib ] > ,
@@ -3673,7 +3673,10 @@ impl Resolver {
3673
3673
item_trait( ref generics, ref traits, ref methods) => {
3674
3674
// Create a new rib for the self type.
3675
3675
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
+ }
3677
3680
// plain insert (no renaming)
3678
3681
let name = self . type_self_ident . name ;
3679
3682
{
@@ -3731,7 +3734,8 @@ impl Resolver {
3731
3734
}
3732
3735
} ) ;
3733
3736
3734
- self . type_ribs . pop ( ) ;
3737
+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
3738
+ type_ribs. get ( ) . pop ( ) ;
3735
3739
}
3736
3740
3737
3741
item_struct( ref struct_def, ref generics) => {
@@ -3802,7 +3806,10 @@ impl Resolver {
3802
3806
rib_kind) => {
3803
3807
3804
3808
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
+ }
3806
3813
3807
3814
for ( index, type_parameter) in generics. ty_params . iter ( ) . enumerate ( ) {
3808
3815
let ident = type_parameter. ident ;
@@ -3831,7 +3838,8 @@ impl Resolver {
3831
3838
3832
3839
match type_parameters {
3833
3840
HasTypeParameters ( ..) => {
3834
- self . type_ribs . pop ( ) ;
3841
+ let mut type_ribs = self . type_ribs . borrow_mut ( ) ;
3842
+ type_ribs. get ( ) . pop ( ) ;
3835
3843
}
3836
3844
3837
3845
NoTypeParameters => {
@@ -3855,11 +3863,19 @@ impl Resolver {
3855
3863
}
3856
3864
3857
3865
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
+ }
3860
3872
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
+ }
3863
3879
}
3864
3880
3865
3881
fn resolve_function ( & mut self ,
@@ -3870,7 +3886,10 @@ impl Resolver {
3870
3886
self_binding : SelfBinding ) {
3871
3887
// Create a value rib for the function.
3872
3888
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
+ }
3874
3893
3875
3894
// Create a label rib for the function.
3876
3895
{
@@ -3935,7 +3954,9 @@ impl Resolver {
3935
3954
3936
3955
let mut label_ribs = self . label_ribs . borrow_mut ( ) ;
3937
3956
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 ( ) ;
3939
3960
}
3940
3961
3941
3962
fn resolve_type_parameters ( & mut self ,
@@ -4208,7 +4229,10 @@ impl Resolver {
4208
4229
}
4209
4230
4210
4231
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
+ }
4212
4236
4213
4237
let mut bindings_list = HashMap :: new ( ) ;
4214
4238
for pattern in arm. pats . iter ( ) {
@@ -4224,12 +4248,16 @@ impl Resolver {
4224
4248
visit:: walk_expr_opt ( self , arm. guard , ( ) ) ;
4225
4249
self . resolve_block ( arm. body ) ;
4226
4250
4227
- self . value_ribs . pop ( ) ;
4251
+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
4252
+ value_ribs. get ( ) . pop ( ) ;
4228
4253
}
4229
4254
4230
4255
fn resolve_block ( & mut self , block : P < Block > ) {
4231
4256
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
+ }
4233
4261
4234
4262
// Move down in the graph, if there's an anonymous module rooted here.
4235
4263
let orig_module = self . current_module ;
@@ -4251,7 +4279,8 @@ impl Resolver {
4251
4279
// Move back up.
4252
4280
self . current_module = orig_module;
4253
4281
4254
- self . value_ribs . pop ( ) ;
4282
+ let mut value_ribs = self . value_ribs . borrow_mut ( ) ;
4283
+ value_ribs. get ( ) . pop ( ) ;
4255
4284
debug ! ( "(resolving block) leaving block" ) ;
4256
4285
}
4257
4286
@@ -4456,9 +4485,11 @@ impl Resolver {
4456
4485
Some ( ref mut bindings_list)
4457
4486
if !bindings_list. contains_key ( & renamed) => {
4458
4487
let this = & mut * self ;
4459
- let last_rib = this. value_ribs [
4460
- this. value_ribs . len ( ) - 1 ] ;
4461
4488
{
4489
+ let mut value_ribs =
4490
+ this. value_ribs . borrow_mut ( ) ;
4491
+ let last_rib = value_ribs. get ( ) [
4492
+ value_ribs. get ( ) . len ( ) - 1 ] ;
4462
4493
let mut bindings =
4463
4494
last_rib. bindings . borrow_mut ( ) ;
4464
4495
bindings. get ( ) . insert ( renamed,
@@ -4481,9 +4512,11 @@ impl Resolver {
4481
4512
}
4482
4513
None => {
4483
4514
let this = & mut * self ;
4484
- let last_rib = this. value_ribs [
4485
- this. value_ribs . len ( ) - 1 ] ;
4486
4515
{
4516
+ let mut value_ribs =
4517
+ this. value_ribs . borrow_mut ( ) ;
4518
+ let last_rib = value_ribs. get ( ) [
4519
+ value_ribs. get ( ) . len ( ) - 1 ] ;
4487
4520
let mut bindings =
4488
4521
last_rib. bindings . borrow_mut ( ) ;
4489
4522
bindings. get ( ) . insert ( renamed,
@@ -4936,14 +4969,19 @@ impl Resolver {
4936
4969
match namespace {
4937
4970
ValueNS => {
4938
4971
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,
4940
4975
span,
4941
4976
DontAllowCapturingSelf ) ;
4942
4977
}
4943
4978
TypeNS => {
4944
4979
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 ) ;
4947
4985
}
4948
4986
}
4949
4987
@@ -4964,12 +5002,20 @@ impl Resolver {
4964
5002
fn resolve_self_value_in_local_ribs ( & mut self , span : Span )
4965
5003
-> Option < Def > {
4966
5004
// 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
+ } ;
4968
5009
while i != 0 {
4969
5010
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 {
4971
5016
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 ( ) ,
4973
5019
i,
4974
5020
def_like,
4975
5021
span,
@@ -5054,10 +5100,14 @@ impl Resolver {
5054
5100
let mut maybes: ~[ @str ] = ~[ ] ;
5055
5101
let mut values: ~[ uint ] = ~[ ] ;
5056
5102
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
+ } ;
5058
5107
while j != 0 {
5059
5108
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 ( ) ;
5061
5111
for ( & k, _) in bindings. get ( ) . iter ( ) {
5062
5112
maybes. push ( interner_get ( k) ) ;
5063
5113
values. push ( uint:: max_value) ;
0 commit comments