Skip to content

Commit 1a33c25

Browse files
committed
Make moves explicit in pipes and pipe compiler
1 parent 3c7cc9a commit 1a33c25

File tree

3 files changed

+62
-62
lines changed

3 files changed

+62
-62
lines changed

src/libcore/future.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ fn from_value<A>(+val: A) -> Future<A> {
7575
* not block.
7676
*/
7777

78-
Future {state: Forced(~val)}
78+
Future {state: Forced(~(move val))}
7979
}
8080

8181
fn from_port<A:Send>(+port: future_pipe::client::waiting<A>) -> Future<A> {
@@ -86,13 +86,13 @@ fn from_port<A:Send>(+port: future_pipe::client::waiting<A>) -> Future<A> {
8686
* waiting for the result to be received on the port.
8787
*/
8888

89-
let port = ~mut Some(port);
89+
let port = ~mut Some(move port);
9090
do from_fn |move port| {
9191
let mut port_ = None;
9292
port_ <-> *port;
9393
let port = option::unwrap(port_);
94-
match recv(port) {
95-
future_pipe::completed(move data) => data
94+
match recv(move port) {
95+
future_pipe::completed(move data) => move data
9696
}
9797
}
9898
}
@@ -106,7 +106,7 @@ fn from_fn<A>(+f: ~fn() -> A) -> Future<A> {
106106
* function. It is not spawned into another task.
107107
*/
108108

109-
Future {state: Pending(f)}
109+
Future {state: Pending(move f)}
110110
}
111111

112112
fn spawn<A:Send>(+blk: fn~() -> A) -> Future<A> {
@@ -117,8 +117,8 @@ fn spawn<A:Send>(+blk: fn~() -> A) -> Future<A> {
117117
* value of the future.
118118
*/
119119

120-
from_port(pipes::spawn_service_recv(future_pipe::init, |ch| {
121-
future_pipe::server::completed(ch, blk());
120+
from_port(pipes::spawn_service_recv(future_pipe::init, |move blk, ch| {
121+
future_pipe::server::completed(move ch, blk());
122122
}))
123123
}
124124

src/libcore/pipes.rs

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ export send_packet, recv_packet, buffer_header;
113113
const SPIN_COUNT: uint = 0;
114114

115115
macro_rules! move_it (
116-
{ $x:expr } => { unsafe { let y <- *ptr::addr_of($x); y } }
116+
{ $x:expr } => { unsafe { let y <- *ptr::addr_of($x); move y } }
117117
)
118118

119119
#[doc(hidden)]
@@ -262,8 +262,7 @@ fn unibuffer<T: Send>() -> ~Buffer<Packet<T>> {
262262
unsafe {
263263
b.data.header.buffer = reinterpret_cast(&b);
264264
}
265-
266-
b
265+
move b
267266
}
268267

269268
#[doc(hidden)]
@@ -411,7 +410,7 @@ fn send<T: Send, Tbuffer: Send>(+p: SendPacketBuffered<T, Tbuffer>,
411410
let p = unsafe { &*p_ };
412411
assert ptr::addr_of(p.header) == header;
413412
assert p.payload.is_none();
414-
p.payload <- Some(payload);
413+
p.payload <- Some(move payload);
415414
let old_state = swap_state_rel(&mut p.header.state, Full);
416415
match old_state {
417416
Empty => {
@@ -449,7 +448,7 @@ Fails if the sender closes the connection.
449448
450449
*/
451450
fn recv<T: Send, Tbuffer: Send>(+p: RecvPacketBuffered<T, Tbuffer>) -> T {
452-
option::unwrap_expect(try_recv(p), "connection closed")
451+
option::unwrap_expect(try_recv(move p), "connection closed")
453452
}
454453

455454
/** Attempts to receive a message from a pipe.
@@ -713,8 +712,8 @@ fn select2<A: Send, Ab: Send, B: Send, Bb: Send>(
713712
let i = wait_many([a.header(), b.header()]/_);
714713

715714
match i {
716-
0 => Left((try_recv(a), b)),
717-
1 => Right((a, try_recv(b))),
715+
0 => Left((try_recv(move a), move b)),
716+
1 => Right((move a, try_recv(move b))),
718717
_ => fail ~"select2 return an invalid packet"
719718
}
720719
}
@@ -750,10 +749,10 @@ fn select<T: Send, Tb: Send>(+endpoints: ~[RecvPacketBuffered<T, Tb>])
750749
-> (uint, Option<T>, ~[RecvPacketBuffered<T, Tb>])
751750
{
752751
let ready = wait_many(endpoints.map(|p| p.header()));
753-
let mut remaining = endpoints;
752+
let mut remaining <- endpoints;
754753
let port = vec::swap_remove(remaining, ready);
755-
let result = try_recv(port);
756-
(ready, result, remaining)
754+
let result = try_recv(move port);
755+
(ready, move result, move remaining)
757756
}
758757

759758
/** The sending end of a pipe. It can be used to send exactly one
@@ -943,14 +942,14 @@ fn spawn_service<T: Send, Tb: Send>(
943942

944943
// This is some nasty gymnastics required to safely move the pipe
945944
// into a new task.
946-
let server = ~mut Some(server);
947-
do task::spawn |move service| {
945+
let server = ~mut Some(move server);
946+
do task::spawn |move service, move server| {
948947
let mut server_ = None;
949948
server_ <-> *server;
950949
service(option::unwrap(server_))
951950
}
952951

953-
client
952+
move client
954953
}
955954

956955
/** Like `spawn_service_recv`, but for protocols that start in the
@@ -967,14 +966,14 @@ fn spawn_service_recv<T: Send, Tb: Send>(
967966

968967
// This is some nasty gymnastics required to safely move the pipe
969968
// into a new task.
970-
let server = ~mut Some(server);
971-
do task::spawn |move service| {
969+
let server = ~mut Some(move server);
970+
do task::spawn |move service, move server| {
972971
let mut server_ = None;
973972
server_ <-> *server;
974973
service(option::unwrap(server_))
975974
}
976975

977-
client
976+
move client
978977
}
979978

980979
// Streams - Make pipes a little easier in general.
@@ -1039,23 +1038,23 @@ These allow sending or receiving an unlimited number of messages.
10391038
fn stream<T:Send>() -> (Chan<T>, Port<T>) {
10401039
let (c, s) = streamp::init();
10411040

1042-
(Chan_({ mut endp: Some(c) }), Port_({ mut endp: Some(s) }))
1041+
(Chan_({ mut endp: Some(move c) }), Port_({ mut endp: Some(move s) }))
10431042
}
10441043

10451044
impl<T: Send> Chan<T>: Channel<T> {
10461045
fn send(+x: T) {
10471046
let mut endp = None;
10481047
endp <-> self.endp;
10491048
self.endp = Some(
1050-
streamp::client::data(unwrap(endp), x))
1049+
streamp::client::data(unwrap(endp), move x))
10511050
}
10521051

10531052
fn try_send(+x: T) -> bool {
10541053
let mut endp = None;
10551054
endp <-> self.endp;
1056-
match move streamp::client::try_data(unwrap(endp), x) {
1055+
match move streamp::client::try_data(unwrap(endp), move x) {
10571056
Some(move next) => {
1058-
self.endp = Some(next);
1057+
self.endp = Some(move next);
10591058
true
10601059
}
10611060
None => false
@@ -1068,17 +1067,17 @@ impl<T: Send> Port<T>: Recv<T> {
10681067
let mut endp = None;
10691068
endp <-> self.endp;
10701069
let streamp::data(x, endp) = pipes::recv(unwrap(endp));
1071-
self.endp = Some(endp);
1072-
x
1070+
self.endp = Some(move endp);
1071+
move x
10731072
}
10741073

10751074
fn try_recv() -> Option<T> {
10761075
let mut endp = None;
10771076
endp <-> self.endp;
10781077
match move pipes::try_recv(unwrap(endp)) {
10791078
Some(streamp::data(move x, move endp)) => {
1080-
self.endp = Some(endp);
1081-
Some(x)
1079+
self.endp = Some(move endp);
1080+
Some(move x)
10821081
}
10831082
None => None
10841083
}
@@ -1101,13 +1100,13 @@ struct PortSet<T: Send> : Recv<T> {
11011100
mut ports: ~[pipes::Port<T>],
11021101

11031102
fn add(+port: pipes::Port<T>) {
1104-
vec::push(self.ports, port)
1103+
vec::push(self.ports, move port)
11051104
}
11061105

11071106
fn chan() -> Chan<T> {
11081107
let (ch, po) = stream();
1109-
self.add(po);
1110-
ch
1108+
self.add(move po);
1109+
move ch
11111110
}
11121111

11131112
fn try_recv() -> Option<T> {
@@ -1120,7 +1119,7 @@ struct PortSet<T: Send> : Recv<T> {
11201119
let i = wait_many(ports);
11211120
match move ports[i].try_recv() {
11221121
Some(move m) => {
1123-
result = Some(m);
1122+
result = Some(move m);
11241123
}
11251124
None => {
11261125
// Remove this port.
@@ -1129,7 +1128,7 @@ struct PortSet<T: Send> : Recv<T> {
11291128
}
11301129
}
11311130
ports <-> self.ports;
1132-
result
1131+
move result
11331132
}
11341133

11351134
fn recv() -> T {
@@ -1166,7 +1165,7 @@ type SharedChan<T: Send> = unsafe::Exclusive<Chan<T>>;
11661165

11671166
impl<T: Send> SharedChan<T>: Channel<T> {
11681167
fn send(+x: T) {
1169-
let mut xx = Some(x);
1168+
let mut xx = Some(move x);
11701169
do self.with |chan| {
11711170
let mut x = None;
11721171
x <-> xx;
@@ -1175,7 +1174,7 @@ impl<T: Send> SharedChan<T>: Channel<T> {
11751174
}
11761175

11771176
fn try_send(+x: T) -> bool {
1178-
let mut xx = Some(x);
1177+
let mut xx = Some(move x);
11791178
do self.with |chan| {
11801179
let mut x = None;
11811180
x <-> xx;
@@ -1186,7 +1185,7 @@ impl<T: Send> SharedChan<T>: Channel<T> {
11861185

11871186
/// Converts a `chan` into a `shared_chan`.
11881187
fn SharedChan<T:Send>(+c: Chan<T>) -> SharedChan<T> {
1189-
unsafe::exclusive(c)
1188+
unsafe::exclusive(move c)
11901189
}
11911190

11921191
/// Receive a message from one of two endpoints.
@@ -1240,24 +1239,24 @@ fn oneshot<T: Send>() -> (ChanOne<T>, PortOne<T>) {
12401239
* closed.
12411240
*/
12421241
fn recv_one<T: Send>(+port: PortOne<T>) -> T {
1243-
let oneshot::send(message) = recv(port);
1244-
message
1242+
let oneshot::send(message) = recv(move port);
1243+
move message
12451244
}
12461245

12471246
/// Receive a message from a oneshot pipe unless the connection was closed.
12481247
fn try_recv_one<T: Send> (+port: PortOne<T>) -> Option<T> {
1249-
let message = try_recv(port);
1248+
let message = try_recv(move port);
12501249

12511250
if message.is_none() { None }
12521251
else {
12531252
let oneshot::send(message) = option::unwrap(message);
1254-
Some(message)
1253+
Some(move message)
12551254
}
12561255
}
12571256

12581257
/// Send a message on a oneshot pipe, failing if the connection was closed.
12591258
fn send_one<T: Send>(+chan: ChanOne<T>, +data: T) {
1260-
oneshot::client::send(chan, data);
1259+
oneshot::client::send(move chan, move data);
12611260
}
12621261

12631262
/**
@@ -1266,13 +1265,13 @@ fn send_one<T: Send>(+chan: ChanOne<T>, +data: T) {
12661265
*/
12671266
fn try_send_one<T: Send>(+chan: ChanOne<T>, +data: T)
12681267
-> bool {
1269-
oneshot::client::try_send(chan, data).is_some()
1268+
oneshot::client::try_send(move chan, move data).is_some()
12701269
}
12711270

12721271
mod rt {
12731272
// These are used to hide the option constructors from the
12741273
// compiler because their names are changing
1275-
fn make_some<T>(+val: T) -> Option<T> { Some(val) }
1274+
fn make_some<T>(+val: T) -> Option<T> { Some(move val) }
12761275
fn make_none<T>() -> Option<T> { None }
12771276
}
12781277

0 commit comments

Comments
 (0)