about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-05-31 22:04:38 -0700
committerbors <bors@rust-lang.org>2013-05-31 22:04:38 -0700
commitc23843c4471dcacb203d4439ef7c19bb2c3238b0 (patch)
tree632c494801829eba5c4c63a1fadbf620c02424d4 /src
parentb570536b38d3172deabb471f407993a1aa2d4a0d (diff)
parentc299230f3d7a43a4307ce317aa41b7e8f361a2e6 (diff)
downloadrust-c23843c4471dcacb203d4439ef7c19bb2c3238b0.tar.gz
rust-c23843c4471dcacb203d4439ef7c19bb2c3238b0.zip
auto merge of #6876 : cmr/rust/from_elem_opts, r=Aatch
borrowck 1.85x speedup on libstd
Diffstat (limited to 'src')
-rw-r--r--src/libstd/vec.rs18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs
index 795c3cdb405..8eedb70b3a6 100644
--- a/src/libstd/vec.rs
+++ b/src/libstd/vec.rs
@@ -149,8 +149,7 @@ pub fn from_fn<T>(n_elts: uint, op: old_iter::InitOp<T>) -> ~[T] {
         do as_mut_buf(v) |p, _len| {
             let mut i: uint = 0u;
             while i < n_elts {
-                intrinsics::move_val_init(&mut(*ptr::mut_offset(p, i)),
-                                          op(i));
+                intrinsics::move_val_init(&mut(*ptr::mut_offset(p, i)), op(i));
                 i += 1u;
             }
         }
@@ -166,7 +165,20 @@ pub fn from_fn<T>(n_elts: uint, op: old_iter::InitOp<T>) -> ~[T] {
  * to the value `t`.
  */
 pub fn from_elem<T:Copy>(n_elts: uint, t: T) -> ~[T] {
-    from_fn(n_elts, |_i| copy t)
+    // hack: manually inline from_fn for 2x plus speedup (sadly very important, from_elem is a
+    // bottleneck in borrowck!)
+    unsafe {
+        let mut v = with_capacity(n_elts);
+        do as_mut_buf(v) |p, _len| {
+            let mut i = 0u;
+            while i < n_elts {
+                intrinsics::move_val_init(&mut(*ptr::mut_offset(p, i)), copy t);
+                i += 1u;
+            }
+        }
+        raw::set_len(&mut v, n_elts);
+        v
+    }
 }
 
 /// Creates a new unique vector with the same contents as the slice