Skip to content

Commit b25c520

Browse files
committed
make transmute_copy use memcpy, and inline it
1 parent 58d6864 commit b25c520

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

src/libstd/cast.rs

+21
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use sys;
1414
use unstable::intrinsics;
1515

1616
/// Casts the value at `src` to U. The two types must have the same length.
17+
#[cfg(stage0)]
1718
pub unsafe fn transmute_copy<T, U>(src: &T) -> U {
1819
let mut dest: U = intrinsics::uninit();
1920
{
@@ -26,6 +27,26 @@ pub unsafe fn transmute_copy<T, U>(src: &T) -> U {
2627
dest
2728
}
2829

30+
#[cfg(target_word_size = "32", not(stage0))]
31+
#[inline(always)]
32+
pub unsafe fn transmute_copy<T, U>(src: &T) -> U {
33+
let mut dest: U = intrinsics::uninit();
34+
let dest_ptr: *mut u8 = transmute(&mut dest);
35+
let src_ptr: *u8 = transmute(src);
36+
intrinsics::memcpy32(dest_ptr, src_ptr, sys::size_of::<U>() as u64);
37+
dest
38+
}
39+
40+
#[cfg(target_word_size = "64", not(stage0))]
41+
#[inline(always)]
42+
pub unsafe fn transmute_copy<T, U>(src: &T) -> U {
43+
let mut dest: U = intrinsics::uninit();
44+
let dest_ptr: *mut u8 = transmute(&mut dest);
45+
let src_ptr: *u8 = transmute(src);
46+
intrinsics::memcpy64(dest_ptr, src_ptr, sys::size_of::<U>() as u64);
47+
dest
48+
}
49+
2950
/**
3051
* Move a thing into the void
3152
*

0 commit comments

Comments
 (0)