about summary refs log tree commit diff
path: root/src/libstd/panic.rs
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2015-12-25 12:00:40 -0700
committerSteven Fackler <sfackler@gmail.com>2016-01-06 16:06:11 -0800
commit022c9c70c48581b8caa17895b447a941a9750076 (patch)
tree37b70c488759bebaff9b5312d2829f3af5f3c804 /src/libstd/panic.rs
parent5b838c586c4da31395d614d9f076430314fa05ff (diff)
downloadrust-022c9c70c48581b8caa17895b447a941a9750076.tar.gz
rust-022c9c70c48581b8caa17895b447a941a9750076.zip
Add std::panic::propagate
Diffstat (limited to 'src/libstd/panic.rs')
-rw-r--r--src/libstd/panic.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/libstd/panic.rs b/src/libstd/panic.rs
index b42d1d1b8d4..f6931f21eb9 100644
--- a/src/libstd/panic.rs
+++ b/src/libstd/panic.rs
@@ -13,6 +13,8 @@
 #![unstable(feature = "std_panic", reason = "awaiting feedback",
             issue = "27719")]
 
+use any::Any;
+use boxed::Box;
 use cell::UnsafeCell;
 use ops::{Deref, DerefMut};
 use ptr::{Unique, Shared};
@@ -259,3 +261,28 @@ pub fn recover<F: FnOnce() -> R + RecoverSafe, R>(f: F) -> Result<R> {
     }
     Ok(result.unwrap())
 }
+
+/// Triggers a panic without invoking the panic handler.
+///
+/// This is designed to be used in conjunction with `recover` to, for example,
+/// carry a panic across a layer of C code.
+///
+/// # Examples
+///
+/// ```should_panic
+/// #![feature(std_panic, recover, panic_propagate)]
+///
+/// use std::panic;
+///
+/// let result = panic::recover(|| {
+///     panic!("oh no!");
+/// });
+///
+/// if let Err(err) = result {
+///     panic::propagate(err);
+/// }
+/// ```
+#[unstable(feature = "panic_propagate", reason = "awaiting feedback", issue = "30752")]
+pub fn propagate(payload: Box<Any + Send>) -> ! {
+    unwind::rust_panic(payload)
+}