Skip to content

Commit b731d96

Browse files
committed
vec: implement exchange vector reserve in Rust
1 parent 80ab877 commit b731d96

File tree

3 files changed

+14
-20
lines changed

3 files changed

+14
-20
lines changed

src/libstd/vec.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ use iterator::{FromIterator, Iterator, IteratorUtil};
2222
use iter::FromIter;
2323
use kinds::Copy;
2424
use libc;
25+
use libc::c_void;
2526
use num::Zero;
2627
use ops::Add;
2728
use option::{None, Option, Some};
2829
use ptr::to_unsafe_ptr;
2930
use ptr;
3031
use ptr::RawPtr;
32+
use rt::global_heap::realloc_raw;
3133
use sys;
3234
use sys::size_of;
3335
use uint;
@@ -52,12 +54,6 @@ pub mod rustrt {
5254

5355
#[abi = "cdecl"]
5456
pub extern {
55-
// These names are terrible. reserve_shared applies
56-
// to ~[] and reserve_shared_actual applies to @[].
57-
#[fast_ffi]
58-
unsafe fn vec_reserve_shared(t: *TyDesc,
59-
v: **raw::VecRepr,
60-
n: libc::size_t);
6157
#[fast_ffi]
6258
unsafe fn vec_reserve_shared_actual(t: *TyDesc,
6359
v: **raw::VecRepr,
@@ -1523,13 +1519,16 @@ impl<T> OwnedVector<T> for ~[T] {
15231519
use managed;
15241520
if self.capacity() < n {
15251521
unsafe {
1526-
let ptr: **raw::VecRepr = cast::transmute(self);
1522+
let ptr: *mut *mut raw::VecRepr = cast::transmute(self);
15271523
let td = get_tydesc::<T>();
15281524
if ((**ptr).box_header.ref_count ==
15291525
managed::raw::RC_MANAGED_UNIQUE) {
1530-
rustrt::vec_reserve_shared_actual(td, ptr, n as libc::size_t);
1526+
rustrt::vec_reserve_shared_actual(td, ptr as **raw::VecRepr, n as libc::size_t);
15311527
} else {
1532-
rustrt::vec_reserve_shared(td, ptr, n as libc::size_t);
1528+
let alloc = n * sys::nonzero_size_of::<T>();
1529+
*ptr = realloc_raw(*ptr as *mut c_void, alloc + size_of::<raw::VecRepr>())
1530+
as *mut raw::VecRepr;
1531+
(**ptr).unboxed.alloc = alloc;
15331532
}
15341533
}
15351534
}
@@ -1551,12 +1550,15 @@ impl<T> OwnedVector<T> for ~[T] {
15511550
// Only make the (slow) call into the runtime if we have to
15521551
if self.capacity() < n {
15531552
unsafe {
1554-
let ptr: **raw::VecRepr = cast::transmute(self);
1553+
let ptr: *mut *mut raw::VecRepr = cast::transmute(self);
15551554
let td = get_tydesc::<T>();
15561555
if contains_managed::<T>() {
1557-
rustrt::vec_reserve_shared_actual(td, ptr, n as libc::size_t);
1556+
rustrt::vec_reserve_shared_actual(td, ptr as **raw::VecRepr, n as libc::size_t);
15581557
} else {
1559-
rustrt::vec_reserve_shared(td, ptr, n as libc::size_t);
1558+
let alloc = n * sys::nonzero_size_of::<T>();
1559+
*ptr = realloc_raw(*ptr as *mut c_void, alloc + size_of::<raw::VecRepr>())
1560+
as *mut raw::VecRepr;
1561+
(**ptr).unboxed.alloc = alloc;
15601562
}
15611563
}
15621564
}

src/rt/rust_builtin.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,6 @@ vec_reserve_shared_actual(type_desc* ty, rust_vec_box** vp,
7575
reserve_vec_exact_shared(task, vp, n_elts * ty->size);
7676
}
7777

78-
// This is completely misnamed.
79-
extern "C" CDECL void
80-
vec_reserve_shared(type_desc* ty, rust_vec_box** vp,
81-
size_t n_elts) {
82-
reserve_vec_exact(vp, n_elts * ty->size);
83-
}
84-
8578
extern "C" CDECL size_t
8679
rand_seed_size() {
8780
return rng_seed_size();

src/rt/rustrt.def.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ rust_get_c_stack
5555
rust_log_str
5656
start_task
5757
vec_reserve_shared_actual
58-
vec_reserve_shared
5958
task_clear_event_reject
6059
task_wait_event
6160
task_signal_event

0 commit comments

Comments
 (0)