about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-08-03 00:25:56 -0700
committerbors <bors@rust-lang.org>2013-08-03 00:25:56 -0700
commit20fad0f5fff381210bfe79b35a5fe8332ec86b34 (patch)
treec37eb6f6c0e4cbfb1009d6d018745f22b32a93f0 /src/libstd
parentdeddb009f0003734d3c73fa859826d57ec600270 (diff)
parentdef88913d80e153d956ce85f8155d77455bcfe5e (diff)
downloadrust-20fad0f5fff381210bfe79b35a5fe8332ec86b34.tar.gz
rust-20fad0f5fff381210bfe79b35a5fe8332ec86b34.zip
auto merge of #8257 : mozilla/rust/rollup, r=thestinger
1f9c392 r=brson
54e685d r=graydon
1992765 r=thestinger
75155cd r=bblum
def8891 r=graydon
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/logging.rs10
-rw-r--r--src/libstd/option.rs29
-rw-r--r--src/libstd/vec.rs59
3 files changed, 85 insertions, 13 deletions
diff --git a/src/libstd/logging.rs b/src/libstd/logging.rs
index 6e11d14aea9..c662e5997af 100644
--- a/src/libstd/logging.rs
+++ b/src/libstd/logging.rs
@@ -85,6 +85,16 @@ pub fn log_type<T>(level: u32, object: &T) {
 fn newsched_log_str(msg: ~str) {
     use rt::task::Task;
     use rt::local::Local;
+    use str::StrSlice;
+    use container::Container;
+
+    // Truncate the string
+    let buf_bytes = 256;
+    let msg = if msg.len() > buf_bytes {
+        msg.slice(0, buf_bytes) + "[...]"
+    } else {
+        msg
+    };
 
     unsafe {
         match Local::try_unsafe_borrow::<Task>() {
diff --git a/src/libstd/option.rs b/src/libstd/option.rs
index 7eca47743d6..547c453b02d 100644
--- a/src/libstd/option.rs
+++ b/src/libstd/option.rs
@@ -235,19 +235,24 @@ impl<T> Option<T> {
         self.take().map_consume_default(def, blk)
     }
 
-    /// Apply a function to the contained value or do nothing
-    pub fn mutate(&mut self, f: &fn(T) -> T) {
+    /// Apply a function to the contained value or do nothing.
+    /// Returns true if the contained value was mutated.
+    pub fn mutate(&mut self, f: &fn(T) -> T) -> bool {
         if self.is_some() {
             *self = Some(f(self.take_unwrap()));
-        }
+            true
+        } else { false }
     }
 
-    /// Apply a function to the contained value or set it to a default
-    pub fn mutate_default(&mut self, def: T, f: &fn(T) -> T) {
+    /// Apply a function to the contained value or set it to a default.
+    /// Returns true if the contained value was mutated, or false if set to the default.
+    pub fn mutate_default(&mut self, def: T, f: &fn(T) -> T) -> bool {
         if self.is_some() {
             *self = Some(f(self.take_unwrap()));
+            true
         } else {
             *self = Some(def);
+            false
         }
     }
 
@@ -575,4 +580,18 @@ mod tests {
         assert_eq!(it.size_hint(), (0, Some(0)));
         assert!(it.next().is_none());
     }
+
+    #[test]
+    fn test_mutate() {
+        let mut x = Some(3i);
+        assert!(x.mutate(|i| i+1));
+        assert_eq!(x, Some(4i));
+        assert!(x.mutate_default(0, |i| i+1));
+        assert_eq!(x, Some(5i));
+        x = None;
+        assert!(!x.mutate(|i| i+1));
+        assert_eq!(x, None);
+        assert!(!x.mutate_default(0i, |i| i+1));
+        assert_eq!(x, Some(0i));
+    }
 }
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs
index ad5ded2002a..1f6adaf040b 100644
--- a/src/libstd/vec.rs
+++ b/src/libstd/vec.rs
@@ -2141,11 +2141,15 @@ macro_rules! iterator {
                         None
                     } else {
                         let old = self.ptr;
-                        // purposefully don't use 'ptr.offset' because for
-                        // vectors with 0-size elements this would return the
-                        // same pointer.
-                        self.ptr = cast::transmute(self.ptr as uint +
-                                                   sys::nonzero_size_of::<T>());
+                        self.ptr = if sys::size_of::<T>() == 0 {
+                            // purposefully don't use 'ptr.offset' because for
+                            // vectors with 0-size elements this would return the
+                            // same pointer.
+                            cast::transmute(self.ptr as uint + 1)
+                        } else {
+                            self.ptr.offset(1)
+                        };
+
                         Some(cast::transmute(old))
                     }
                 }
@@ -2171,9 +2175,12 @@ macro_rules! double_ended_iterator {
                     if self.end == self.ptr {
                         None
                     } else {
-                        // See above for why 'ptr.offset' isn't used
-                        self.end = cast::transmute(self.end as uint -
-                                                   sys::nonzero_size_of::<T>());
+                        self.end = if sys::size_of::<T>() == 0 {
+                            // See above for why 'ptr.offset' isn't used
+                            cast::transmute(self.end as uint - 1)
+                        } else {
+                            self.end.offset(-1)
+                        };
                         Some(cast::transmute(self.end))
                     }
                 }
@@ -3566,3 +3573,39 @@ mod tests {
         assert!(cnt == 3);
     }
 }
+
+#[cfg(test)]
+mod bench {
+    use extra::test::BenchHarness;
+    use vec;
+    use option::*;
+
+    #[bench]
+    fn iterator(bh: &mut BenchHarness) {
+        // peculiar numbers to stop LLVM from optimising the summation
+        // out.
+        let v = vec::from_fn(100, |i| i ^ (i << 1) ^ (i >> 1));
+
+        do bh.iter {
+            let mut sum = 0;
+            foreach x in v.iter() {
+                sum += *x;
+            }
+            // sum == 11806, to stop dead code elimination.
+            if sum == 0 {fail!()}
+        }
+    }
+
+    #[bench]
+    fn mut_iterator(bh: &mut BenchHarness) {
+        let mut v = vec::from_elem(100, 0);
+
+        do bh.iter {
+            let mut i = 0;
+            foreach x in v.mut_iter() {
+                *x = i;
+                i += 1;
+            }
+        }
+    }
+}