diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-06-30 22:18:17 -0400 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-06-30 22:30:37 -0400 |
| commit | b731d96b4f2a8d5733e79a863c40632425456520 (patch) | |
| tree | b5b23ab4de56bec4166ad2fdee8edec091780fb7 | |
| parent | 80ab87784108b1a26e9670a029283567b23cf1ad (diff) | |
| download | rust-b731d96b4f2a8d5733e79a863c40632425456520.tar.gz rust-b731d96b4f2a8d5733e79a863c40632425456520.zip | |
vec: implement exchange vector reserve in Rust
| -rw-r--r-- | src/libstd/vec.rs | 26 | ||||
| -rw-r--r-- | src/rt/rust_builtin.cpp | 7 | ||||
| -rw-r--r-- | src/rt/rustrt.def.in | 1 |
3 files changed, 14 insertions, 20 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; } } } diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index de46d7b3e8a..17f36e810cd 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -75,13 +75,6 @@ vec_reserve_shared_actual(type_desc* ty, rust_vec_box** vp, reserve_vec_exact_shared(task, vp, n_elts * ty->size); } -// This is completely misnamed. -extern "C" CDECL void -vec_reserve_shared(type_desc* ty, rust_vec_box** vp, - size_t n_elts) { - reserve_vec_exact(vp, n_elts * ty->size); -} - extern "C" CDECL size_t rand_seed_size() { return rng_seed_size(); diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index b572f1aba6a..0da04e34f49 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -55,7 +55,6 @@ rust_get_c_stack rust_log_str start_task vec_reserve_shared_actual -vec_reserve_shared task_clear_event_reject task_wait_event task_signal_event |
