diff options
| author | Ben Blum <bblum@andrew.cmu.edu> | 2013-08-08 19:34:08 -0400 |
|---|---|---|
| committer | Ben Blum <bblum@andrew.cmu.edu> | 2013-08-12 13:54:21 -0400 |
| commit | 31f9b5159297ffbc6da8f6e640cd6f4f8ed7c44d (patch) | |
| tree | 9d14178854b1beed81e89b0431a00b1ab14790a6 /src/libstd | |
| parent | c8c09d40fc3e34b1e8cc2cd58fd644488aa71327 (diff) | |
| download | rust-31f9b5159297ffbc6da8f6e640cd6f4f8ed7c44d.tar.gz rust-31f9b5159297ffbc6da8f6e640cd6f4f8ed7c44d.zip | |
Make cell with_ref/with_mut_ref use finally. Close #7975.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/cell.rs | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/libstd/cell.rs b/src/libstd/cell.rs index 5a0c781fe9a..372effad61d 100644 --- a/src/libstd/cell.rs +++ b/src/libstd/cell.rs @@ -13,6 +13,7 @@ #[missing_doc]; use cast::transmute_mut; +use unstable::finally::Finally; use prelude::*; /* @@ -65,18 +66,17 @@ impl<T> Cell<T> { /// Calls a closure with a reference to the value. pub fn with_ref<R>(&self, op: &fn(v: &T) -> R) -> R { - let v = self.take(); - let r = op(&v); - self.put_back(v); - r + do self.with_mut_ref |ptr| { op(ptr) } } /// Calls a closure with a mutable reference to the value. pub fn with_mut_ref<R>(&self, op: &fn(v: &mut T) -> R) -> R { - let mut v = self.take(); - let r = op(&mut v); - self.put_back(v); - r + let mut v = Some(self.take()); + do (|| { + op(v.get_mut_ref()) + }).finally { + self.put_back(v.take_unwrap()); + } } } |
