diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-06-10 23:13:04 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-06-11 12:40:40 -0700 |
| commit | 305f5110a7d4a1ccad32bd0b154e53df59664528 (patch) | |
| tree | a97722819f61fa3c58f4faa181406cb7518faf70 | |
| parent | d0b197900485c98cf2a09298823ea274db50c4d9 (diff) | |
| download | rust-305f5110a7d4a1ccad32bd0b154e53df59664528.tar.gz rust-305f5110a7d4a1ccad32bd0b154e53df59664528.zip | |
Add a finally impl for `extern "Rust" fn()`
| -rw-r--r-- | src/libstd/unstable/finally.rs | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/src/libstd/unstable/finally.rs b/src/libstd/unstable/finally.rs index 5001fb421cd..b15bceddb1c 100644 --- a/src/libstd/unstable/finally.rs +++ b/src/libstd/unstable/finally.rs @@ -31,17 +31,20 @@ pub trait Finally<T> { fn finally(&self, dtor: &fn()) -> T; } -impl<'self,T> Finally<T> for &'self fn() -> T { - fn finally(&self, dtor: &fn()) -> T { - let _d = Finallyalizer { - dtor: dtor - }; - - (*self)() +macro_rules! finally_fn { + ($fnty:ty) => { + impl<T> Finally<T> for $fnty { + fn finally(&self, dtor: &fn()) -> T { + let _d = Finallyalizer { + dtor: dtor + }; + (*self)() + } + } } } -impl<T> Finally<T> for ~fn() -> T { +impl<'self,T> Finally<T> for &'self fn() -> T { fn finally(&self, dtor: &fn()) -> T { let _d = Finallyalizer { dtor: dtor @@ -51,15 +54,9 @@ impl<T> Finally<T> for ~fn() -> T { } } -impl<T> Finally<T> for @fn() -> T { - fn finally(&self, dtor: &fn()) -> T { - let _d = Finallyalizer { - dtor: dtor - }; - - (*self)() - } -} +finally_fn!(~fn() -> T) +finally_fn!(@fn() -> T) +finally_fn!(extern "Rust" fn() -> T) struct Finallyalizer<'self> { dtor: &'self fn() @@ -108,10 +105,7 @@ fn test_retval() { #[test] fn test_compact() { - // FIXME #4727: Should be able to use a fn item instead - // of a closure for do_some_fallible_work, - // but it's a type error. - let do_some_fallible_work: &fn() = || { }; + fn do_some_fallible_work() {} fn but_always_run_this_function() { } do_some_fallible_work.finally( but_always_run_this_function); @@ -136,4 +130,4 @@ fn test_managed() { }; assert_eq!(do managed.finally {}, 10); assert_eq!(*i, 20); -} \ No newline at end of file +} |
