X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibstd%2Fpanic.rs;h=5c2e36623cbed160badc10f127a70c3e76a213dd;hb=cd92e9f9668dd17e281ef0f2422635adc7c8fd48;hp=83df54f1830146da666602c1efa109a4cad7fe6e;hpb=af1a0a346639966373206b70d7cd6376937bb544;p=rust.git diff --git a/src/libstd/panic.rs b/src/libstd/panic.rs index 83df54f1830..5c2e36623cb 100644 --- a/src/libstd/panic.rs +++ b/src/libstd/panic.rs @@ -129,6 +129,9 @@ pub trait RefRecoverSafe {} /// /// # Examples /// +/// One way to use `AssertRecoverSafe` is to assert that the entire closure +/// itself is recover safe, bypassing all checks for all variables: +/// /// ``` /// #![feature(recover, std_panic)] /// @@ -144,10 +147,33 @@ pub trait RefRecoverSafe {} /// // }); /// /// // This, however, will compile due to the `AssertRecoverSafe` wrapper +/// let result = panic::recover(AssertRecoverSafe::new(|| { +/// variable += 3; +/// })); +/// // ... +/// ``` +/// +/// Wrapping the entire closure amounts to a blanket assertion that all captured +/// variables are recover safe. This has the downside that if new captures are +/// added in the future, they will also be considered recover safe. Therefore, +/// you may prefer to just wrap individual captures, as shown below. This is +/// more annotation, but it ensures that if a new capture is added which is not +/// recover safe, you will get a compilation error at that time, which will +/// allow you to consider whether that new capture in fact represent a bug or +/// not. +/// +/// ``` +/// #![feature(recover, std_panic)] +/// +/// use std::panic::{self, AssertRecoverSafe}; +/// +/// let mut variable = 4; +/// let other_capture = 3; +/// /// let result = { /// let mut wrapper = AssertRecoverSafe::new(&mut variable); /// panic::recover(move || { -/// **wrapper += 3; +/// **wrapper += other_capture; /// }) /// }; /// // ... @@ -193,6 +219,12 @@ impl AssertRecoverSafe { pub fn new(t: T) -> AssertRecoverSafe { AssertRecoverSafe(t) } + + /// Consumes the `AssertRecoverSafe`, returning the wrapped value. + #[unstable(feature = "recover", reason = "awaiting feedback", issue = "27719")] + pub fn into_inner(self) -> T { + self.0 + } } impl Deref for AssertRecoverSafe { @@ -209,6 +241,14 @@ fn deref_mut(&mut self) -> &mut T { } } +impl R> FnOnce<()> for AssertRecoverSafe { + type Output = R; + + extern "rust-call" fn call_once(self, _args: ()) -> R { + (self.0)() + } +} + /// Invokes a closure, capturing the cause of panic if one occurs. /// /// This function will return `Ok` with the closure's result if the closure