From b91a51daca705b5aebfa58079963f24592a7e411 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 6 Feb 2013 00:03:12 -0500 Subject: [PATCH 1/6] remove issue #3148 workarounds (no longer needed) --- src/libcore/hashmap.rs | 7 ++----- src/libstd/json.rs | 8 -------- src/libstd/treemap.rs | 1 - 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/libcore/hashmap.rs b/src/libcore/hashmap.rs index adb16a9290553..88981f514cff3 100644 --- a/src/libcore/hashmap.rs +++ b/src/libcore/hashmap.rs @@ -49,9 +49,8 @@ pub mod linear { buckets: ~[Option>], } - // FIXME(#3148) -- we could rewrite FoundEntry - // to have type Option<&Bucket> which would be nifty - // However, that won't work until #3148 is fixed + // We could rewrite FoundEntry to have type Option<&Bucket> + // which would be nifty enum SearchResult { FoundEntry(uint), FoundHole(uint), TableFull } @@ -296,8 +295,6 @@ pub mod linear { FoundEntry(idx) => { match self.buckets[idx] { Some(ref bkt) => { - // FIXME(#3148)---should be inferred - let bkt: &self/Bucket = bkt; Some(&bkt.value) } None => { diff --git a/src/libstd/json.rs b/src/libstd/json.rs index 4b34f318e91b2..13b58c433006e 100644 --- a/src/libstd/json.rs +++ b/src/libstd/json.rs @@ -856,9 +856,6 @@ pub impl Decoder: serialize::Decoder { debug!("read_vec_elt(idx=%u)", idx); match *self.peek() { List(ref list) => { - // FIXME(#3148)---should be inferred - let list: &self/~[Json] = list; - self.stack.push(&list[idx]); f() } @@ -885,9 +882,6 @@ pub impl Decoder: serialize::Decoder { let top = self.peek(); match *top { Object(ref obj) => { - // FIXME(#3148) This hint should not be necessary. - let obj: &self/~Object = obj; - match obj.find(&name.to_owned()) { None => die!(fmt!("no such field: %s", name)), Some(json) => { @@ -917,8 +911,6 @@ pub impl Decoder: serialize::Decoder { debug!("read_tup_elt(idx=%u)", idx); match *self.peek() { List(ref list) => { - // FIXME(#3148)---should be inferred - let list: &self/~[Json] = list; self.stack.push(&list[idx]); f() } diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index 1105d65a4ed6f..b7af5de4cbfef 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -142,7 +142,6 @@ impl TreeMap: Map { loop { match *current { Some(ref r) => { - let r: &self/~TreeNode = r; // FIXME: #3148 if *key < r.key { current = &r.left; } else if r.key < *key { From 5b6c26b4e44e05717cc9a1d0041f44fb4df4d102 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 6 Feb 2013 02:10:53 -0500 Subject: [PATCH 2/6] treemap: get rid of some implicit vector copies --- src/libstd/treemap.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index b7af5de4cbfef..87801d7650543 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -745,8 +745,8 @@ mod test_treemap { let v1 = str::to_bytes(~"baz"); let v2 = str::to_bytes(~"foobar"); - m.insert(k1, v1); - m.insert(k2, v2); + m.insert(copy k1, copy v1); + m.insert(copy k2, copy v2); assert m.find(&k2) == Some(&v2); assert m.find(&k1) == Some(&v1); From 37e998696f840ffea047efc50814819422750c20 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 6 Feb 2013 02:27:33 -0500 Subject: [PATCH 3/6] get rid of implicit vec copies in treemap iterator Each call to next() was doing a copy rather than a move. There's currently no way for this to be a method that uses &mut self, so it has to be a free function. Closes #4763. --- src/libstd/treemap.rs | 136 +++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 69 deletions(-) diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index 87801d7650543..610f2f5a59c2d 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -49,8 +49,8 @@ impl TreeMap: Eq { let mut y = other.iter(); for self.len().times { unsafe { // unsafe as a purity workaround - x = x.next(); - y = y.next(); + map_next(&mut x); + map_next(&mut y); // FIXME: #4492 (ICE), x.get() == y.get() let (x1, x2) = x.get().unwrap(); let (y1, y2) = y.get().unwrap(); @@ -74,8 +74,8 @@ pure fn lt(a: &TreeMap, b: &TreeMap) -> bool { let (a_len, b_len) = (a.len(), b.len()); for uint::min(a_len, b_len).times { unsafe { // purity workaround - x = x.next(); - y = y.next(); + map_next(&mut x); + map_next(&mut y); let (key_a,_) = x.get().unwrap(); let (key_b,_) = y.get().unwrap(); if *key_a < *key_b { return true; } @@ -210,32 +210,30 @@ impl TreeMapIterator { // Returns the current node, or None if this iterator is at the end. fn get(&const self) -> Option<(&self/K, &self/V)> { match self.current { - Some(res) => Some((&res.key, &res.value)), - None => None + Some(res) => Some((&res.key, &res.value)), + None => None } } +} - /// Advance the iterator to the next node (in order). If this iterator - /// is finished, does nothing. - fn next(self) -> TreeMapIterator/&self { - let mut this = self; - while !this.stack.is_empty() || this.node.is_some() { - match *this.node { - Some(ref x) => { - this.stack.push(x); - this.node = &x.left; - } - None => { - let res = this.stack.pop(); - this.node = &res.right; - this.current = Some(res); - return this; - } - } +/// Advance the iterator to the next node (in order). If this iterator +/// is finished, does nothing. +fn map_next(iter: &mut TreeMapIterator/&a) { + while !iter.stack.is_empty() || iter.node.is_some() { + match *iter.node { + Some(ref x) => { + iter.stack.push(x); + iter.node = &x.left; + } + None => { + let res = iter.stack.pop(); + iter.node = &res.right; + iter.current = Some(res); + return; + } } - this.current = None; - return this; } + iter.current = None; } pub struct TreeSet { @@ -297,18 +295,18 @@ impl TreeSet: Set { let mut x = self.iter(); let mut y = other.iter(); unsafe { // purity workaround - x = x.next(); - y = y.next(); + set_next(&mut x); + set_next(&mut y); let mut a = x.get(); let mut b = y.get(); while a.is_some() && b.is_some() { let a1 = a.unwrap(); let b1 = b.unwrap(); if a1 < b1 { - x = x.next(); + set_next(&mut x); a = x.get(); } else if b1 < a1 { - y = y.next(); + set_next(&mut y); b = y.get(); } else { return false; @@ -328,8 +326,8 @@ impl TreeSet: Set { let mut x = self.iter(); let mut y = other.iter(); unsafe { // purity workaround - x = x.next(); - y = y.next(); + set_next(&mut x); + set_next(&mut y); let mut a = x.get(); let mut b = y.get(); while b.is_some() { @@ -345,10 +343,10 @@ impl TreeSet: Set { } if !(a1 < b1) { - y = y.next(); + set_next(&mut y); b = y.get(); } - x = x.next(); + set_next(&mut x); a = x.get(); } } @@ -361,15 +359,15 @@ impl TreeSet: Set { let mut y = other.iter(); unsafe { // purity workaround - x = x.next(); - y = y.next(); + set_next(&mut x); + set_next(&mut y); let mut a = x.get(); let mut b = y.get(); while a.is_some() { if b.is_none() { return do a.while_some() |a1| { - if f(a1) { x = x.next(); x.get() } else { None } + if f(a1) { set_next(&mut x); x.get() } else { None } } } @@ -378,11 +376,11 @@ impl TreeSet: Set { if a1 < b1 { if !f(a1) { return } - x = x.next(); + set_next(&mut x); a = x.get(); } else { - if !(b1 < a1) { x = x.next(); a = x.get() } - y = y.next(); + if !(b1 < a1) { set_next(&mut x); a = x.get() } + set_next(&mut y); b = y.get(); } } @@ -396,15 +394,15 @@ impl TreeSet: Set { let mut y = other.iter(); unsafe { // purity workaround - x = x.next(); - y = y.next(); + set_next(&mut x); + set_next(&mut y); let mut a = x.get(); let mut b = y.get(); while a.is_some() { if b.is_none() { return do a.while_some() |a1| { - if f(a1) { x.next(); x.get() } else { None } + if f(a1) { set_next(&mut x); x.get() } else { None } } } @@ -413,21 +411,21 @@ impl TreeSet: Set { if a1 < b1 { if !f(a1) { return } - x = x.next(); + set_next(&mut x); a = x.get(); } else { if b1 < a1 { if !f(b1) { return } } else { - x = x.next(); + set_next(&mut x); a = x.get(); } - y = y.next(); + set_next(&mut y); b = y.get(); } } do b.while_some |b1| { - if f(b1) { y = y.next(); y.get() } else { None } + if f(b1) { set_next(&mut y); y.get() } else { None } } } } @@ -438,8 +436,8 @@ impl TreeSet: Set { let mut y = other.iter(); unsafe { // purity workaround - x = x.next(); - y = y.next(); + set_next(&mut x); + set_next(&mut y); let mut a = x.get(); let mut b = y.get(); @@ -447,13 +445,13 @@ impl TreeSet: Set { let a1 = a.unwrap(); let b1 = b.unwrap(); if a1 < b1 { - x = x.next(); + set_next(&mut x); a = x.get(); } else { if !(b1 < a1) { if !f(a1) { return } } - y = y.next(); + set_next(&mut y); b = y.get(); } } @@ -466,15 +464,15 @@ impl TreeSet: Set { let mut y = other.iter(); unsafe { // purity workaround - x = x.next(); - y = y.next(); + set_next(&mut x); + set_next(&mut y); let mut a = x.get(); let mut b = y.get(); while a.is_some() { if b.is_none() { return do a.while_some() |a1| { - if f(a1) { x = x.next(); x.get() } else { None } + if f(a1) { set_next(&mut x); x.get() } else { None } } } @@ -483,15 +481,15 @@ impl TreeSet: Set { if b1 < a1 { if !f(b1) { return } - y = y.next(); + set_next(&mut y); b = y.get(); } else { if !f(a1) { return } if !(a1 < b1) { - y = y.next(); + set_next(&mut y); b = y.get() } - x = x.next(); + set_next(&mut x); a = x.get(); } } @@ -524,16 +522,16 @@ impl TreeSetIterator { /// Returns the current node, or None if this iterator is at the end. fn get(&const self) -> Option<&self/T> { match self.iter.get() { - None => None, - Some((k, _)) => Some(k) + None => None, + Some((k, _)) => Some(k) } } +} - /// Advance the iterator to the next node (in order). If this iterator is - /// finished, does nothing. - fn next(self) -> TreeSetIterator/&self { - TreeSetIterator { iter: self.iter.next() } - } +/// Advance the iterator to the next node (in order). If this iterator is +/// finished, does nothing. +fn set_next(iter: &mut TreeSetIterator/&a) { + map_next(&mut iter.iter); } // Nodes keep track of their level in the tree, starting at 1 in the @@ -967,18 +965,18 @@ mod test_treemap { // FIXME: #4492 (ICE): iter.next() == Some((&x1, &y1)) - iter = iter.next(); + map_next(&mut iter); assert iter.get().unwrap() == (&x1, &y1); - iter = iter.next(); + map_next(&mut iter); assert iter.get().unwrap() == (&x2, &y2); - iter = iter.next(); + map_next(&mut iter); assert iter.get().unwrap() == (&x3, &y3); - iter = iter.next(); + map_next(&mut iter); assert iter.get().unwrap() == (&x4, &y4); - iter = iter.next(); + map_next(&mut iter); assert iter.get().unwrap() == (&x5, &y5); - iter = iter.next(); + map_next(&mut iter); assert iter.get().is_none(); } } From 16941687839a4fa06e57d1d1cf36a3ccbc0257e1 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 6 Feb 2013 02:34:15 -0500 Subject: [PATCH 4/6] update treemap FIXME --- src/libstd/treemap.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index 610f2f5a59c2d..b234f9b0f3dac 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -963,7 +963,7 @@ mod test_treemap { let m = m; let mut iter = m.iter(); - // FIXME: #4492 (ICE): iter.next() == Some((&x1, &y1)) + // FIXME: #4492 (ICE): iter.get() == Some((&x1, &y1)) map_next(&mut iter); assert iter.get().unwrap() == (&x1, &y1); From bdfb930f3412bcbf792bd8ab10f40b6560663a5f Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 6 Feb 2013 02:39:47 -0500 Subject: [PATCH 5/6] treemap: make map_next and set_next public --- src/libstd/treemap.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index b234f9b0f3dac..3cc287b16a32e 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -218,7 +218,7 @@ impl TreeMapIterator { /// Advance the iterator to the next node (in order). If this iterator /// is finished, does nothing. -fn map_next(iter: &mut TreeMapIterator/&a) { +pub fn map_next(iter: &mut TreeMapIterator/&a) { while !iter.stack.is_empty() || iter.node.is_some() { match *iter.node { Some(ref x) => { @@ -530,7 +530,7 @@ impl TreeSetIterator { /// Advance the iterator to the next node (in order). If this iterator is /// finished, does nothing. -fn set_next(iter: &mut TreeSetIterator/&a) { +pub fn set_next(iter: &mut TreeSetIterator/&a) { map_next(&mut iter.iter); } From dab2f2fac0d5147b088489abfbcf43714ed36156 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 6 Feb 2013 02:49:05 -0500 Subject: [PATCH 6/6] remove old snapshot workaround from smallintmap --- src/libstd/smallintmap.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/libstd/smallintmap.rs b/src/libstd/smallintmap.rs index a21328b3d6340..1cd35722ab466 100644 --- a/src/libstd/smallintmap.rs +++ b/src/libstd/smallintmap.rs @@ -116,8 +116,6 @@ pub impl SmallIntMap { } pub impl SmallIntMap { - // FIXME: #4733, remove after the next snapshot - #[cfg(stage2)] fn update_with_key(&mut self, key: uint, val: V, ff: fn(uint, V, V) -> V) -> bool { match self.find(&key) { @@ -126,8 +124,6 @@ pub impl SmallIntMap { } } - // FIXME: #4733, remove after the next snapshot - #[cfg(stage2)] fn update(&mut self, key: uint, newval: V, ff: fn(V, V) -> V) -> bool { self.update_with_key(key, newval, |_k, v, v1| ff(v,v1)) }