@@ -175,7 +175,7 @@ pub struct TaskOpts {
175
175
// FIXME (#3724): Replace the 'consumed' bit with move mode on self
176
176
pub struct TaskBuilder {
177
177
opts : TaskOpts ,
178
- gen_body : @ fn ( v : ~fn ( ) ) -> ~fn ( ) ,
178
+ mut gen_body : Option < ~ fn ( v : ~fn ( ) ) -> ~fn ( ) > ,
179
179
can_not_copy : Option < util:: NonCopyable > ,
180
180
mut consumed : bool ,
181
181
}
@@ -188,7 +188,7 @@ pub struct TaskBuilder {
188
188
pub fn task ( ) -> TaskBuilder {
189
189
TaskBuilder {
190
190
opts : default_task_opts ( ) ,
191
- gen_body : |body| body , // Identity function
191
+ gen_body : None ,
192
192
can_not_copy : None ,
193
193
mut consumed : false ,
194
194
}
@@ -201,6 +201,7 @@ priv impl TaskBuilder {
201
201
fail ! ( ~"Cannot copy a task_builder"); // Fake move mode on self
202
202
}
203
203
self.consumed = true;
204
+ let gen_body = replace(&mut self.gen_body, None);
204
205
let notify_chan = replace(&mut self.opts.notify_chan, None);
205
206
TaskBuilder {
206
207
opts: TaskOpts {
@@ -209,7 +210,7 @@ priv impl TaskBuilder {
209
210
notify_chan: notify_chan,
210
211
sched: self.opts.sched
211
212
},
212
- gen_body: self. gen_body,
213
+ gen_body: gen_body,
213
214
can_not_copy: None,
214
215
consumed: false
215
216
}
@@ -341,8 +342,23 @@ pub impl TaskBuilder {
341
342
* generator by applying the task body which results from the
342
343
* existing body generator to the new body generator.
343
344
*/
344
- fn add_wrapper(&self, wrapper: @fn(v: ~fn()) -> ~fn()) -> TaskBuilder {
345
- let prev_gen_body = self.gen_body;
345
+ fn add_wrapper(&self, wrapper: ~fn(v: ~fn()) -> ~fn()) -> TaskBuilder {
346
+ let prev_gen_body = replace(&mut self.gen_body, None);
347
+ let prev_gen_body = match prev_gen_body {
348
+ Some(gen) => gen,
349
+ None => {
350
+ let f: ~fn(~fn()) -> ~fn() = |body| body;
351
+ f
352
+ }
353
+ };
354
+ let prev_gen_body = Cell(prev_gen_body);
355
+ let next_gen_body = {
356
+ let f: ~fn(~fn()) -> ~fn() = |body| {
357
+ let prev_gen_body = prev_gen_body.take();
358
+ wrapper(prev_gen_body(body))
359
+ };
360
+ f
361
+ };
346
362
let notify_chan = replace(&mut self.opts.notify_chan, None);
347
363
TaskBuilder {
348
364
opts: TaskOpts {
@@ -351,7 +367,7 @@ pub impl TaskBuilder {
351
367
notify_chan: notify_chan,
352
368
sched: self.opts.sched
353
369
},
354
- gen_body: |body| { wrapper(prev_gen_body(body)) } ,
370
+ gen_body: Some(next_gen_body) ,
355
371
can_not_copy: None,
356
372
.. self.consume()
357
373
}
@@ -370,6 +386,7 @@ pub impl TaskBuilder {
370
386
* must be greater than zero.
371
387
*/
372
388
fn spawn(&self, f: ~fn()) {
389
+ let gen_body = replace(&mut self.gen_body, None);
373
390
let notify_chan = replace(&mut self.opts.notify_chan, None);
374
391
let x = self.consume();
375
392
let opts = TaskOpts {
@@ -378,7 +395,15 @@ pub impl TaskBuilder {
378
395
notify_chan: notify_chan,
379
396
sched: x.opts.sched
380
397
};
381
- spawn::spawn_raw(opts, (x.gen_body)(f));
398
+ let f = match gen_body {
399
+ Some(gen) => {
400
+ gen(f)
401
+ }
402
+ None => {
403
+ f
404
+ }
405
+ };
406
+ spawn::spawn_raw(opts, f);
382
407
}
383
408
/// Runs a task, while transfering ownership of one argument to the child.
384
409
fn spawn_with<A:Owned>(&self, arg: A, f: ~fn(v: A)) {
0 commit comments