diff --git a/src/alloc/mod.rs b/src/alloc/mod.rs index 2d715bfe7d003508270fcf8bb506296f18532df7..3d8f04d3d29d1802b810020b3a63b1d6e3841913 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 a994a6973479bd8d36d84e756cfd3f494bd420ac..178199a5c8b964a498901640475304160b7f6f51 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 {