From 31f9b5159297ffbc6da8f6e640cd6f4f8ed7c44d Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Thu, 8 Aug 2013 19:34:08 -0400 Subject: [PATCH] Make cell with_ref/with_mut_ref use finally. Close #7975. --- src/libstd/cell.rs | 16 ++++++++-------- 1 file 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 Cell { /// Calls a closure with a reference to the value. pub fn with_ref(&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(&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()); + } } }