From 3e7a5145219edb786255028b2e03643a7030ecd8 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Fri, 23 Mar 2012 13:30:29 +0100 Subject: Fix inconsistent-iteration hazard in map.rs Closes #2049 --- src/libstd/map.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src/libstd') 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)) } -- cgit 1.4.1-3-g733a5