diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-12-10 07:49:45 -0800 |
|---|---|---|
| committer | Aaron Turon <aturon@mozilla.com> | 2014-12-18 23:31:52 -0800 |
| commit | 4ffd9f49c340c350080bfe6c1be9e3aaccd549d0 (patch) | |
| tree | 23aff13e71e93fa2c73cea94bf6128f920220dfe /src/libstd | |
| parent | a7061d02e16d0821d3af2b753155fe44bab7725c (diff) | |
| download | rust-4ffd9f49c340c350080bfe6c1be9e3aaccd549d0.tar.gz rust-4ffd9f49c340c350080bfe6c1be9e3aaccd549d0.zip | |
Avoid .take().unwrap() with FnOnce closures
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/lib.rs | 2 | ||||
| -rw-r--r-- | src/libstd/rt/unwind.rs | 28 | ||||
| -rw-r--r-- | src/libstd/sys/common/thread_info.rs | 5 | ||||
| -rw-r--r-- | src/libstd/thread.rs | 25 | ||||
| -rw-r--r-- | src/libstd/thread_local/mod.rs | 5 | ||||
| -rw-r--r-- | src/libstd/thread_local/scoped.rs | 1 |
6 files changed, 27 insertions, 39 deletions
diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 7219fef3732..5796f894661 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -106,7 +106,7 @@ #![allow(unknown_features)] #![feature(macro_rules, globs, linkage, thread_local, asm)] #![feature(default_type_params, phase, lang_items, unsafe_destructor)] -#![feature(import_shadowing, slicing_syntax)] +#![feature(import_shadowing, slicing_syntax, tuple_indexing)] #![feature(unboxed_closures)] // Don't link to std. We are std. diff --git a/src/libstd/rt/unwind.rs b/src/libstd/rt/unwind.rs index 1beab8be909..c896f4e39da 100644 --- a/src/libstd/rt/unwind.rs +++ b/src/libstd/rt/unwind.rs @@ -57,22 +57,17 @@ //! //! Currently Rust uses unwind runtime provided by libgcc. -use core::prelude::*; +use prelude::*; use any::Any; -use boxed::Box; use cmp; use failure; use fmt; use intrinsics; use libc::c_void; use mem; -use raw::Closure; -use str::StrAllocating; -use string::String; use sync::atomic; use sync::{Once, ONCE_INIT}; -use vec::Vec; use sys_common::thread_info; use rt::libunwind as uw; @@ -119,10 +114,9 @@ static CALLBACK_CNT: atomic::AtomicUint = atomic::INIT_ATOMIC_UINT; /// guaranteed that a rust task is in place when invoking this function. /// Unwinding twice can lead to resource leaks where some destructors are not /// run. -pub unsafe fn try(f: ||) -> ::core::result::Result<(), Box<Any + Send>> { - let closure: Closure = mem::transmute(f); - let ep = rust_try(try_fn, closure.code as *mut c_void, - closure.env as *mut c_void); +pub unsafe fn try<F: FnOnce()>(f: F) -> Result<(), Box<Any + Send>> { + let mut f = Some(f); + let ep = rust_try(try_fn::<F>, &mut f as *mut _ as *mut c_void); return if ep.is_null() { Ok(()) } else { @@ -133,14 +127,9 @@ pub unsafe fn try(f: ||) -> ::core::result::Result<(), Box<Any + Send>> { Err(cause.unwrap()) }; - extern fn try_fn(code: *mut c_void, env: *mut c_void) { - unsafe { - let closure: || = mem::transmute(Closure { - code: code as *mut (), - env: env as *mut (), - }); - closure(); - } + extern fn try_fn<F: FnOnce()>(opt_closure: *mut c_void) { + let opt_closure = opt_closure as *mut Option<F>; + unsafe { (*opt_closure).take().unwrap()(); } } #[link(name = "rustrt_native", kind = "static")] @@ -152,8 +141,7 @@ pub unsafe fn try(f: ||) -> ::core::result::Result<(), Box<Any + Send>> { // When f(...) returns normally, the return value is null. // When f(...) throws, the return value is a pointer to the caught // exception object. - fn rust_try(f: extern "C" fn(*mut c_void, *mut c_void), - code: *mut c_void, + fn rust_try(f: extern fn(*mut c_void), data: *mut c_void) -> *mut uw::_Unwind_Exception; } } diff --git a/src/libstd/sys/common/thread_info.rs b/src/libstd/sys/common/thread_info.rs index 0612448cfa0..206d443d294 100644 --- a/src/libstd/sys/common/thread_info.rs +++ b/src/libstd/sys/common/thread_info.rs @@ -60,12 +60,11 @@ pub fn set_unwinding(unwinding: bool) { pub fn set(stack_bounds: (uint, uint), stack_guard: uint, thread: Thread) { THREAD_INFO.with(|c| assert!(c.borrow().is_none())); - let mut thread_opt = Some(thread); // option dance - THREAD_INFO.with(|c| *c.borrow_mut() = Some(ThreadInfo{ + THREAD_INFO.with(move |c| *c.borrow_mut() = Some(ThreadInfo{ stack_bounds: stack_bounds, stack_guard: stack_guard, unwinding: false, - thread: thread_opt.take().unwrap(), + thread: thread, })); } 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)), diff --git a/src/libstd/thread_local/mod.rs b/src/libstd/thread_local/mod.rs index e2cedae1be6..4c052a4ce09 100644 --- a/src/libstd/thread_local/mod.rs +++ b/src/libstd/thread_local/mod.rs @@ -217,9 +217,8 @@ impl<T: 'static> Key<T> { /// This function will `panic!()` if the key currently has its /// destructor running, and it **may** panic if the destructor has /// previously been run for this thread. - pub fn with<R, F>(&'static self, f: F) -> R where - F: FnOnce(&T) -> R, - { + pub fn with<F, R>(&'static self, f: F) -> R + where F: FnOnce(&T) -> R { let slot = (self.inner)(); unsafe { let slot = slot.get().expect("cannot access a TLS value during or \ diff --git a/src/libstd/thread_local/scoped.rs b/src/libstd/thread_local/scoped.rs index 7762d225b9a..96f09190c2f 100644 --- a/src/libstd/thread_local/scoped.rs +++ b/src/libstd/thread_local/scoped.rs @@ -262,4 +262,3 @@ mod tests { }); } } - |
