Don't transmute & to &mut

This commit is contained in:
Florian Hartwig
2015-05-09 17:34:00 +02:00
parent a91ee81bda
commit c5452b8cce
2 changed files with 22 additions and 15 deletions
+4 -1
View File
@@ -64,7 +64,10 @@ impl MemRef {
#[inline] #[inline]
pub fn bytes_mut(&mut self) -> &mut [u8] { 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] #[inline]
+18 -14
View File
@@ -97,24 +97,28 @@ impl Bytes {
fn obj(&self) -> &ByteStrPriv { fn obj(&self) -> &ByteStrPriv {
unsafe { unsafe {
let obj = if self.is_inline() { mem::transmute(self.to_trait_object())
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)
} }
} }
fn obj_mut(&mut self) -> &mut ByteStrPriv { 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 { fn is_inline(&self) -> bool {