From 87a5f0ddf477d1c86ac6e016feefd7ae9c574226 Mon Sep 17 00:00:00 2001 From: Clark Gaebel Date: Fri, 24 Oct 2014 19:31:17 -0700 Subject: [PATCH] Make the Vec data structure layout match raw::Slice. Fixes #18302 r? @thestinger --- src/libcollections/slice.rs | 2 +- src/libcollections/string.rs | 2 +- src/libcollections/vec.rs | 18 +++++++++--------- src/libsyntax/owned_slice.rs | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/libcollections/slice.rs b/src/libcollections/slice.rs index d061e60a422..d4115df7da4 100644 --- a/src/libcollections/slice.rs +++ b/src/libcollections/slice.rs @@ -292,7 +292,7 @@ impl BoxedSlice for Box<[T]> { #[experimental] fn into_vec(mut self) -> Vec { unsafe { - let xs = Vec::from_raw_parts(self.len(), self.len(), self.as_mut_ptr()); + let xs = Vec::from_raw_parts(self.as_mut_ptr(), self.len(), self.len()); mem::forget(self); xs } diff --git a/src/libcollections/string.rs b/src/libcollections/string.rs index fa45dee7cde..c44a03b05cd 100644 --- a/src/libcollections/string.rs +++ b/src/libcollections/string.rs @@ -780,7 +780,7 @@ pub mod raw { #[inline] pub unsafe fn from_parts(buf: *mut u8, length: uint, capacity: uint) -> String { String { - vec: Vec::from_raw_parts(length, capacity, buf), + vec: Vec::from_raw_parts(buf, length, capacity), } } diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index e608a7d22dc..c57a465df37 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -103,9 +103,9 @@ #[unsafe_no_drop_flag] #[stable] pub struct Vec { + ptr: *mut T, len: uint, cap: uint, - ptr: *mut T } impl Vec { @@ -125,7 +125,7 @@ pub fn new() -> Vec { // non-null value which is fine since we never call deallocate on the ptr // if cap is 0. The reason for this is because the pointer of a slice // being NULL would break the null pointer optimization for enums. - Vec { len: 0, cap: 0, ptr: EMPTY as *mut T } + Vec { ptr: EMPTY as *mut T, len: 0, cap: 0 } } /// Constructs a new, empty `Vec` with the specified capacity. @@ -159,14 +159,14 @@ pub fn new() -> Vec { #[stable] pub fn with_capacity(capacity: uint) -> Vec { if mem::size_of::() == 0 { - Vec { len: 0, cap: uint::MAX, ptr: EMPTY as *mut T } + Vec { ptr: EMPTY as *mut T, len: 0, cap: uint::MAX } } else if capacity == 0 { Vec::new() } else { let size = capacity.checked_mul(&mem::size_of::()) .expect("capacity overflow"); let ptr = unsafe { allocate(size, mem::min_align_of::()) }; - Vec { len: 0, cap: capacity, ptr: ptr as *mut T } + Vec { ptr: ptr as *mut T, len: 0, cap: capacity } } } @@ -237,9 +237,9 @@ pub fn from_fn(length: uint, op: |uint| -> T) -> Vec { /// } /// ``` #[experimental] - pub unsafe fn from_raw_parts(length: uint, capacity: uint, - ptr: *mut T) -> Vec { - Vec { len: length, cap: capacity, ptr: ptr } + pub unsafe fn from_raw_parts(ptr: *mut T, length: uint, + capacity: uint) -> Vec { + Vec { ptr: ptr, len: length, cap: capacity } } /// Consumes the `Vec`, partitioning it based on a predicate. @@ -1680,7 +1680,7 @@ fn drop(&mut self) { pub fn as_vec<'a, T>(x: &'a [T]) -> DerefVec<'a, T> { unsafe { DerefVec { - x: Vec::from_raw_parts(x.len(), x.len(), x.as_ptr() as *mut T), + x: Vec::from_raw_parts(x.as_ptr() as *mut T, x.len(), x.len()), l: ContravariantLifetime::<'a> } } @@ -1929,7 +1929,7 @@ pub fn map_in_place(self, f: |T| -> U) -> Vec { let vec_cap = pv.vec.capacity(); let vec_ptr = pv.vec.as_mut_ptr() as *mut U; mem::forget(pv); - Vec::from_raw_parts(vec_len, vec_cap, vec_ptr) + Vec::from_raw_parts(vec_ptr, vec_len, vec_cap) } } else { // Put the `Vec` into the `PartialVecZeroSized` structure and diff --git a/src/libsyntax/owned_slice.rs b/src/libsyntax/owned_slice.rs index e5c37e5041a..4f09b34557c 100644 --- a/src/libsyntax/owned_slice.rs +++ b/src/libsyntax/owned_slice.rs @@ -74,7 +74,7 @@ pub fn from_vec(mut v: Vec) -> OwnedSlice { pub fn into_vec(self) -> Vec { // null is ok, because len == 0 in that case, as required by Vec. unsafe { - let ret = Vec::from_raw_parts(self.len, self.len, self.data); + let ret = Vec::from_raw_parts(self.data, self.len, self.len); // the vector owns the allocation now mem::forget(self); ret