diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-08-26 13:29:33 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-08-26 13:29:33 -0700 |
| commit | 8dc13ac3455fac12e5ad8d7ccbd043b7c31e2f9e (patch) | |
| tree | 0a56e3211ae71d2e5b0385f9b8106d8dc3e27da7 /src/libstd | |
| parent | 36b511558595a49b8c091937915d7616c2d62f14 (diff) | |
| download | rust-8dc13ac3455fac12e5ad8d7ccbd043b7c31e2f9e.tar.gz rust-8dc13ac3455fac12e5ad8d7ccbd043b7c31e2f9e.zip | |
std: Make vec::from_fn failure-safe
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/vec.rs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index b743a17b472..976a3cafb32 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -75,6 +75,7 @@ use rt::global_heap::realloc_raw; use sys; use sys::size_of; use uint; +use unstable::finally::Finally; use unstable::intrinsics; use unstable::intrinsics::{get_tydesc, contains_managed}; use unstable::raw::{Box, Repr, Slice, Vec}; @@ -97,11 +98,14 @@ pub fn from_fn<T>(n_elts: uint, op: &fn(uint) -> T) -> ~[T] { let mut v = with_capacity(n_elts); let p = raw::to_mut_ptr(v); let mut i: uint = 0u; - while i < n_elts { - intrinsics::move_val_init(&mut(*ptr::mut_offset(p, i as int)), op(i)); - i += 1u; + do (|| { + while i < n_elts { + intrinsics::move_val_init(&mut(*ptr::mut_offset(p, i as int)), op(i)); + i += 1u; + } + }).finally { + raw::set_len(&mut v, i); } - raw::set_len(&mut v, n_elts); v } } |
