diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-05-02 20:51:56 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-05-02 20:51:56 -0700 |
| commit | 6c478c7de889ec4943b9dcdcbfbb8a8244f479cc (patch) | |
| tree | 7f9fd01150a7611007255cbb2e45cf41e0cd4989 /src/libcore/sys.rs | |
| parent | baa1c1834f608c8c789db6d2495626ff9d28dd96 (diff) | |
| parent | f8dffc6789113a10c9dbf1d815c3569b19b53e96 (diff) | |
| download | rust-6c478c7de889ec4943b9dcdcbfbb8a8244f479cc.tar.gz rust-6c478c7de889ec4943b9dcdcbfbb8a8244f479cc.zip | |
Merge remote-tracking branch 'brson/io' into incoming
Conflicts: mk/rt.mk src/libcore/run.rs
Diffstat (limited to 'src/libcore/sys.rs')
| -rw-r--r-- | src/libcore/sys.rs | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/libcore/sys.rs b/src/libcore/sys.rs index c0c1ad6d896..dd366048834 100644 --- a/src/libcore/sys.rs +++ b/src/libcore/sys.rs @@ -10,6 +10,7 @@ //! Misc low level stuff +use option::{Some, None}; use cast; use cmp::{Eq, Ord}; use gc; @@ -202,6 +203,7 @@ impl FailWithCause for &'static str { // NOTE: remove function after snapshot #[cfg(stage0)] pub fn begin_unwind(msg: ~str, file: ~str, line: uint) -> ! { + do str::as_buf(msg) |msg_buf, _msg_len| { do str::as_buf(file) |file_buf, _file_len| { unsafe { @@ -215,10 +217,28 @@ pub fn begin_unwind(msg: ~str, file: ~str, line: uint) -> ! { // FIXME #4427: Temporary until rt::rt_fail_ goes away pub fn begin_unwind_(msg: *c_char, file: *c_char, line: size_t) -> ! { - unsafe { - gc::cleanup_stack_for_failure(); - rustrt::rust_upcall_fail(msg, file, line); - cast::transmute(()) + use rt::{context, OldTaskContext}; + use rt::local_services::unsafe_borrow_local_services; + + match context() { + OldTaskContext => { + unsafe { + gc::cleanup_stack_for_failure(); + rustrt::rust_upcall_fail(msg, file, line); + cast::transmute(()) + } + } + _ => { + // XXX: Need to print the failure message + gc::cleanup_stack_for_failure(); + unsafe { + let local_services = unsafe_borrow_local_services(); + match local_services.unwinder { + Some(ref mut unwinder) => unwinder.begin_unwind(), + None => abort!("failure without unwinder. aborting process") + } + } + } } } |
