From c52281b376938163f91f351f84877346381cec82 Mon Sep 17 00:00:00 2001 From: Chris Morgan Date: Sat, 11 Jun 2016 10:46:30 +1000 Subject: [PATCH] Use raw pointers for downcasting, not TraitObject This mirrors a change in mopa. --- src/any.rs | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) 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) } }