about summary refs log tree commit diff
path: root/src/libcore/sys.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-05-02 20:51:56 -0700
committerBrian Anderson <banderson@mozilla.com>2013-05-02 20:51:56 -0700
commit6c478c7de889ec4943b9dcdcbfbb8a8244f479cc (patch)
tree7f9fd01150a7611007255cbb2e45cf41e0cd4989 /src/libcore/sys.rs
parentbaa1c1834f608c8c789db6d2495626ff9d28dd96 (diff)
parentf8dffc6789113a10c9dbf1d815c3569b19b53e96 (diff)
downloadrust-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.rs28
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")
+                }
+            }
+        }
     }
 }