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 {