From c5452b8ccec70a0c5de423455eab41478a7ff97a Mon Sep 17 00:00:00 2001 From: Florian Hartwig <florian.j.hartwig@gmail.com> Date: Sat, 9 May 2015 17:34:00 +0200 Subject: [PATCH] Don't transmute & to &mut --- src/alloc/mod.rs | 5 ++++- src/str/bytes.rs | 32 ++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/alloc/mod.rs b/src/alloc/mod.rs index 2d715bf..3d8f04d 100644 --- a/src/alloc/mod.rs +++ b/src/alloc/mod.rs @@ -64,7 +64,10 @@ impl MemRef { #[inline] pub fn bytes_mut(&mut self) -> &mut [u8] { - unsafe { mem::transmute(self.bytes()) } + use std::slice; + unsafe { + slice::from_raw_parts_mut(self.ptr(), self.mem().len) + } } #[inline] diff --git a/src/str/bytes.rs b/src/str/bytes.rs index a994a69..178199a 100644 --- a/src/str/bytes.rs +++ b/src/str/bytes.rs @@ -97,24 +97,28 @@ impl Bytes { fn obj(&self) -> &ByteStrPriv { unsafe { - let obj = if self.is_inline() { - TraitObject { - data: mem::transmute(&self.data), - vtable: mem::transmute(self.vtable - 1), - } - } else { - TraitObject { - data: self.data, - vtable: mem::transmute(self.vtable), - } - }; - - mem::transmute(obj) + mem::transmute(self.to_trait_object()) } } fn obj_mut(&mut self) -> &mut ByteStrPriv { - unsafe { mem::transmute(self.obj()) } + unsafe { + mem::transmute(self.to_trait_object()) + } + } + + unsafe fn to_trait_object(&self) -> TraitObject { + if self.is_inline() { + TraitObject { + data: mem::transmute(&self.data), + vtable: mem::transmute(self.vtable - 1), + } + } else { + TraitObject { + data: self.data, + vtable: mem::transmute(self.vtable), + } + } } fn is_inline(&self) -> bool { -- GitLab