1
Fork 0

Make remaining moves explicit in libstd

This commit is contained in:
Tim Chevalier 2012-09-10 17:50:48 -07:00
parent 73eb894305
commit 9869d071d1
18 changed files with 68 additions and 68 deletions

View file

@ -73,7 +73,7 @@ struct ARC<T: Const Send> { x: SharedMutableState<T> }
/// Create an atomically reference counted wrapper. /// Create an atomically reference counted wrapper.
fn ARC<T: Const Send>(+data: T) -> ARC<T> { fn ARC<T: Const Send>(+data: T) -> ARC<T> {
ARC { x: unsafe { shared_mutable_state(data) } } ARC { x: unsafe { shared_mutable_state(move data) } }
} }
/** /**
@ -105,8 +105,8 @@ fn clone<T: Const Send>(rc: &ARC<T>) -> ARC<T> {
* guaranteed to deadlock. * guaranteed to deadlock.
*/ */
fn unwrap<T: Const Send>(+rc: ARC<T>) -> T { fn unwrap<T: Const Send>(+rc: ARC<T>) -> T {
let ARC { x: x } = rc; let ARC { x: x } <- rc;
unsafe { unwrap_shared_mutable_state(x) } unsafe { unwrap_shared_mutable_state(move x) }
} }
/**************************************************************************** /****************************************************************************
@ -120,7 +120,7 @@ struct MutexARC<T: Send> { x: SharedMutableState<MutexARCInner<T>> }
/// Create a mutex-protected ARC with the supplied data. /// Create a mutex-protected ARC with the supplied data.
fn MutexARC<T: Send>(+user_data: T) -> MutexARC<T> { fn MutexARC<T: Send>(+user_data: T) -> MutexARC<T> {
mutex_arc_with_condvars(user_data, 1) mutex_arc_with_condvars(move user_data, 1)
} }
/** /**
* Create a mutex-protected ARC with the supplied data and a specified number * Create a mutex-protected ARC with the supplied data and a specified number
@ -131,7 +131,7 @@ fn mutex_arc_with_condvars<T: Send>(+user_data: T,
let data = let data =
MutexARCInner { lock: mutex_with_condvars(num_condvars), MutexARCInner { lock: mutex_with_condvars(num_condvars),
failed: false, data: user_data }; failed: false, data: user_data };
MutexARC { x: unsafe { shared_mutable_state(data) } } MutexARC { x: unsafe { shared_mutable_state(move data) } }
} }
impl<T: Send> &MutexARC<T> { impl<T: Send> &MutexARC<T> {
@ -198,13 +198,13 @@ impl<T: Send> &MutexARC<T> {
*/ */
// FIXME(#2585) make this a by-move method on the arc // FIXME(#2585) make this a by-move method on the arc
fn unwrap_mutex_arc<T: Send>(+arc: MutexARC<T>) -> T { fn unwrap_mutex_arc<T: Send>(+arc: MutexARC<T>) -> T {
let MutexARC { x: x } = arc; let MutexARC { x: x } <- arc;
let inner = unsafe { unwrap_shared_mutable_state(x) }; let inner = unsafe { unwrap_shared_mutable_state(move x) };
let MutexARCInner { failed: failed, data: data, _ } = inner; let MutexARCInner { failed: failed, data: data, _ } <- inner;
if failed { if failed {
fail ~"Can't unwrap poisoned MutexARC - another task failed inside!" fail ~"Can't unwrap poisoned MutexARC - another task failed inside!"
} }
data move data
} }
// Common code for {mutex.access,rwlock.write}{,_cond}. // Common code for {mutex.access,rwlock.write}{,_cond}.
@ -254,7 +254,7 @@ struct RWARC<T: Const Send> {
/// Create a reader/writer ARC with the supplied data. /// Create a reader/writer ARC with the supplied data.
fn RWARC<T: Const Send>(+user_data: T) -> RWARC<T> { fn RWARC<T: Const Send>(+user_data: T) -> RWARC<T> {
rw_arc_with_condvars(user_data, 1) rw_arc_with_condvars(move user_data, 1)
} }
/** /**
* Create a reader/writer ARC with the supplied data and a specified number * Create a reader/writer ARC with the supplied data and a specified number
@ -265,7 +265,7 @@ fn rw_arc_with_condvars<T: Const Send>(+user_data: T,
let data = let data =
RWARCInner { lock: rwlock_with_condvars(num_condvars), RWARCInner { lock: rwlock_with_condvars(num_condvars),
failed: false, data: user_data }; failed: false, data: user_data };
RWARC { x: unsafe { shared_mutable_state(data) }, cant_nest: () } RWARC { x: unsafe { shared_mutable_state(move data) }, cant_nest: () }
} }
impl<T: Const Send> &RWARC<T> { impl<T: Const Send> &RWARC<T> {
@ -344,7 +344,7 @@ impl<T: Const Send> &RWARC<T> {
let state = unsafe { get_shared_mutable_state(&self.x) }; let state = unsafe { get_shared_mutable_state(&self.x) };
do borrow_rwlock(state).write_downgrade |write_mode| { do borrow_rwlock(state).write_downgrade |write_mode| {
check_poison(false, state.failed); check_poison(false, state.failed);
blk(RWWriteMode((&mut state.data, write_mode, blk(RWWriteMode((&mut state.data, move write_mode,
PoisonOnFail(&mut state.failed)))) PoisonOnFail(&mut state.failed))))
} }
} }
@ -353,9 +353,9 @@ impl<T: Const Send> &RWARC<T> {
fn downgrade(+token: RWWriteMode/&a<T>) -> RWReadMode/&a<T> { fn downgrade(+token: RWWriteMode/&a<T>) -> RWReadMode/&a<T> {
// The rwlock should assert that the token belongs to us for us. // The rwlock should assert that the token belongs to us for us.
let state = unsafe { get_shared_immutable_state(&self.x) }; let state = unsafe { get_shared_immutable_state(&self.x) };
let RWWriteMode((data, t, _poison)) = token; let RWWriteMode((data, t, _poison)) <- token;
// Let readers in // Let readers in
let new_token = (&state.lock).downgrade(t); let new_token = (&state.lock).downgrade(move t);
// Whatever region the input reference had, it will be safe to use // Whatever region the input reference had, it will be safe to use
// the same region for the output reference. (The only 'unsafe' part // the same region for the output reference. (The only 'unsafe' part
// of this cast is removing the mutability.) // of this cast is removing the mutability.)
@ -363,7 +363,7 @@ impl<T: Const Send> &RWARC<T> {
// Downgrade ensured the token belonged to us. Just a sanity check. // Downgrade ensured the token belonged to us. Just a sanity check.
assert ptr::ref_eq(&state.data, new_data); assert ptr::ref_eq(&state.data, new_data);
// Produce new token // Produce new token
RWReadMode((new_data, new_token)) RWReadMode((new_data, move new_token))
} }
} }
@ -376,13 +376,13 @@ impl<T: Const Send> &RWARC<T> {
*/ */
// FIXME(#2585) make this a by-move method on the arc // FIXME(#2585) make this a by-move method on the arc
fn unwrap_rw_arc<T: Const Send>(+arc: RWARC<T>) -> T { fn unwrap_rw_arc<T: Const Send>(+arc: RWARC<T>) -> T {
let RWARC { x: x, _ } = arc; let RWARC { x: x, _ } <- arc;
let inner = unsafe { unwrap_shared_mutable_state(x) }; let inner = unsafe { unwrap_shared_mutable_state(move x) };
let RWARCInner { failed: failed, data: data, _ } = inner; let RWARCInner { failed: failed, data: data, _ } <- inner;
if failed { if failed {
fail ~"Can't unwrap poisoned RWARC - another task failed inside!" fail ~"Can't unwrap poisoned RWARC - another task failed inside!"
} }
data move data
} }
// Borrowck rightly complains about immutably aliasing the rwlock in order to // Borrowck rightly complains about immutably aliasing the rwlock in order to

View file

@ -541,7 +541,7 @@ fn from_fn(len: uint, f: fn(index: uint) -> bool) -> Bitv {
for uint::range(0, len) |i| { for uint::range(0, len) |i| {
bitv.set(i, f(i)); bitv.set(i, f(i));
} }
return bitv; move bitv
} }
const uint_bits: uint = 32u + (1u << 32u >> 27u); const uint_bits: uint = 32u + (1u << 32u >> 27u);

View file

@ -46,8 +46,8 @@ impl<T> Cell<T> {
fn with_ref<R>(op: fn(v: &T) -> R) -> R { fn with_ref<R>(op: fn(v: &T) -> R) -> R {
let v = self.take(); let v = self.take();
let r = op(&v); let r = op(&v);
self.put_back(v); self.put_back(move v);
return move r; move r
} }
} }

View file

@ -20,11 +20,11 @@ struct DuplexStream<T: Send, U: Send> {
impl<T: Send, U: Send> DuplexStream<T, U> : Channel<T> { impl<T: Send, U: Send> DuplexStream<T, U> : Channel<T> {
fn send(+x: T) { fn send(+x: T) {
self.chan.send(x) self.chan.send(move x)
} }
fn try_send(+x: T) -> bool { fn try_send(+x: T) -> bool {
self.chan.try_send(x) self.chan.try_send(move x)
} }
} }

View file

@ -38,7 +38,7 @@ fn create<T: Copy>() -> Deque<T> {
i += 1u; i += 1u;
} }
return rv; move rv
} }
fn get<T: Copy>(elts: DVec<Cell<T>>, i: uint) -> T { fn get<T: Copy>(elts: DVec<Cell<T>>, i: uint) -> T {
match elts.get_elt(i) { Some(t) => t, _ => fail } match elts.get_elt(i) { Some(t) => t, _ => fail }
@ -111,7 +111,7 @@ fn create<T: Copy>() -> Deque<T> {
vec::to_mut( vec::to_mut(
vec::from_elem(initial_capacity, None))) vec::from_elem(initial_capacity, None)))
}; };
repr as Deque::<T> move (repr as Deque::<T>)
} }
#[cfg(test)] #[cfg(test)]

View file

@ -452,7 +452,7 @@ priv impl EbmlDeserializer {
let r = f(); let r = f();
self.parent = old_parent; self.parent = old_parent;
self.pos = old_pos; self.pos = old_pos;
return r; move r
} }
fn _next_uint(exp_tag: EbmlSerializerTag) -> uint { fn _next_uint(exp_tag: EbmlSerializerTag) -> uint {

View file

@ -54,7 +54,7 @@ fn find<K: Eq Ord, V: Copy>(m: Treemap<K, V>, +k: K) -> Option<V> {
Node(@kk, @v, left, right) => { Node(@kk, @v, left, right) => {
if k == kk { if k == kk {
Some(v) Some(v)
} else if k < kk { find(left, k) } else { find(right, k) } } else if k < kk { find(left, move k) } else { find(right, move k) }
} }
} }
} }

View file

@ -343,7 +343,7 @@ fn getopts(args: &[~str], opts: &[Opt]) -> Result unsafe {
i += 1u; i += 1u;
} }
return Ok({opts: vec::from_slice(opts), return Ok({opts: vec::from_slice(opts),
vals: vec::from_mut(vals), vals: vec::from_mut(move vals),
free: free}); free: free});
} }

View file

@ -646,15 +646,15 @@ pure fn lt(value0: Json, value1: Json) -> bool {
let (d0_flat, d1_flat) = { let (d0_flat, d1_flat) = {
let d0_flat = dvec::DVec(); let d0_flat = dvec::DVec();
for d0.each |k, v| { d0_flat.push((k, v)); } for d0.each |k, v| { d0_flat.push((k, v)); }
let d0_flat = dvec::unwrap(d0_flat); let d0_flat = dvec::unwrap(move d0_flat);
d0_flat.qsort(); d0_flat.qsort();
let mut d1_flat = dvec::DVec(); let mut d1_flat = dvec::DVec();
for d1.each |k, v| { d1_flat.push((k, v)); } for d1.each |k, v| { d1_flat.push((k, v)); }
let d1_flat = dvec::unwrap(d1_flat); let d1_flat = dvec::unwrap(move d1_flat);
d1_flat.qsort(); d1_flat.qsort();
(d0_flat, d1_flat) (move d0_flat, move d1_flat)
}; };
d0_flat < d1_flat d0_flat < d1_flat

View file

@ -183,7 +183,7 @@ mod chained {
entry.next = new_chains[idx]; entry.next = new_chains[idx];
new_chains[idx] = Some(entry); new_chains[idx] = Some(entry);
} }
self.chains = new_chains; self.chains <- new_chains;
} }
pure fn each_entry(blk: fn(@Entry<K,V>) -> bool) { pure fn each_entry(blk: fn(@Entry<K,V>) -> bool) {

View file

@ -577,7 +577,7 @@ fn listen(-host_ip: ip::IpAddr, port: uint, backlog: uint,
-> result::Result<(), TcpListenErrData> unsafe { -> result::Result<(), TcpListenErrData> unsafe {
do listen_common(host_ip, port, backlog, iotask, on_establish_cb) do listen_common(host_ip, port, backlog, iotask, on_establish_cb)
// on_connect_cb // on_connect_cb
|handle| unsafe { |move new_connect_cb, handle| unsafe {
let server_data_ptr = uv::ll::get_data_for_uv_handle(handle) let server_data_ptr = uv::ll::get_data_for_uv_handle(handle)
as *TcpListenFcData; as *TcpListenFcData;
let new_conn = NewTcpConn(handle); let new_conn = NewTcpConn(handle);
@ -727,7 +727,7 @@ fn listen_common(-host_ip: ip::IpAddr, port: uint, backlog: uint,
* A buffered wrapper that you can cast as an `io::reader` or `io::writer` * A buffered wrapper that you can cast as an `io::reader` or `io::writer`
*/ */
fn socket_buf(-sock: TcpSocket) -> TcpSocketBuf { fn socket_buf(-sock: TcpSocket) -> TcpSocketBuf {
TcpSocketBuf(@{ sock: sock, mut buf: ~[] }) TcpSocketBuf(@{ sock: move sock, mut buf: ~[] })
} }
/// Convenience methods extending `net::tcp::tcp_socket` /// Convenience methods extending `net::tcp::tcp_socket`
@ -1520,7 +1520,7 @@ mod test {
log(debug, log(debug,
~"SERVER/WORKER: send on cont ch"); ~"SERVER/WORKER: send on cont ch");
cont_ch.send(()); cont_ch.send(());
let sock = result::unwrap(accept_result); let sock = result::unwrap(move accept_result);
log(debug, ~"SERVER: successfully accepted"+ log(debug, ~"SERVER: successfully accepted"+
~"connection!"); ~"connection!");
let received_req_bytes = read(sock, 0u); let received_req_bytes = read(sock, 0u);
@ -1607,7 +1607,7 @@ mod test {
Err(err_data) Err(err_data)
} }
else { else {
let sock = result::unwrap(connect_result); let sock = result::unwrap(move connect_result);
let resp_bytes = str::to_bytes(resp); let resp_bytes = str::to_bytes(resp);
tcp_write_single(sock, resp_bytes); tcp_write_single(sock, resp_bytes);
let read_result = sock.read(0u); let read_result = sock.read(0u);

View file

@ -41,7 +41,7 @@ fn map_slices<A: Copy Send, B: Copy Send>(
let end = uint::min(len, base + items_per_task); let end = uint::min(len, base + items_per_task);
do vec::as_buf(xs) |p, _len| { do vec::as_buf(xs) |p, _len| {
let f = f(); let f = f();
let f = do future_spawn() |copy base| { let f = do future_spawn() |move f, copy base| {
unsafe { unsafe {
let len = end - base; let len = end - base;
let slice = (ptr::offset(p, base), let slice = (ptr::offset(p, base),
@ -55,7 +55,7 @@ fn map_slices<A: Copy Send, B: Copy Send>(
f(base, slice) f(base, slice)
} }
}; };
vec::push(futures, f); vec::push(futures, move f);
}; };
base += items_per_task; base += items_per_task;
} }

View file

@ -1112,13 +1112,13 @@ mod node {
fn empty() -> T { fn empty() -> T {
let stack : ~[mut @Node] = ~[mut]; let stack : ~[mut @Node] = ~[mut];
return {stack: stack, mut stackpos: -1} return {stack: move stack, mut stackpos: -1}
} }
fn start(node: @Node) -> T { fn start(node: @Node) -> T {
let stack = vec::to_mut(vec::from_elem(height(node)+1u, node)); let stack = vec::to_mut(vec::from_elem(height(node)+1u, node));
return { return {
stack: stack, stack: move stack,
mut stackpos: 0 mut stackpos: 0
} }
} }

View file

@ -253,7 +253,7 @@ fn sha1() -> Sha1 {
mut computed: false, mut computed: false,
work_buf: @vec::to_mut(vec::from_elem(work_buf_len, 0u32)) work_buf: @vec::to_mut(vec::from_elem(work_buf_len, 0u32))
}; };
let sh = st as Sha1; let sh <- st as Sha1;
sh.reset(); sh.reset();
return sh; return sh;
} }

View file

@ -21,7 +21,7 @@ enum SmallIntMap<T:Copy> {
/// Create a smallintmap /// Create a smallintmap
fn mk<T: Copy>() -> SmallIntMap<T> { fn mk<T: Copy>() -> SmallIntMap<T> {
let v = DVec(); let v = DVec();
return SmallIntMap_(@{v: v}); return SmallIntMap_(@{v: move v});
} }
/** /**

View file

@ -84,7 +84,7 @@ fn new_sem_and_signal(count: int, num_condvars: uint)
for num_condvars.times { for num_condvars.times {
vec::push(queues, new_waitqueue()); vec::push(queues, new_waitqueue());
} }
new_sem(count, queues) new_sem(count, move queues)
} }
#[doc(hidden)] #[doc(hidden)]
@ -98,9 +98,9 @@ impl<Q: Send> &Sem<Q> {
// Create waiter nobe. // Create waiter nobe.
let (SignalEnd, WaitEnd) = pipes::oneshot(); let (SignalEnd, WaitEnd) = pipes::oneshot();
// Tell outer scope we need to block. // Tell outer scope we need to block.
waiter_nobe = Some(WaitEnd); waiter_nobe = Some(move WaitEnd);
// Enqueue ourself. // Enqueue ourself.
state.waiters.tail.send(SignalEnd); state.waiters.tail.send(move SignalEnd);
} }
} }
} }
@ -203,8 +203,8 @@ impl &Condvar {
fn wait_on(condvar_id: uint) { fn wait_on(condvar_id: uint) {
// Create waiter nobe. // Create waiter nobe.
let (SignalEnd, WaitEnd) = pipes::oneshot(); let (SignalEnd, WaitEnd) = pipes::oneshot();
let mut WaitEnd = Some(WaitEnd); let mut WaitEnd = Some(move WaitEnd);
let mut SignalEnd = Some(SignalEnd); let mut SignalEnd = Some(move SignalEnd);
let mut reacquire = None; let mut reacquire = None;
let mut out_of_bounds = None; let mut out_of_bounds = None;
unsafe { unsafe {
@ -219,7 +219,7 @@ impl &Condvar {
} }
// Enqueue ourself to be woken up by a signaller. // Enqueue ourself to be woken up by a signaller.
let SignalEnd = option::swap_unwrap(&mut SignalEnd); let SignalEnd = option::swap_unwrap(&mut SignalEnd);
state.blocked[condvar_id].tail.send(SignalEnd); state.blocked[condvar_id].tail.send(move SignalEnd);
} else { } else {
out_of_bounds = Some(vec::len(state.blocked)); out_of_bounds = Some(vec::len(state.blocked));
} }

View file

@ -291,9 +291,9 @@ fn run_tests(opts: TestOpts, tests: ~[TestDesc],
debug!("using %u test tasks", concurrency); debug!("using %u test tasks", concurrency);
let total = vec::len(filtered_tests); let total = vec::len(filtered_tests);
let mut run_idx = 0u; let mut run_idx = 0;
let mut wait_idx = 0u; let mut wait_idx = 0;
let mut done_idx = 0u; let mut done_idx = 0;
let p = core::comm::Port(); let p = core::comm::Port();
let ch = core::comm::Chan(p); let ch = core::comm::Chan(p);
@ -301,24 +301,24 @@ fn run_tests(opts: TestOpts, tests: ~[TestDesc],
while done_idx < total { while done_idx < total {
while wait_idx < concurrency && run_idx < total { while wait_idx < concurrency && run_idx < total {
let test = copy filtered_tests[run_idx]; let test = copy filtered_tests[run_idx];
if concurrency == 1u { if concurrency == 1 {
// We are doing one test at a time so we can print the name // We are doing one test at a time so we can print the name
// of the test before we run it. Useful for debugging tests // of the test before we run it. Useful for debugging tests
// that hang forever. // that hang forever.
callback(TeWait(copy test)); callback(TeWait(copy test));
} }
run_test(test, ch); run_test(move test, ch);
wait_idx += 1u; wait_idx += 1;
run_idx += 1u; run_idx += 1;
} }
let (test, result) = core::comm::recv(p); let (test, result) = core::comm::recv(p);
if concurrency != 1u { if concurrency != 1 {
callback(TeWait(copy test)); callback(TeWait(copy test));
} }
callback(TeResult(test, result)); callback(TeResult(move test, result));
wait_idx -= 1u; wait_idx -= 1;
done_idx += 1u; done_idx += 1;
} }
} }
@ -342,7 +342,7 @@ fn filter_tests(opts: TestOpts,
// Remove tests that don't match the test filter // Remove tests that don't match the test filter
filtered = if option::is_none(opts.filter) { filtered = if option::is_none(opts.filter) {
filtered move filtered
} else { } else {
let filter_str = let filter_str =
match opts.filter { match opts.filter {
@ -362,7 +362,7 @@ fn filter_tests(opts: TestOpts,
// Maybe pull out the ignored test and unignore them // Maybe pull out the ignored test and unignore them
filtered = if !opts.run_ignored { filtered = if !opts.run_ignored {
filtered move filtered
} else { } else {
fn filter(test: TestDesc) -> Option<TestDesc> { fn filter(test: TestDesc) -> Option<TestDesc> {
if test.ignore { if test.ignore {
@ -384,7 +384,7 @@ fn filter_tests(opts: TestOpts,
sort::merge_sort(lteq, filtered) sort::merge_sort(lteq, filtered)
}; };
return filtered; move filtered
} }
type TestFuture = {test: TestDesc, wait: fn@() -> TestResult}; type TestFuture = {test: TestDesc, wait: fn@() -> TestResult};
@ -395,12 +395,12 @@ fn run_test(+test: TestDesc, monitor_ch: comm::Chan<MonitorMsg>) {
return; return;
} }
do task::spawn { do task::spawn |move test| {
let testfn = copy test.fn; let testfn = copy test.fn;
let mut result_future = None; // task::future_result(builder); let mut result_future = None; // task::future_result(builder);
task::task().unlinked().future_result(|+r| { task::task().unlinked().future_result(|+r| {
result_future = Some(r); result_future = Some(move r);
}).spawn(testfn); }).spawn(move testfn);
let task_result = future::get(&option::unwrap(result_future)); let task_result = future::get(&option::unwrap(result_future));
let test_result = calc_result(test, task_result == task::Success); let test_result = calc_result(test, task_result == task::Success);
comm::send(monitor_ch, (copy test, test_result)); comm::send(monitor_ch, (copy test, test_result));

View file

@ -64,7 +64,7 @@ fn spawn_iotask(-task: task::TaskBuilder) -> IoTask {
*/ */
unsafe fn interact(iotask: IoTask, unsafe fn interact(iotask: IoTask,
-cb: fn~(*c_void)) { -cb: fn~(*c_void)) {
send_msg(iotask, Interaction(cb)); send_msg(iotask, Interaction(move cb));
} }
/** /**
@ -129,7 +129,7 @@ type IoTaskLoopData = {
fn send_msg(iotask: IoTask, fn send_msg(iotask: IoTask,
-msg: IoTaskMsg) unsafe { -msg: IoTaskMsg) unsafe {
iotask.op_chan.send(msg); iotask.op_chan.send(move msg);
ll::async_send(iotask.async_handle); ll::async_send(iotask.async_handle);
} }