Skip to content

Commit 56b9a20

Browse files
committed
librustc: De-@mut the value and type ribs in the resolver
1 parent c48335e commit 56b9a20

File tree

1 file changed

+80
-30
lines changed

1 file changed

+80
-30
lines changed

src/librustc/middle/resolve.rs

Lines changed: 80 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)