File tree Expand file tree Collapse file tree 2 files changed +19
-17
lines changed Expand file tree Collapse file tree 2 files changed +19
-17
lines changed Original file line number Diff line number Diff line change @@ -762,18 +762,23 @@ impl<'a, T: Clone> CloneableVector<T> for &'a [T] {
762
762
fn to_owned ( & self ) -> ~[ T ] {
763
763
let len = self . len ( ) ;
764
764
let mut result = with_capacity ( len) ;
765
+ // Unsafe code so this can be optimised to a memcpy (or something
766
+ // similarly fast) when T is Copy. LLVM is easily confused, so any
767
+ // extra operations during the loop can prevent this optimisation
765
768
unsafe {
766
- // Unsafe code so this can be optimised to a memcpy (or something
767
- // similarly fast) when T is Copy. LLVM is easily confused, so any
768
- // extra operations during the loop can prevent this optimisation
769
- result. set_len ( len) ;
770
769
let mut i = 0 ;
771
- while i < len {
772
- mem:: move_val_init (
773
- result. unsafe_mut_ref ( i) ,
774
- self . unsafe_ref ( i) . clone ( ) ) ;
775
- i = i + 1 ;
776
- }
770
+ let p = result. as_mut_ptr ( ) ;
771
+ // Use try_finally here otherwise the write to length
772
+ // inside the loop stops LLVM from optimising this.
773
+ try_finally (
774
+ & mut i, ( ) ,
775
+ |i, ( ) | while * i < len {
776
+ mem:: move_val_init (
777
+ & mut ( * p. offset ( * i as int ) ) ,
778
+ self . unsafe_ref ( * i) . clone ( ) ) ;
779
+ * i += 1 ;
780
+ } ,
781
+ |i| result. set_len ( * i) ) ;
777
782
}
778
783
result
779
784
}
Original file line number Diff line number Diff line change @@ -313,21 +313,18 @@ impl<T:Clone> Clone for Vec<T> {
313
313
fn clone ( & self ) -> Vec < T > {
314
314
let len = self . len ;
315
315
let mut vector = Vec :: with_capacity ( len) ;
316
- vector. len = len;
317
316
// Unsafe code so this can be optimised to a memcpy (or something
318
317
// similarly fast) when T is Copy. LLVM is easily confused, so any
319
318
// extra operations during the loop can prevent this optimisation
320
319
{
321
- let slice = vector. as_mut_slice ( ) ;
322
320
let this_slice = self . as_slice ( ) ;
323
- let mut i = 0 ;
324
- while i < len {
321
+ while vector. len < len {
325
322
unsafe {
326
323
mem:: move_val_init (
327
- slice . unsafe_mut_ref ( i ) ,
328
- this_slice. unsafe_ref ( i ) . clone ( ) ) ;
324
+ vector . as_mut_slice ( ) . unsafe_mut_ref ( vector . len ) ,
325
+ this_slice. unsafe_ref ( vector . len ) . clone ( ) ) ;
329
326
}
330
- i = i + 1 ;
327
+ vector . len += 1 ;
331
328
}
332
329
}
333
330
vector
You can’t perform that action at this time.
0 commit comments