From b731d96b4f2a8d5733e79a863c40632425456520 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sun, 30 Jun 2013 22:18:17 -0400 Subject: vec: implement exchange vector reserve in Rust --- src/libstd/vec.rs | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'src/libstd/vec.rs') 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 OwnedVector 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::(); 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::(); + *ptr = realloc_raw(*ptr as *mut c_void, alloc + size_of::()) + as *mut raw::VecRepr; + (**ptr).unboxed.alloc = alloc; } } } @@ -1551,12 +1550,15 @@ impl OwnedVector 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::(); if contains_managed::() { - 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::(); + *ptr = realloc_raw(*ptr as *mut c_void, alloc + size_of::()) + as *mut raw::VecRepr; + (**ptr).unboxed.alloc = alloc; } } } -- cgit 1.4.1-3-g733a5