Skip to content

Commit 48de722

Browse files
committed
---
yaml --- r: 58223 b: refs/heads/auto c: bba0680 h: refs/heads/master i: 58221: 906881f 58219: a901bfc 58215: 6a1c4b7 58207: 59e79b5 v: v3
1 parent 69aedae commit 48de722

File tree

3 files changed

+59
-24
lines changed

3 files changed

+59
-24
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
1414
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1515
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1616
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
17-
refs/heads/auto: 92d2ec4d32c7f7722569b1463cba31c6402f7513
17+
refs/heads/auto: bba0680cb0801bc52d2abfc87bbf0885dc0355f8
1818
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1919
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c

branches/auto/src/libstd/future.rs

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use core::task;
2929

3030
#[doc = "The future type"]
3131
pub struct Future<A> {
32-
priv mut state: FutureState<A>,
32+
priv state: FutureState<A>,
3333
}
3434

3535
// FIXME(#2829) -- futures should not be copyable, because they close
@@ -47,33 +47,68 @@ priv enum FutureState<A> {
4747

4848
/// Methods on the `future` type
4949
pub impl<A:Copy> Future<A> {
50-
fn get(&self) -> A {
50+
fn get(&mut self) -> A {
5151
//! Get the value of the future
5252
*(self.get_ref())
5353
}
5454
}
5555

5656
pub impl<A> Future<A> {
57+
#[cfg(stage0)]
5758
fn get_ref<'a>(&'a self) -> &'a A {
5859
/*!
5960
* Executes the future's closure and then returns a borrowed
6061
* pointer to the result. The borrowed pointer lasts as long as
6162
* the future.
6263
*/
6364
unsafe {
64-
match self.state {
65-
Forced(ref mut v) => { return cast::transmute(v); }
66-
Evaluating => fail!(~"Recursive forcing of future!"),
67-
Pending(_) => {}
65+
{
66+
match self.state {
67+
Forced(ref mut v) => { return cast::transmute(v); }
68+
Evaluating => fail!(~"Recursive forcing of future!"),
69+
Pending(_) => {}
70+
}
71+
}
72+
{
73+
let mut state = Evaluating;
74+
self.state <-> state;
75+
match state {
76+
Forced(_) | Evaluating => fail!(~"Logic error."),
77+
Pending(f) => {
78+
self.state = Forced(f());
79+
cast::transmute(self.get_ref())
80+
}
81+
}
6882
}
83+
}
84+
}
6985
70-
let mut state = Evaluating;
71-
self.state <-> state;
72-
match state {
73-
Forced(_) | Evaluating => fail!(~"Logic error."),
74-
Pending(f) => {
75-
self.state = Forced(f());
76-
self.get_ref()
86+
#[cfg(stage1)]
87+
#[cfg(stage2)]
88+
#[cfg(stage3)]
89+
fn get_ref<'a>(&'a mut self) -> &'a A {
90+
/*!
91+
* Executes the future's closure and then returns a borrowed
92+
* pointer to the result. The borrowed pointer lasts as long as
93+
* the future.
94+
*/
95+
unsafe {
96+
{
97+
match self.state {
98+
Forced(ref mut v) => { return cast::transmute(v); }
99+
Evaluating => fail!(~"Recursive forcing of future!"),
100+
Pending(_) => {}
101+
}
102+
}
103+
{
104+
let mut state = Evaluating;
105+
self.state <-> state;
106+
match state {
107+
Forced(_) | Evaluating => fail!(~"Logic error."),
108+
Pending(f) => {
109+
self.state = Forced(f());
110+
cast::transmute(self.get_ref())
111+
}
77112
}
78113
}
79114
}
@@ -150,54 +185,54 @@ mod test {
150185
151186
#[test]
152187
fn test_from_value() {
153-
let f = from_value(~"snail");
188+
let mut f = from_value(~"snail");
154189
assert!(f.get() == ~"snail");
155190
}
156191
157192
#[test]
158193
fn test_from_port() {
159194
let (po, ch) = oneshot();
160195
send_one(ch, ~"whale");
161-
let f = from_port(po);
196+
let mut f = from_port(po);
162197
assert!(f.get() == ~"whale");
163198
}
164199
165200
#[test]
166201
fn test_from_fn() {
167-
let f = from_fn(|| ~"brail");
202+
let mut f = from_fn(|| ~"brail");
168203
assert!(f.get() == ~"brail");
169204
}
170205
171206
#[test]
172207
fn test_interface_get() {
173-
let f = from_value(~"fail");
208+
let mut f = from_value(~"fail");
174209
assert!(f.get() == ~"fail");
175210
}
176211
177212
#[test]
178213
fn test_get_ref_method() {
179-
let f = from_value(22);
214+
let mut f = from_value(22);
180215
assert!(*f.get_ref() == 22);
181216
}
182217
183218
#[test]
184219
fn test_spawn() {
185-
let f = spawn(|| ~"bale");
220+
let mut f = spawn(|| ~"bale");
186221
assert!(f.get() == ~"bale");
187222
}
188223
189224
#[test]
190225
#[should_fail]
191226
#[ignore(cfg(target_os = "win32"))]
192227
fn test_futurefail() {
193-
let f = spawn(|| fail!());
228+
let mut f = spawn(|| fail!());
194229
let _x: ~str = f.get();
195230
}
196231
197232
#[test]
198233
fn test_sendable_future() {
199234
let expected = ~"schlorf";
200-
let f = do spawn { copy expected };
235+
let mut f = do spawn { copy expected };
201236
do task::spawn || {
202237
let actual = f.get();
203238
assert!(actual == expected);

branches/auto/src/libstd/par.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ fn map_slices<A:Copy + Owned,B:Copy + Owned>(
7373
info!("num_tasks: %?", (num_tasks, futures.len()));
7474
assert!((num_tasks == futures.len()));
7575

76-
let r = do futures.map() |ys| {
76+
let r = do vec::map_consume(futures) |ys| {
77+
let mut ys = ys;
7778
ys.get()
7879
};
79-
assert!((r.len() == futures.len()));
8080
r
8181
}
8282
}

0 commit comments

Comments
 (0)