about summary refs log tree commit diff
path: root/src/libstd/thread.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-12-10 07:49:45 -0800
committerAaron Turon <aturon@mozilla.com>2014-12-18 23:31:52 -0800
commit4ffd9f49c340c350080bfe6c1be9e3aaccd549d0 (patch)
tree23aff13e71e93fa2c73cea94bf6128f920220dfe /src/libstd/thread.rs
parenta7061d02e16d0821d3af2b753155fe44bab7725c (diff)
downloadrust-4ffd9f49c340c350080bfe6c1be9e3aaccd549d0.tar.gz
rust-4ffd9f49c340c350080bfe6c1be9e3aaccd549d0.zip
Avoid .take().unwrap() with FnOnce closures
Diffstat (limited to 'src/libstd/thread.rs')
-rw-r--r--src/libstd/thread.rs25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/libstd/thread.rs b/src/libstd/thread.rs
index f179219884f..7ccfe0ab74b 100644
--- a/src/libstd/thread.rs
+++ b/src/libstd/thread.rs
@@ -243,17 +243,20 @@ impl Cfg {
             // the thread itself. For these reasons, this unsafety should be ok.
             unsafe {
                 let mut output = None;
-                let mut f_opt = Some( // option dance
-                    if stdout.is_some() || stderr.is_some() {
-                        proc() {
-                            let _ = stdout.map(stdio::set_stdout);
-                            let _ = stderr.map(stdio::set_stderr);
-                            f()
-                        }
-                    } else {
-                        f
-                    });
-                let try_result = unwind::try(|| output = Some((f_opt.take().unwrap())()));
+                let f = if stdout.is_some() || stderr.is_some() {
+                    proc() {
+                        let _ = stdout.map(stdio::set_stdout);
+                        let _ = stderr.map(stdio::set_stderr);
+                        f()
+                    }
+                } else {
+                    f
+                };
+
+                let try_result = {
+                    let ptr = &mut output;
+                    unwind::try(move || *ptr = Some(f()))
+                };
                 match (output, try_result) {
                     (Some(data), Ok(_)) => after(Ok(data)),
                     (None, Err(cause)) => after(Err(cause)),