@@ -30,7 +30,6 @@ use ptr::RawPtr;
30
30
use rt:: global_heap:: malloc_raw;
31
31
use rt:: global_heap:: realloc_raw;
32
32
use sys;
33
- use sys:: size_of;
34
33
use uint;
35
34
use unstable:: intrinsics;
36
35
#[ cfg( stage0) ]
@@ -109,7 +108,7 @@ pub fn with_capacity<T>(capacity: uint) -> ~[T] {
109
108
vec
110
109
} else {
111
110
let alloc = capacity * sys:: nonzero_size_of :: < T > ( ) ;
112
- let ptr = malloc_raw ( alloc + size_of :: < raw:: VecRepr > ( ) ) as * mut raw:: VecRepr ;
111
+ let ptr = malloc_raw ( alloc + sys :: size_of :: < raw:: VecRepr > ( ) ) as * mut raw:: VecRepr ;
113
112
( * ptr) . unboxed . alloc = alloc;
114
113
( * ptr) . unboxed . fill = 0 ;
115
114
cast:: transmute ( ptr)
@@ -751,7 +750,9 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
751
750
fn iter( self ) -> VecIterator <' self , T > {
752
751
unsafe {
753
752
let p = vec : : raw:: to_ptr( self ) ;
754
- VecIterator { ptr : p, end : p. offset( self . len( ) ) ,
753
+ VecIterator { ptr : p,
754
+ end : cast:: transmute( p as uint + self . len( ) *
755
+ sys:: nonzero_size_of:: < T > ( ) ) ,
755
756
lifetime : cast:: transmute( p) }
756
757
}
757
758
}
@@ -1149,7 +1150,7 @@ impl<T> OwnedVector<T> for ~[T] {
1149
1150
:: at_vec:: raw:: reserve_raw( td, ptr, n) ;
1150
1151
} else {
1151
1152
let alloc = n * sys:: nonzero_size_of:: < T > ( ) ;
1152
- * ptr = realloc_raw( * ptr as * mut c_void, alloc + size_of :: < raw:: VecRepr > ( ) )
1153
+ * ptr = realloc_raw( * ptr as * mut c_void, alloc + sys :: size_of:: < raw:: VecRepr > ( ) )
1153
1154
as * mut raw:: VecRepr ;
1154
1155
( * * ptr) . unboxed. alloc = alloc;
1155
1156
}
@@ -1178,7 +1179,7 @@ impl<T> OwnedVector<T> for ~[T] {
1178
1179
:: at_vec:: raw:: reserve_raw( td, ptr, n) ;
1179
1180
} else {
1180
1181
let alloc = n * sys:: nonzero_size_of:: < T > ( ) ;
1181
- let size = alloc + size_of :: < raw:: VecRepr > ( ) ;
1182
+ let size = alloc + sys :: size_of:: < raw:: VecRepr > ( ) ;
1182
1183
if alloc / sys:: nonzero_size_of:: < T > ( ) != n || size < alloc {
1183
1184
fail ! ( "vector size is too large: %u" , n) ;
1184
1185
}
@@ -1712,7 +1713,9 @@ impl<'self,T> MutableVector<'self, T> for &'self mut [T] {
1712
1713
fn mut_iter ( self ) -> VecMutIterator < ' self , T > {
1713
1714
unsafe {
1714
1715
let p = vec:: raw:: to_mut_ptr ( self ) ;
1715
- VecMutIterator { ptr : p, end : p. offset ( self . len ( ) ) ,
1716
+ VecMutIterator { ptr : p,
1717
+ end : cast:: transmute ( p as uint + self . len ( ) *
1718
+ sys:: nonzero_size_of :: < T > ( ) ) ,
1716
1719
lifetime : cast:: transmute ( p) }
1717
1720
}
1718
1721
}
@@ -2089,7 +2092,11 @@ macro_rules! iterator {
2089
2092
None
2090
2093
} else {
2091
2094
let old = self . ptr;
2092
- self . ptr = self . ptr. offset( 1 ) ;
2095
+ // purposefully don't use 'ptr.offset' because for
2096
+ // vectors with 0-size elements this would return the
2097
+ // same pointer.
2098
+ self . ptr = cast:: transmute( self . ptr as uint +
2099
+ sys:: nonzero_size_of:: <T >( ) ) ;
2093
2100
Some ( cast:: transmute( old) )
2094
2101
}
2095
2102
}
@@ -2098,7 +2105,7 @@ macro_rules! iterator {
2098
2105
#[ inline]
2099
2106
fn size_hint( & self ) -> ( uint, Option <uint>) {
2100
2107
let diff = ( self . end as uint) - ( self . ptr as uint) ;
2101
- let exact = diff / size_of :: <$elem>( ) ;
2108
+ let exact = diff / sys :: nonzero_size_of :: <$elem>( ) ;
2102
2109
( exact, Some ( exact) )
2103
2110
}
2104
2111
}
@@ -2115,7 +2122,9 @@ macro_rules! double_ended_iterator {
2115
2122
if self . end == self . ptr {
2116
2123
None
2117
2124
} else {
2118
- self . end = self . end. offset( -1 ) ;
2125
+ // See above for why 'ptr.offset' isn't used
2126
+ self . end = cast:: transmute( self . end as uint -
2127
+ sys:: nonzero_size_of:: <T >( ) ) ;
2119
2128
Some ( cast:: transmute( self . end) )
2120
2129
}
2121
2130
}
@@ -2671,19 +2680,19 @@ mod tests {
2671
2680
let mut results: ~[ ~[ int ] ] ;
2672
2681
2673
2682
results = ~[ ] ;
2674
- for each_permutation( [ ] ) |v| { results. push ( to_owned ( v ) ) ; }
2683
+ for each_permutation( [ ] ) |v| { results. push ( v . to_owned ( ) ) ; }
2675
2684
assert_eq ! ( results, ~[ ~[ ] ] ) ;
2676
2685
2677
2686
results = ~[ ] ;
2678
- for each_permutation( [ 7 ] ) |v| { results. push ( to_owned ( v ) ) ; }
2687
+ for each_permutation( [ 7 ] ) |v| { results. push ( v . to_owned ( ) ) ; }
2679
2688
assert_eq ! ( results, ~[ ~[ 7 ] ] ) ;
2680
2689
2681
2690
results = ~[ ] ;
2682
- for each_permutation( [ 1 , 1 ] ) |v| { results. push ( to_owned ( v ) ) ; }
2691
+ for each_permutation( [ 1 , 1 ] ) |v| { results. push ( v . to_owned ( ) ) ; }
2683
2692
assert_eq ! ( results, ~[ ~[ 1 , 1 ] , ~[ 1 , 1 ] ] ) ;
2684
2693
2685
2694
results = ~[ ] ;
2686
- for each_permutation( [ 5 , 2 , 0 ] ) |v| { results. push ( to_owned ( v ) ) ; }
2695
+ for each_permutation( [ 5 , 2 , 0 ] ) |v| { results. push ( v . to_owned ( ) ) ; }
2687
2696
assert ! ( results ==
2688
2697
~[ ~[ 5 , 2 , 0 ] , ~[ 5 , 0 , 2 ] , ~[ 2 , 5 , 0 ] , ~[ 2 , 0 , 5 ] , ~[ 0 , 5 , 2 ] , ~[ 0 , 2 , 5 ] ] ) ;
2689
2698
}
@@ -3370,4 +3379,50 @@ mod tests {
3370
3379
3371
3380
assert_eq ! ( values, [ 2 , 3 , 5 , 6 , 7 ] ) ;
3372
3381
}
3382
+
3383
+ #[ deriving( Eq ) ]
3384
+ struct Foo ;
3385
+
3386
+ #[ test]
3387
+ fn test_iter_zero_sized( ) {
3388
+ let mut v = ~[ Foo , Foo , Foo ] ;
3389
+ assert_eq ! ( v. len( ) , 3 ) ;
3390
+ let mut cnt = 0 ;
3391
+
3392
+ for v. iter( ) . advance |f| {
3393
+ assert ! ( * f == Foo ) ;
3394
+ cnt += 1 ;
3395
+ }
3396
+ assert_eq ! ( cnt, 3 ) ;
3397
+
3398
+ for v. slice( 1 , 3 ) . iter( ) . advance |f| {
3399
+ assert ! ( * f == Foo ) ;
3400
+ cnt += 1 ;
3401
+ }
3402
+ assert_eq ! ( cnt, 5 ) ;
3403
+
3404
+ for v. mut_iter( ) . advance |f| {
3405
+ assert ! ( * f == Foo ) ;
3406
+ cnt += 1 ;
3407
+ }
3408
+ assert_eq ! ( cnt, 8 ) ;
3409
+
3410
+ for v. consume_iter( ) . advance |f| {
3411
+ assert ! ( f == Foo ) ;
3412
+ cnt += 1 ;
3413
+ }
3414
+ assert_eq ! ( cnt, 11 ) ;
3415
+
3416
+ let xs = ~[ Foo , Foo , Foo ] ;
3417
+ assert_eq!( fmt!( "%?" , xs. slice( 0 , 2 ) . to_owned( ) ) , ~"~[ { } , { } ] ");
3418
+
3419
+ let xs: [Foo, ..3] = [Foo, Foo, Foo];
3420
+ assert_eq!(fmt!(" %?", xs.slice(0, 2).to_owned()), ~" ~[ { } , { } ] ") ;
3421
+ cnt = 0 ;
3422
+ for xs. iter( ) . advance |f| {
3423
+ assert!( * f == Foo ) ;
3424
+ cnt += 1 ;
3425
+ }
3426
+ assert!( cnt == 3 ) ;
3427
+ }
3373
3428
}
0 commit comments