From 57d8289754767e046a01abaab6054b7146c51f74 Mon Sep 17 00:00:00 2001 From: P1start Date: Thu, 23 Apr 2015 22:53:54 +1200 Subject: Make `UnsafeCell`, `RefCell`, `Mutex`, and `RwLock` accept DSTs This + DST coercions (#24619) would allow code like `Rc>>` to be simplified to `Rc>`. --- src/libcore/cell.rs | 59 +++++++++++++++++++++++++++----------------------- src/libcore/fmt/mod.rs | 6 ++--- 2 files changed, 35 insertions(+), 30 deletions(-) (limited to 'src/libcore') diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index 9ff447a87f1..c717b608a24 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -144,7 +144,7 @@ use clone::Clone; use cmp::PartialEq; use default::Default; -use marker::{Copy, Send, Sync}; +use marker::{Copy, Send, Sync, Sized}; use ops::{Deref, DerefMut, Drop}; use option::Option; use option::Option::{None, Some}; @@ -266,9 +266,9 @@ impl PartialEq for Cell { /// /// See the [module-level documentation](index.html) for more. #[stable(feature = "rust1", since = "1.0.0")] -pub struct RefCell { - value: UnsafeCell, +pub struct RefCell { borrow: Cell, + value: UnsafeCell, } /// An enumeration of values returned from the `state` method on a `RefCell`. @@ -328,7 +328,9 @@ impl RefCell { debug_assert!(self.borrow.get() == UNUSED); unsafe { self.value.into_inner() } } +} +impl RefCell { /// Query the current state of this `RefCell` /// /// The returned value can be dispatched on to determine if a call to @@ -449,7 +451,7 @@ impl RefCell { } #[stable(feature = "rust1", since = "1.0.0")] -unsafe impl Send for RefCell where T: Send {} +unsafe impl Send for RefCell where T: Send {} #[stable(feature = "rust1", since = "1.0.0")] impl Clone for RefCell { @@ -469,7 +471,7 @@ impl Default for RefCell { } #[stable(feature = "rust1", since = "1.0.0")] -impl PartialEq for RefCell { +impl PartialEq for RefCell { #[inline] fn eq(&self, other: &RefCell) -> bool { *self.borrow() == *other.borrow() @@ -519,7 +521,7 @@ impl<'b> Clone for BorrowRef<'b> { /// /// See the [module-level documentation](index.html) for more. #[stable(feature = "rust1", since = "1.0.0")] -pub struct Ref<'b, T:'b> { +pub struct Ref<'b, T: ?Sized + 'b> { // FIXME #12808: strange name to try to avoid interfering with // field accesses of the contained type via Deref _value: &'b T, @@ -527,7 +529,7 @@ pub struct Ref<'b, T:'b> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'b, T> Deref for Ref<'b, T> { +impl<'b, T: ?Sized> Deref for Ref<'b, T> { type Target = T; #[inline] @@ -582,7 +584,7 @@ impl<'b> BorrowRefMut<'b> { /// /// See the [module-level documentation](index.html) for more. #[stable(feature = "rust1", since = "1.0.0")] -pub struct RefMut<'b, T:'b> { +pub struct RefMut<'b, T: ?Sized + 'b> { // FIXME #12808: strange name to try to avoid interfering with // field accesses of the contained type via Deref _value: &'b mut T, @@ -590,7 +592,7 @@ pub struct RefMut<'b, T:'b> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'b, T> Deref for RefMut<'b, T> { +impl<'b, T: ?Sized> Deref for RefMut<'b, T> { type Target = T; #[inline] @@ -600,7 +602,7 @@ impl<'b, T> Deref for RefMut<'b, T> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'b, T> DerefMut for RefMut<'b, T> { +impl<'b, T: ?Sized> DerefMut for RefMut<'b, T> { #[inline] fn deref_mut<'a>(&'a mut self) -> &'a mut T { self._value @@ -633,7 +635,7 @@ impl<'b, T> DerefMut for RefMut<'b, T> { /// recommended to access its fields directly, `get` should be used instead. #[lang="unsafe_cell"] #[stable(feature = "rust1", since = "1.0.0")] -pub struct UnsafeCell { +pub struct UnsafeCell { /// Wrapped value /// /// This field should not be accessed directly, it is made public for static @@ -642,7 +644,7 @@ pub struct UnsafeCell { pub value: T, } -impl !Sync for UnsafeCell {} +impl !Sync for UnsafeCell {} impl UnsafeCell { /// Constructs a new instance of `UnsafeCell` which will wrap the specified @@ -664,7 +666,12 @@ impl UnsafeCell { UnsafeCell { value: value } } - /// Gets a mutable pointer to the wrapped value. + /// Unwraps the value. + /// + /// # Unsafety + /// + /// This function is unsafe because there is no guarantee that this or other threads are + /// currently inspecting the inner value. /// /// # Examples /// @@ -673,22 +680,15 @@ impl UnsafeCell { /// /// let uc = UnsafeCell::new(5); /// - /// let five = uc.get(); + /// let five = unsafe { uc.into_inner() }; /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub fn get(&self) -> *mut T { - // FIXME(#23542) Replace with type ascription. - #![allow(trivial_casts)] - &self.value as *const T as *mut T - } + pub unsafe fn into_inner(self) -> T { self.value } +} - /// Unwraps the value. - /// - /// # Unsafety - /// - /// This function is unsafe because there is no guarantee that this or other threads are - /// currently inspecting the inner value. +impl UnsafeCell { + /// Gets a mutable pointer to the wrapped value. /// /// # Examples /// @@ -697,9 +697,14 @@ impl UnsafeCell { /// /// let uc = UnsafeCell::new(5); /// - /// let five = unsafe { uc.into_inner() }; + /// let five = uc.get(); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub unsafe fn into_inner(self) -> T { self.value } + pub fn get(&self) -> *mut T { + // FIXME(#23542) Replace with type ascription. + #![allow(trivial_casts)] + &self.value as *const T as *mut T + } + } diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index 73778bfd038..f8a1ef96bcc 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -1062,7 +1062,7 @@ impl Debug for Cell { } #[stable(feature = "rust1", since = "1.0.0")] -impl Debug for RefCell { +impl Debug for RefCell { fn fmt(&self, f: &mut Formatter) -> Result { match self.borrow_state() { BorrowState::Unused | BorrowState::Reading => { @@ -1074,14 +1074,14 @@ impl Debug for RefCell { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'b, T: Debug> Debug for Ref<'b, T> { +impl<'b, T: ?Sized + Debug> Debug for Ref<'b, T> { fn fmt(&self, f: &mut Formatter) -> Result { Debug::fmt(&**self, f) } } #[stable(feature = "rust1", since = "1.0.0")] -impl<'b, T: Debug> Debug for RefMut<'b, T> { +impl<'b, T: ?Sized + Debug> Debug for RefMut<'b, T> { fn fmt(&self, f: &mut Formatter) -> Result { Debug::fmt(&*(self.deref()), f) } -- cgit 1.4.1-3-g733a5