diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2012-03-23 13:30:29 +0100 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2012-03-23 13:30:29 +0100 |
| commit | 3e7a5145219edb786255028b2e03643a7030ecd8 (patch) | |
| tree | 36afd967239cae3c4e0f18c454a5def598f4e40e /src/libstd | |
| parent | 683085b3f069b771d48d9ae3f20edb9670451b88 (diff) | |
| download | rust-3e7a5145219edb786255028b2e03643a7030ecd8.tar.gz rust-3e7a5145219edb786255028b2e03643a7030ecd8.zip | |
Fix inconsistent-iteration hazard in map.rs
Closes #2049
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/map.rs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/libstd/map.rs b/src/libstd/map.rs index 9ca7f346bda..5722789e64a 100644 --- a/src/libstd/map.rs +++ b/src/libstd/map.rs @@ -257,12 +257,16 @@ mod chained { fn size() -> uint { self.count } fn insert(k: K, v: V) -> bool { - let nchains = vec::len(self.chains); - let load = {num: (self.count + 1u) as int, den: nchains as int}; - // Structural consts would be nice. This is a const 3/4 - // load factor that we compare against. - if !util::rational_leq(load, {num:3, den:4}) { rehash(self); } - ret insert(self, k, v); + let grew = insert(self, k, v); + if grew { + let nchains = vec::len(self.chains); + let load = {num: (self.count + 1u) as int, + den: nchains as int}; + // Structural consts would be nice. This is a const 3/4 + // load factor that we compare against. + if !util::rational_leq(load, {num:3, den:4}) { rehash(self); } + } + grew } fn contains_key(k: K) -> bool { option::is_some(get(self, k)) } |
