diff options
| author | Marvin Löbel <loebel.marvin@gmail.com> | 2013-10-27 20:12:40 +0100 |
|---|---|---|
| committer | Marvin Löbel <loebel.marvin@gmail.com> | 2013-10-30 21:19:18 +0100 |
| commit | 54f4dcd76aafe33c553f6b58fe3e808f055465e1 (patch) | |
| tree | 1a217bcb8ea4d3879dd86ece05468334af1754d2 /src/libstd/task/mod.rs | |
| parent | e42e378f32e212997fc42281112b1c9c4c247de0 (diff) | |
| download | rust-54f4dcd76aafe33c553f6b58fe3e808f055465e1.tar.gz rust-54f4dcd76aafe33c553f6b58fe3e808f055465e1.zip | |
Prepared `std::sys` for removal, and made `begin_unwind` simpler
- `begin_unwind` is now generic over any `T: Any + Send`. - Every value you fail with gets boxed as an `~Any`. - Because of implementation details, `&'static str` and `~str` are still handled specially behind the scenes. - Changed the big macro source string in libsyntax to a raw string literal, and enabled doc comments there.
Diffstat (limited to 'src/libstd/task/mod.rs')
| -rw-r--r-- | src/libstd/task/mod.rs | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/src/libstd/task/mod.rs b/src/libstd/task/mod.rs index 023ba6f7108..cdb70f00dfe 100644 --- a/src/libstd/task/mod.rs +++ b/src/libstd/task/mod.rs @@ -60,7 +60,8 @@ use comm::{stream, Chan, GenericChan, GenericPort, Port, Peekable}; use result::{Result, Ok, Err}; use rt::in_green_task_context; use rt::local::Local; -use rt::task::{UnwindReasonAny, UnwindReasonLinked, UnwindReasonStr}; +use rt::task::{UnwindMessageAny, UnwindMessageLinked}; +use rt::task::{UnwindMessageStrStatic, UnwindMessageStrOwned}; use rt::task::{UnwindResult, Success, Failure}; use send_str::{SendStr, IntoSendStr}; use unstable::finally::Finally; @@ -93,9 +94,10 @@ pub struct LinkedFailure; fn wrap_as_any(res: UnwindResult) -> TaskResult { match res { Success => Ok(()), - Failure(UnwindReasonStr(s)) => Err(~s as ~Any), - Failure(UnwindReasonAny(a)) => Err(a), - Failure(UnwindReasonLinked) => Err(~LinkedFailure as ~Any) + Failure(UnwindMessageAny(a)) => Err(a), + Failure(UnwindMessageLinked) => Err(~LinkedFailure as ~Any), + Failure(UnwindMessageStrOwned(s)) => Err(~s as ~Any), + Failure(UnwindMessageStrStatic(s)) => Err(~s as ~Any), } } @@ -1425,38 +1427,52 @@ fn test_indestructible() { } #[test] -fn test_try_fail_cause_static_str() { +fn test_try_fail_message_static_str() { match do try { fail!("static string"); } { - Err(ref e) if e.is::<SendStr>() => {} - Err(_) | Ok(()) => fail!() + Err(e) => { + type T = &'static str; + assert!(e.is::<T>()); + assert_eq!(*e.move::<T>().unwrap(), "static string"); + } + Ok(()) => fail!() } } #[test] -fn test_try_fail_cause_owned_str() { +fn test_try_fail_message_owned_str() { match do try { fail!(~"owned string"); } { - Err(ref e) if e.is::<SendStr>() => {} - Err(_) | Ok(()) => fail!() + Err(e) => { + type T = ~str; + assert!(e.is::<T>()); + assert_eq!(*e.move::<T>().unwrap(), ~"owned string"); + } + Ok(()) => fail!() } } #[test] -fn test_try_fail_cause_any() { +fn test_try_fail_message_any() { match do try { fail!(~413u16 as ~Any); } { - Err(ref e) if e.is::<u16>() => {} - Err(_) | Ok(()) => fail!() + Err(e) => { + type T = ~Any; + assert!(e.is::<T>()); + let any = e.move::<T>().unwrap(); + assert!(any.is::<u16>()); + assert_eq!(*any.move::<u16>().unwrap(), 413u16); + } + Ok(()) => fail!() } } #[ignore(reason = "linked failure")] #[test] -fn test_try_fail_cause_linked() { +fn test_try_fail_message_linked() { match do try { do spawn { fail!() @@ -1468,11 +1484,11 @@ fn test_try_fail_cause_linked() { } #[test] -fn test_try_fail_cause_any_wrapped() { +fn test_try_fail_message_unit_struct() { struct Juju; match do try { - fail!(~Juju) + fail!(Juju) } { Err(ref e) if e.is::<Juju>() => {} Err(_) | Ok(()) => fail!() |
