From: Chris Morgan Date: Sat, 11 Jun 2016 00:46:30 +0000 (+1000) Subject: Use raw pointers for downcasting, not TraitObject X-Git-Tag: 0.12.1~4 X-Git-Url: https://git.chrismorgan.info/anymap/commitdiff_plain/c52281b376938163f91f351f84877346381cec82 Use raw pointers for downcasting, not TraitObject This mirrors a change in mopa. --- diff --git a/src/any.rs b/src/any.rs index 87028fb..4120e6a 100644 --- a/src/any.rs +++ b/src/any.rs @@ -3,7 +3,6 @@ //! This stuff is all based on `std::any`, but goes a little further, with `CloneAny` being a //! cloneable `Any` and with the `Send` and `Sync` bounds possible on both `Any` and `CloneAny`. -use std::mem; use std::fmt; use std::any::Any as StdAny; @@ -88,17 +87,6 @@ macro_rules! impl_clone { } } -#[cfg(feature = "unstable")] -use std::raw::TraitObject; - -#[cfg(not(feature = "unstable"))] -#[repr(C)] -#[derive(Copy, Clone)] -struct TraitObject { - pub data: *mut (), - pub vtable: *mut (), -} - #[allow(missing_docs)] // Bogus warning (it’s not public outside the crate), ☹ pub trait UncheckedAnyExt: Any { unsafe fn downcast_ref_unchecked(&self) -> &T; @@ -123,15 +111,15 @@ macro_rules! implement { impl UncheckedAnyExt for $base $(+ $bounds)* { unsafe fn downcast_ref_unchecked(&self) -> &T { - mem::transmute(mem::transmute::<_, TraitObject>(self).data) + &*(self as *const Self as *const T) } unsafe fn downcast_mut_unchecked(&mut self) -> &mut T { - mem::transmute(mem::transmute::<_, TraitObject>(self).data) + &mut *(self as *mut Self as *mut T) } unsafe fn downcast_unchecked(self: Box) -> Box { - mem::transmute(mem::transmute::<_, TraitObject>(self).data) + Box::from_raw(Box::into_raw(self) as *mut T) } }