Skip to content

Commit 07d579c

Browse files
committed
---
yaml --- r: 97399 b: refs/heads/dist-snap c: 982cb82 h: refs/heads/master i: 97397: aaffc99 97395: 7089f83 97391: 28d6dcd v: v3
1 parent 2972593 commit 07d579c

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: c274a6888410ce3e357e014568b43310ed787d36
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/dist-snap: 4c85cf7a40b4a63e7629d39d2a2ad0f348c1459c
9+
refs/heads/dist-snap: 982cb824ce6254fef0525073597d39957bcc0b92
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1212
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/src/libsyntax/util/interner.rs

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ use std::hashmap::HashMap;
2020

2121
pub struct Interner<T> {
2222
priv map: @RefCell<HashMap<T, Name>>,
23-
priv vect: @mut ~[T],
23+
priv vect: @RefCell<~[T]>,
2424
}
2525

2626
// when traits can extend traits, we should extend index<Name,T> to get []
2727
impl<T:Eq + IterBytes + Hash + Freeze + Clone + 'static> Interner<T> {
2828
pub fn new() -> Interner<T> {
2929
Interner {
3030
map: @RefCell::new(HashMap::new()),
31-
vect: @mut ~[],
31+
vect: @RefCell::new(~[]),
3232
}
3333
}
3434

@@ -47,28 +47,30 @@ impl<T:Eq + IterBytes + Hash + Freeze + Clone + 'static> Interner<T> {
4747
None => (),
4848
}
4949

50-
let vect = &mut *self.vect;
51-
let new_idx = vect.len() as Name;
50+
let mut vect = self.vect.borrow_mut();
51+
let new_idx = vect.get().len() as Name;
5252
map.get().insert(val.clone(), new_idx);
53-
vect.push(val);
53+
vect.get().push(val);
5454
new_idx
5555
}
5656

5757
pub fn gensym(&self, val: T) -> Name {
58-
let new_idx = {
59-
let vect = &*self.vect;
60-
vect.len() as Name
61-
};
58+
let mut vect = self.vect.borrow_mut();
59+
let new_idx = vect.get().len() as Name;
6260
// leave out of .map to avoid colliding
63-
self.vect.push(val);
61+
vect.get().push(val);
6462
new_idx
6563
}
6664

6765
pub fn get(&self, idx: Name) -> T {
68-
self.vect[idx].clone()
66+
let vect = self.vect.borrow();
67+
vect.get()[idx].clone()
6968
}
7069

71-
pub fn len(&self) -> uint { let vect = &*self.vect; vect.len() }
70+
pub fn len(&self) -> uint {
71+
let vect = self.vect.borrow();
72+
vect.get().len()
73+
}
7274

7375
pub fn find_equiv<Q:Hash + IterBytes + Equiv<T>>(&self, val: &Q)
7476
-> Option<Name> {
@@ -84,15 +86,15 @@ impl<T:Eq + IterBytes + Hash + Freeze + Clone + 'static> Interner<T> {
8486
// borrowed pointers rather than @ ones, resulting in less allocation.
8587
pub struct StrInterner {
8688
priv map: @RefCell<HashMap<@str, Name>>,
87-
priv vect: @mut ~[@str],
89+
priv vect: @RefCell<~[@str]>,
8890
}
8991

9092
// when traits can extend traits, we should extend index<Name,T> to get []
9193
impl StrInterner {
9294
pub fn new() -> StrInterner {
9395
StrInterner {
9496
map: @RefCell::new(HashMap::new()),
95-
vect: @mut ~[],
97+
vect: @RefCell::new(~[]),
9698
}
9799
}
98100

@@ -112,14 +114,16 @@ impl StrInterner {
112114
let new_idx = self.len() as Name;
113115
let val = val.to_managed();
114116
map.get().insert(val, new_idx);
115-
self.vect.push(val);
117+
let mut vect = self.vect.borrow_mut();
118+
vect.get().push(val);
116119
new_idx
117120
}
118121

119122
pub fn gensym(&self, val: &str) -> Name {
120123
let new_idx = self.len() as Name;
121124
// leave out of .map to avoid colliding
122-
self.vect.push(val.to_managed());
125+
let mut vect = self.vect.borrow_mut();
126+
vect.get().push(val.to_managed());
123127
new_idx
124128
}
125129

@@ -136,13 +140,21 @@ impl StrInterner {
136140
pub fn gensym_copy(&self, idx : Name) -> Name {
137141
let new_idx = self.len() as Name;
138142
// leave out of map to avoid colliding
139-
self.vect.push(self.vect[idx]);
143+
let mut vect = self.vect.borrow_mut();
144+
let existing = vect.get()[idx];
145+
vect.get().push(existing);
140146
new_idx
141147
}
142148

143-
pub fn get(&self, idx: Name) -> @str { self.vect[idx] }
149+
pub fn get(&self, idx: Name) -> @str {
150+
let vect = self.vect.borrow();
151+
vect.get()[idx]
152+
}
144153

145-
pub fn len(&self) -> uint { let vect = &*self.vect; vect.len() }
154+
pub fn len(&self) -> uint {
155+
let vect = self.vect.borrow();
156+
vect.get().len()
157+
}
146158

147159
pub fn find_equiv<Q:Hash + IterBytes + Equiv<@str>>(&self, val: &Q)
148160
-> Option<Name> {

0 commit comments

Comments
 (0)