summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2012-03-23 13:30:29 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2012-03-23 13:30:29 +0100
commit3e7a5145219edb786255028b2e03643a7030ecd8 (patch)
tree36afd967239cae3c4e0f18c454a5def598f4e40e /src/libstd
parent683085b3f069b771d48d9ae3f20edb9670451b88 (diff)
downloadrust-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.rs16
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)) }