Skip to content

Commit 8174212

Browse files
committed
---
yaml --- r: 59069 b: refs/heads/incoming c: 4958e9b h: refs/heads/master i: 59067: d7e4b7d v: v3
1 parent e6df387 commit 8174212

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+431
-297
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: c50a9d5b664478e533ba1d1d353213d70c8ad589
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/incoming: 9f106a643e6cdf2f3c8d62bcec61da087ed24c5b
9+
refs/heads/incoming: 4958e9b4b632b67050dc4de6df1f97329292dfbc
1010
refs/heads/dist-snap: 00dbbd01c2aee72982b3e0f9511ae1d4428c3ba9
1111
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1212
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/incoming/doc/rust.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1946,6 +1946,35 @@ fn avg(v: &[float]) -> float {
19461946
}
19471947
~~~~
19481948

1949+
#### Swap expressions
1950+
1951+
A _swap expression_ consists of an [lvalue](#lvalues-rvalues-and-temporaries) followed by a bi-directional arrow (`<->`) and another [lvalue](#lvalues-rvalues-and-temporaries).
1952+
1953+
Evaluating a swap expression causes, as a side effect, the values held in the left-hand-side and right-hand-side [lvalues](#lvalues-rvalues-and-temporaries) to be exchanged indivisibly.
1954+
1955+
Evaluating a swap expression neither changes reference counts,
1956+
nor deeply copies any owned structure pointed to by the moved [rvalue](#lvalues-rvalues-and-temporaries).
1957+
Instead, the swap expression represents an indivisible *exchange of ownership*,
1958+
between the right-hand-side and the left-hand-side of the expression.
1959+
No allocation or destruction is entailed.
1960+
1961+
An example of three different swap expressions:
1962+
1963+
~~~~~~~~
1964+
# let mut x = &mut [0];
1965+
# let mut a = &mut [0];
1966+
# let i = 0;
1967+
# struct S1 { z: int };
1968+
# struct S2 { c: int };
1969+
# let mut y = S1{z: 0};
1970+
# let mut b = S2{c: 0};
1971+
1972+
x <-> a;
1973+
x[i] <-> a[i];
1974+
y.z <-> b.c;
1975+
~~~~~~~~
1976+
1977+
19491978
#### Assignment expressions
19501979

19511980
An _assignment expression_ consists of an [lvalue](#lvalues-rvalues-and-temporaries) expression followed by an
@@ -1986,7 +2015,7 @@ as
19862015
== !=
19872016
&&
19882017
||
1989-
=
2018+
= <->
19902019
~~~~
19912020

19922021
Operators at the same precedence level are evaluated left-to-right.

branches/incoming/doc/tutorial-ffi.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ wrapping `malloc` and `free`:
151151
~~~~
152152
use core::libc::{c_void, size_t, malloc, free};
153153
use core::unstable::intrinsics;
154-
use core::util;
155154
156155
// a wrapper around the handle returned by the foreign code
157156
pub struct Unique<T> {
@@ -185,8 +184,7 @@ impl<T: Owned> Drop for Unique<T> {
185184
fn finalize(&self) {
186185
unsafe {
187186
let mut x = intrinsics::init(); // dummy value to swap in
188-
// moving the object out is needed to call the destructor
189-
util::replace_ptr(self.ptr, x);
187+
x <-> *self.ptr; // moving the object out is needed to call the destructor
190188
free(self.ptr as *c_void)
191189
}
192190
}

branches/incoming/src/libcore/cell.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
1313
use cast::transmute_mut;
1414
use prelude::*;
15-
use util::replace;
1615

1716
/*
1817
A dynamic, mutable location.
@@ -49,7 +48,9 @@ pub impl<T> Cell<T> {
4948
fail!(~"attempt to take an empty cell");
5049
}
5150
52-
replace(&mut self.value, None).unwrap()
51+
let mut value = None;
52+
value <-> self.value;
53+
value.unwrap()
5354
}
5455
5556
/// Returns the value, failing if the cell is full.

branches/incoming/src/libcore/comm.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use uint;
2121
use unstable;
2222
use vec;
2323
use unstable::Exclusive;
24-
use util::replace;
2524

2625
use pipes::{recv, try_recv, wait_many, peek, PacketHeader};
2726

@@ -150,8 +149,9 @@ impl<T: Owned> GenericChan<T> for Chan<T> {
150149
#[inline(always)]
151150
fn send(&self, x: T) {
152151
unsafe {
152+
let mut endp = None;
153153
let mut self_endp = transmute_mut(&self.endp);
154-
let endp = replace(self_endp, None);
154+
endp <-> *self_endp;
155155
*self_endp = Some(streamp::client::data(endp.unwrap(), x))
156156
}
157157
}
@@ -161,8 +161,9 @@ impl<T: Owned> GenericSmartChan<T> for Chan<T> {
161161
#[inline(always)]
162162
fn try_send(&self, x: T) -> bool {
163163
unsafe {
164+
let mut endp = None;
164165
let mut self_endp = transmute_mut(&self.endp);
165-
let endp = replace(self_endp, None);
166+
endp <-> *self_endp;
166167
match streamp::client::try_data(endp.unwrap(), x) {
167168
Some(next) => {
168169
*self_endp = Some(next);
@@ -178,8 +179,9 @@ impl<T: Owned> GenericPort<T> for Port<T> {
178179
#[inline(always)]
179180
fn recv(&self) -> T {
180181
unsafe {
182+
let mut endp = None;
181183
let mut self_endp = transmute_mut(&self.endp);
182-
let endp = replace(self_endp, None);
184+
endp <-> *self_endp;
183185
let streamp::data(x, endp) = recv(endp.unwrap());
184186
*self_endp = Some(endp);
185187
x
@@ -189,8 +191,9 @@ impl<T: Owned> GenericPort<T> for Port<T> {
189191
#[inline(always)]
190192
fn try_recv(&self) -> Option<T> {
191193
unsafe {
194+
let mut endp = None;
192195
let mut self_endp = transmute_mut(&self.endp);
193-
let endp = replace(self_endp, None);
196+
endp <-> *self_endp;
194197
match try_recv(endp.unwrap()) {
195198
Some(streamp::data(x, endp)) => {
196199
*self_endp = Some(endp);
@@ -206,13 +209,14 @@ impl<T: Owned> Peekable<T> for Port<T> {
206209
#[inline(always)]
207210
fn peek(&self) -> bool {
208211
unsafe {
212+
let mut endp = None;
209213
let mut self_endp = transmute_mut(&self.endp);
210-
let mut endp = replace(self_endp, None);
214+
endp <-> *self_endp;
211215
let peek = match endp {
212216
Some(ref mut endp) => peek(endp),
213217
None => fail!(~"peeking empty stream")
214218
};
215-
*self_endp = endp;
219+
*self_endp <-> endp;
216220
peek
217221
}
218222
}
@@ -263,7 +267,8 @@ impl<T:Owned> GenericPort<T> for PortSet<T> {
263267
let mut result = None;
264268
// we have to swap the ports array so we aren't borrowing
265269
// aliasable mutable memory.
266-
let mut ports = replace(self_ports, ~[]);
270+
let mut ports = ~[];
271+
ports <-> *self_ports;
267272
while result.is_none() && ports.len() > 0 {
268273
let i = wait_many(ports);
269274
match ports[i].try_recv() {
@@ -276,7 +281,7 @@ impl<T:Owned> GenericPort<T> for PortSet<T> {
276281
}
277282
}
278283
}
279-
*self_ports = ports;
284+
ports <-> *self_ports;
280285
result
281286
}
282287
}
@@ -315,7 +320,8 @@ impl<T: Owned> GenericChan<T> for SharedChan<T> {
315320
fn send(&self, x: T) {
316321
let mut xx = Some(x);
317322
do self.ch.with_imm |chan| {
318-
let x = replace(&mut xx, None);
323+
let mut x = None;
324+
x <-> xx;
319325
chan.send(x.unwrap())
320326
}
321327
}
@@ -325,7 +331,8 @@ impl<T: Owned> GenericSmartChan<T> for SharedChan<T> {
325331
fn try_send(&self, x: T) -> bool {
326332
let mut xx = Some(x);
327333
do self.ch.with_imm |chan| {
328-
let x = replace(&mut xx, None);
334+
let mut x = None;
335+
x <-> xx;
329336
chan.try_send(x.unwrap())
330337
}
331338
}

branches/incoming/src/libcore/core

-9.02 MB
Binary file not shown.

branches/incoming/src/libcore/hashmap.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,16 @@ priv impl<K:Hash + Eq,V> HashMap<K, V> {
176176
/// Expands the capacity of the array and re-insert each of the
177177
/// existing buckets.
178178
fn resize(&mut self, new_capacity: uint) {
179+
let old_capacity = self.buckets.len();
179180
self.resize_at = resize_at(new_capacity);
180181

181-
let old_buckets = replace(&mut self.buckets,
182-
vec::from_fn(new_capacity, |_| None));
182+
let mut old_buckets = vec::from_fn(new_capacity, |_| None);
183+
self.buckets <-> old_buckets;
183184

184185
self.size = 0;
185-
do vec::consume(old_buckets) |_, bucket| {
186+
for uint::range(0, old_capacity) |i| {
187+
let mut bucket = None;
188+
bucket <-> old_buckets[i];
186189
self.insert_opt_bucket(bucket);
187190
}
188191
}
@@ -262,11 +265,13 @@ priv impl<K:Hash + Eq,V> HashMap<K, V> {
262265
};
263266
264267
let len_buckets = self.buckets.len();
265-
let bucket = replace(&mut self.buckets[idx], None);
268+
let mut bucket = None;
269+
self.buckets[idx] <-> bucket;
266270
267271
let value = match bucket {
268272
None => None,
269-
Some(Bucket{value, _}) => {
273+
Some(bucket) => {
274+
let Bucket{value: value, _} = bucket;
270275
Some(value)
271276
},
272277
};
@@ -276,7 +281,8 @@ priv impl<K:Hash + Eq,V> HashMap<K, V> {
276281
let size = self.size - 1;
277282
idx = self.next_bucket(idx, len_buckets);
278283
while self.buckets[idx].is_some() {
279-
let bucket = replace(&mut self.buckets[idx], None);
284+
let mut bucket = None;
285+
bucket <-> self.buckets[idx];
280286
self.insert_opt_bucket(bucket);
281287
idx = self.next_bucket(idx, len_buckets);
282288
}
@@ -607,13 +613,15 @@ pub impl<K: Hash + Eq, V> HashMap<K, V> {
607613
}
608614
609615
fn consume(&mut self, f: &fn(K, V)) {
610-
let buckets = replace(&mut self.buckets, ~[]);
616+
let mut buckets = ~[];
617+
self.buckets <-> buckets;
611618
self.size = 0;
612619
613620
do vec::consume(buckets) |_, bucket| {
614621
match bucket {
615622
None => {},
616-
Some(Bucket{key, value, _}) => {
623+
Some(bucket) => {
624+
let Bucket{key: key, value: value, _} = bucket;
617625
f(key, value)
618626
}
619627
}

branches/incoming/src/libcore/pipes.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ use unstable::intrinsics;
9393
use ptr;
9494
use task;
9595
use vec;
96-
use util::replace;
9796

9897
static SPIN_COUNT: uint = 0;
9998

@@ -429,7 +428,8 @@ fn try_recv_<T:Owned>(p: &mut Packet<T>) -> Option<T> {
429428
// optimistic path
430429
match p.header.state {
431430
Full => {
432-
let payload = replace(&mut p.payload, None);
431+
let mut payload = None;
432+
payload <-> p.payload;
433433
p.header.state = Empty;
434434
return Some(payload.unwrap())
435435
},
@@ -480,7 +480,8 @@ fn try_recv_<T:Owned>(p: &mut Packet<T>) -> Option<T> {
480480
fail!(~"blocking on already blocked packet")
481481
},
482482
Full => {
483-
let payload = replace(&mut p.payload, None);
483+
let mut payload = None;
484+
payload <-> p.payload;
484485
let old_task = swap_task(&mut p.header.blocked_task, ptr::null());
485486
if !old_task.is_null() {
486487
unsafe {
@@ -674,7 +675,8 @@ impl<T:Owned,Tbuffer:Owned> Drop for SendPacketBuffered<T,Tbuffer> {
674675
unsafe {
675676
let this: &mut SendPacketBuffered<T,Tbuffer> = transmute(self);
676677
if this.p != None {
677-
let p = replace(&mut this.p, None);
678+
let mut p = None;
679+
p <-> this.p;
678680
sender_terminate(p.unwrap())
679681
}
680682
}
@@ -693,7 +695,9 @@ pub fn SendPacketBuffered<T,Tbuffer>(p: *mut Packet<T>)
693695
694696
pub impl<T,Tbuffer> SendPacketBuffered<T,Tbuffer> {
695697
fn unwrap(&mut self) -> *mut Packet<T> {
696-
replace(&mut self.p, None).unwrap()
698+
let mut p = None;
699+
p <-> self.p;
700+
p.unwrap()
697701
}
698702
699703
fn header(&mut self) -> *mut PacketHeader {
@@ -709,7 +713,9 @@ pub impl<T,Tbuffer> SendPacketBuffered<T,Tbuffer> {
709713
710714
fn reuse_buffer(&mut self) -> BufferResource<Tbuffer> {
711715
//error!("send reuse_buffer");
712-
replace(&mut self.buffer, None).unwrap()
716+
let mut tmp = None;
717+
tmp <-> self.buffer;
718+
tmp.unwrap()
713719
}
714720
}
715721
@@ -732,7 +738,8 @@ impl<T:Owned,Tbuffer:Owned> Drop for RecvPacketBuffered<T,Tbuffer> {
732738
unsafe {
733739
let this: &mut RecvPacketBuffered<T,Tbuffer> = transmute(self);
734740
if this.p != None {
735-
let p = replace(&mut this.p, None);
741+
let mut p = None;
742+
p <-> this.p;
736743
receiver_terminate(p.unwrap())
737744
}
738745
}
@@ -741,11 +748,15 @@ impl<T:Owned,Tbuffer:Owned> Drop for RecvPacketBuffered<T,Tbuffer> {
741748
742749
pub impl<T:Owned,Tbuffer:Owned> RecvPacketBuffered<T, Tbuffer> {
743750
fn unwrap(&mut self) -> *mut Packet<T> {
744-
replace(&mut self.p, None).unwrap()
751+
let mut p = None;
752+
p <-> self.p;
753+
p.unwrap()
745754
}
746755
747756
fn reuse_buffer(&mut self) -> BufferResource<Tbuffer> {
748-
replace(&mut self.buffer, None).unwrap()
757+
let mut tmp = None;
758+
tmp <-> self.buffer;
759+
tmp.unwrap()
749760
}
750761
}
751762

0 commit comments

Comments
 (0)