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