about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-06-30 22:18:17 -0400
committerDaniel Micay <danielmicay@gmail.com>2013-06-30 22:30:37 -0400
commitb731d96b4f2a8d5733e79a863c40632425456520 (patch)
treeb5b23ab4de56bec4166ad2fdee8edec091780fb7 /src/libstd
parent80ab87784108b1a26e9670a029283567b23cf1ad (diff)
downloadrust-b731d96b4f2a8d5733e79a863c40632425456520.tar.gz
rust-b731d96b4f2a8d5733e79a863c40632425456520.zip
vec: implement exchange vector reserve in Rust
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/vec.rs26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs
index 272ad0ac705..310b7e6a1d4 100644
--- a/src/libstd/vec.rs
+++ b/src/libstd/vec.rs
@@ -22,12 +22,14 @@ use iterator::{FromIterator, Iterator, IteratorUtil};
 use iter::FromIter;
 use kinds::Copy;
 use libc;
+use libc::c_void;
 use num::Zero;
 use ops::Add;
 use option::{None, Option, Some};
 use ptr::to_unsafe_ptr;
 use ptr;
 use ptr::RawPtr;
+use rt::global_heap::realloc_raw;
 use sys;
 use sys::size_of;
 use uint;
@@ -52,12 +54,6 @@ pub mod rustrt {
 
     #[abi = "cdecl"]
     pub extern {
-        // These names are terrible. reserve_shared applies
-        // to ~[] and reserve_shared_actual applies to @[].
-        #[fast_ffi]
-        unsafe fn vec_reserve_shared(t: *TyDesc,
-                                     v: **raw::VecRepr,
-                                     n: libc::size_t);
         #[fast_ffi]
         unsafe fn vec_reserve_shared_actual(t: *TyDesc,
                                             v: **raw::VecRepr,
@@ -1523,13 +1519,16 @@ impl<T> OwnedVector<T> for ~[T] {
         use managed;
         if self.capacity() < n {
             unsafe {
-                let ptr: **raw::VecRepr = cast::transmute(self);
+                let ptr: *mut *mut raw::VecRepr = cast::transmute(self);
                 let td = get_tydesc::<T>();
                 if ((**ptr).box_header.ref_count ==
                     managed::raw::RC_MANAGED_UNIQUE) {
-                    rustrt::vec_reserve_shared_actual(td, ptr, n as libc::size_t);
+                    rustrt::vec_reserve_shared_actual(td, ptr as **raw::VecRepr, n as libc::size_t);
                 } else {
-                    rustrt::vec_reserve_shared(td, ptr, n as libc::size_t);
+                    let alloc = n * sys::nonzero_size_of::<T>();
+                    *ptr = realloc_raw(*ptr as *mut c_void, alloc + size_of::<raw::VecRepr>())
+                           as *mut raw::VecRepr;
+                    (**ptr).unboxed.alloc = alloc;
                 }
             }
         }
@@ -1551,12 +1550,15 @@ impl<T> OwnedVector<T> for ~[T] {
         // Only make the (slow) call into the runtime if we have to
         if self.capacity() < n {
             unsafe {
-                let ptr: **raw::VecRepr = cast::transmute(self);
+                let ptr: *mut *mut raw::VecRepr = cast::transmute(self);
                 let td = get_tydesc::<T>();
                 if contains_managed::<T>() {
-                    rustrt::vec_reserve_shared_actual(td, ptr, n as libc::size_t);
+                    rustrt::vec_reserve_shared_actual(td, ptr as **raw::VecRepr, n as libc::size_t);
                 } else {
-                    rustrt::vec_reserve_shared(td, ptr, n as libc::size_t);
+                    let alloc = n * sys::nonzero_size_of::<T>();
+                    *ptr = realloc_raw(*ptr as *mut c_void, alloc + size_of::<raw::VecRepr>())
+                           as *mut raw::VecRepr;
+                    (**ptr).unboxed.alloc = alloc;
                 }
             }
         }