about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorBen Blum <bblum@andrew.cmu.edu>2013-08-08 19:34:08 -0400
committerBen Blum <bblum@andrew.cmu.edu>2013-08-12 13:54:21 -0400
commit31f9b5159297ffbc6da8f6e640cd6f4f8ed7c44d (patch)
tree9d14178854b1beed81e89b0431a00b1ab14790a6 /src/libstd
parentc8c09d40fc3e34b1e8cc2cd58fd644488aa71327 (diff)
downloadrust-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.rs16
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());
+        }
     }
 }