diff options
| author | James Miller <james@aatch.net> | 2014-04-16 14:29:36 +1200 |
|---|---|---|
| committer | James Miller <james@aatch.net> | 2014-04-16 14:29:36 +1200 |
| commit | be334d582435a05ea56c1ca7fcb2e512cfc51f24 (patch) | |
| tree | 900da71bc36964d4cbe260b94db3d1163b74f48a /src/libstd/vec.rs | |
| parent | 42b39924d87739f2dcda3e788c6e8655d310954f (diff) | |
| download | rust-be334d582435a05ea56c1ca7fcb2e512cfc51f24.tar.gz rust-be334d582435a05ea56c1ca7fcb2e512cfc51f24.zip | |
Make Vec::clone and slice::to_owned failure-safe
Diffstat (limited to 'src/libstd/vec.rs')
| -rw-r--r-- | src/libstd/vec.rs | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index 034d53aa78b..96cbac8869e 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -313,21 +313,18 @@ impl<T:Clone> Clone for Vec<T> { fn clone(&self) -> Vec<T> { let len = self.len; let mut vector = Vec::with_capacity(len); - vector.len = len; // Unsafe code so this can be optimised to a memcpy (or something // similarly fast) when T is Copy. LLVM is easily confused, so any // extra operations during the loop can prevent this optimisation { - let slice = vector.as_mut_slice(); let this_slice = self.as_slice(); - let mut i = 0; - while i < len { + while vector.len < len { unsafe { mem::move_val_init( - slice.unsafe_mut_ref(i), - this_slice.unsafe_ref(i).clone()); + vector.as_mut_slice().unsafe_mut_ref(vector.len), + this_slice.unsafe_ref(vector.len).clone()); } - i = i + 1; + vector.len += 1; } } vector |
