Replace unnecessary uses of TraitObject with casts
This commit is contained in:
@@ -67,7 +67,6 @@ use core::mem;
|
|||||||
use core::ops::{CoerceUnsized, Deref, DerefMut};
|
use core::ops::{CoerceUnsized, Deref, DerefMut};
|
||||||
use core::ops::{BoxPlace, Boxed, InPlace, Place, Placer};
|
use core::ops::{BoxPlace, Boxed, InPlace, Place, Placer};
|
||||||
use core::ptr::{self, Unique};
|
use core::ptr::{self, Unique};
|
||||||
use core::raw::TraitObject;
|
|
||||||
use core::convert::From;
|
use core::convert::From;
|
||||||
|
|
||||||
/// A value that represents the heap. This is the default place that the `box`
|
/// A value that represents the heap. This is the default place that the `box`
|
||||||
@@ -428,12 +427,8 @@ impl Box<Any> {
|
|||||||
pub fn downcast<T: Any>(self) -> Result<Box<T>, Box<Any>> {
|
pub fn downcast<T: Any>(self) -> Result<Box<T>, Box<Any>> {
|
||||||
if self.is::<T>() {
|
if self.is::<T>() {
|
||||||
unsafe {
|
unsafe {
|
||||||
// Get the raw representation of the trait object
|
let raw: *mut Any = Box::into_raw(self);
|
||||||
let raw = Box::into_raw(self);
|
Ok(Box::from_raw(raw as *mut T))
|
||||||
let to: TraitObject = mem::transmute::<*mut Any, TraitObject>(raw);
|
|
||||||
|
|
||||||
// Extract the data pointer
|
|
||||||
Ok(Box::from_raw(to.data as *mut T))
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Err(self)
|
Err(self)
|
||||||
|
|||||||
@@ -91,7 +91,7 @@
|
|||||||
#![cfg_attr(stage0, feature(unsafe_no_drop_flag))]
|
#![cfg_attr(stage0, feature(unsafe_no_drop_flag))]
|
||||||
#![feature(unsize)]
|
#![feature(unsize)]
|
||||||
|
|
||||||
#![cfg_attr(not(test), feature(fused, raw, fn_traits, placement_new_protocol))]
|
#![cfg_attr(not(test), feature(fused, fn_traits, placement_new_protocol))]
|
||||||
#![cfg_attr(test, feature(test, box_heap))]
|
#![cfg_attr(test, feature(test, box_heap))]
|
||||||
|
|
||||||
// Allow testing this library
|
// Allow testing this library
|
||||||
|
|||||||
@@ -72,8 +72,6 @@
|
|||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
||||||
use fmt;
|
use fmt;
|
||||||
use mem::transmute;
|
|
||||||
use raw::TraitObject;
|
|
||||||
use intrinsics;
|
use intrinsics;
|
||||||
use marker::Reflect;
|
use marker::Reflect;
|
||||||
|
|
||||||
@@ -199,11 +197,7 @@ impl Any {
|
|||||||
pub fn downcast_ref<T: Any>(&self) -> Option<&T> {
|
pub fn downcast_ref<T: Any>(&self) -> Option<&T> {
|
||||||
if self.is::<T>() {
|
if self.is::<T>() {
|
||||||
unsafe {
|
unsafe {
|
||||||
// Get the raw representation of the trait object
|
Some(&*(self as *const Any as *const T))
|
||||||
let to: TraitObject = transmute(self);
|
|
||||||
|
|
||||||
// Extract the data pointer
|
|
||||||
Some(&*(to.data as *const T))
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@@ -240,11 +234,7 @@ impl Any {
|
|||||||
pub fn downcast_mut<T: Any>(&mut self) -> Option<&mut T> {
|
pub fn downcast_mut<T: Any>(&mut self) -> Option<&mut T> {
|
||||||
if self.is::<T>() {
|
if self.is::<T>() {
|
||||||
unsafe {
|
unsafe {
|
||||||
// Get the raw representation of the trait object
|
Some(&mut *(self as *mut Any as *mut T))
|
||||||
let to: TraitObject = transmute(self);
|
|
||||||
|
|
||||||
// Extract the data pointer
|
|
||||||
Some(&mut *(to.data as *const T as *mut T))
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ use fmt::{self, Debug, Display};
|
|||||||
use marker::Reflect;
|
use marker::Reflect;
|
||||||
use mem::transmute;
|
use mem::transmute;
|
||||||
use num;
|
use num;
|
||||||
use raw::TraitObject;
|
|
||||||
use str;
|
use str;
|
||||||
use string;
|
use string;
|
||||||
|
|
||||||
@@ -326,11 +325,7 @@ impl Error + 'static {
|
|||||||
pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T> {
|
pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T> {
|
||||||
if self.is::<T>() {
|
if self.is::<T>() {
|
||||||
unsafe {
|
unsafe {
|
||||||
// Get the raw representation of the trait object
|
Some(&*(self as *const Error as *const T))
|
||||||
let to: TraitObject = transmute(self);
|
|
||||||
|
|
||||||
// Extract the data pointer
|
|
||||||
Some(&*(to.data as *const T))
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@@ -344,11 +339,7 @@ impl Error + 'static {
|
|||||||
pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T> {
|
pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T> {
|
||||||
if self.is::<T>() {
|
if self.is::<T>() {
|
||||||
unsafe {
|
unsafe {
|
||||||
// Get the raw representation of the trait object
|
Some(&mut *(self as *mut Error as *mut T))
|
||||||
let to: TraitObject = transmute(self);
|
|
||||||
|
|
||||||
// Extract the data pointer
|
|
||||||
Some(&mut *(to.data as *const T as *mut T))
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@@ -409,13 +400,8 @@ impl Error {
|
|||||||
pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<Error>> {
|
pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<Error>> {
|
||||||
if self.is::<T>() {
|
if self.is::<T>() {
|
||||||
unsafe {
|
unsafe {
|
||||||
// Get the raw representation of the trait object
|
let raw: *mut Error = Box::into_raw(self);
|
||||||
let raw = Box::into_raw(self);
|
Ok(Box::from_raw(raw as *mut T))
|
||||||
let to: TraitObject =
|
|
||||||
transmute::<*mut Error, TraitObject>(raw);
|
|
||||||
|
|
||||||
// Extract the data pointer
|
|
||||||
Ok(Box::from_raw(to.data as *mut T))
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Err(self)
|
Err(self)
|
||||||
|
|||||||
Reference in New Issue
Block a user